xref: /aosp_15_r20/external/pigweed/pw_rpc/ts/packets.ts (revision 61c4878ac05f98d0ceed94b57d316916de578985)
1*61c4878aSAndroid Build Coastguard Worker// Copyright 2022 The Pigweed Authors
2*61c4878aSAndroid Build Coastguard Worker//
3*61c4878aSAndroid Build Coastguard Worker// Licensed under the Apache License, Version 2.0 (the "License"); you may not
4*61c4878aSAndroid Build Coastguard Worker// use this file except in compliance with the License. You may obtain a copy of
5*61c4878aSAndroid Build Coastguard Worker// the License at
6*61c4878aSAndroid Build Coastguard Worker//
7*61c4878aSAndroid Build Coastguard Worker//     https://www.apache.org/licenses/LICENSE-2.0
8*61c4878aSAndroid Build Coastguard Worker//
9*61c4878aSAndroid Build Coastguard Worker// Unless required by applicable law or agreed to in writing, software
10*61c4878aSAndroid Build Coastguard Worker// distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
11*61c4878aSAndroid Build Coastguard Worker// WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
12*61c4878aSAndroid Build Coastguard Worker// License for the specific language governing permissions and limitations under
13*61c4878aSAndroid Build Coastguard Worker// the License.
14*61c4878aSAndroid Build Coastguard Worker
15*61c4878aSAndroid Build Coastguard Worker/** Functions for working with pw_rpc packets. */
16*61c4878aSAndroid Build Coastguard Worker
17*61c4878aSAndroid Build Coastguard Workerimport { Message } from 'google-protobuf';
18*61c4878aSAndroid Build Coastguard Workerimport {
19*61c4878aSAndroid Build Coastguard Worker  RpcPacket,
20*61c4878aSAndroid Build Coastguard Worker  PacketType,
21*61c4878aSAndroid Build Coastguard Worker} from 'pigweedjs/protos/pw_rpc/internal/packet_pb';
22*61c4878aSAndroid Build Coastguard Workerimport { Status } from 'pigweedjs/pw_status';
23*61c4878aSAndroid Build Coastguard Workerimport { MessageSerializer } from './descriptors';
24*61c4878aSAndroid Build Coastguard Worker
25*61c4878aSAndroid Build Coastguard Worker// Channel, Service, Method, CallId
26*61c4878aSAndroid Build Coastguard Workertype idSet = [number, number, number, number];
27*61c4878aSAndroid Build Coastguard Worker
28*61c4878aSAndroid Build Coastguard Workerexport function decode(data: Uint8Array): RpcPacket {
29*61c4878aSAndroid Build Coastguard Worker  return RpcPacket.deserializeBinary(data);
30*61c4878aSAndroid Build Coastguard Worker}
31*61c4878aSAndroid Build Coastguard Worker
32*61c4878aSAndroid Build Coastguard Workerfunction serializeMessage(
33*61c4878aSAndroid Build Coastguard Worker  message?: Message,
34*61c4878aSAndroid Build Coastguard Worker  serializers?: MessageSerializer,
35*61c4878aSAndroid Build Coastguard Worker): Uint8Array {
36*61c4878aSAndroid Build Coastguard Worker  let payload: Uint8Array;
37*61c4878aSAndroid Build Coastguard Worker  if (typeof message !== 'undefined') {
38*61c4878aSAndroid Build Coastguard Worker    if (serializers) {
39*61c4878aSAndroid Build Coastguard Worker      payload = serializers.serialize(message);
40*61c4878aSAndroid Build Coastguard Worker    } else {
41*61c4878aSAndroid Build Coastguard Worker      payload = (message as any)['serializeBinary']();
42*61c4878aSAndroid Build Coastguard Worker    }
43*61c4878aSAndroid Build Coastguard Worker  } else {
44*61c4878aSAndroid Build Coastguard Worker    payload = new Uint8Array(0);
45*61c4878aSAndroid Build Coastguard Worker  }
46*61c4878aSAndroid Build Coastguard Worker  return payload;
47*61c4878aSAndroid Build Coastguard Worker}
48*61c4878aSAndroid Build Coastguard Worker
49*61c4878aSAndroid Build Coastguard Workerexport function decodePayload(
50*61c4878aSAndroid Build Coastguard Worker  payload: Uint8Array,
51*61c4878aSAndroid Build Coastguard Worker  payloadType: any,
52*61c4878aSAndroid Build Coastguard Worker  serializer?: MessageSerializer,
53*61c4878aSAndroid Build Coastguard Worker): any {
54*61c4878aSAndroid Build Coastguard Worker  if (serializer) {
55*61c4878aSAndroid Build Coastguard Worker    return serializer.deserialize(payload);
56*61c4878aSAndroid Build Coastguard Worker  }
57*61c4878aSAndroid Build Coastguard Worker  return payloadType['deserializeBinary'](payload);
58*61c4878aSAndroid Build Coastguard Worker}
59*61c4878aSAndroid Build Coastguard Worker
60*61c4878aSAndroid Build Coastguard Workerexport function forServer(packet: RpcPacket): boolean {
61*61c4878aSAndroid Build Coastguard Worker  return packet.getType() % 2 == 0;
62*61c4878aSAndroid Build Coastguard Worker}
63*61c4878aSAndroid Build Coastguard Worker
64*61c4878aSAndroid Build Coastguard Workerexport function encodeClientError(
65*61c4878aSAndroid Build Coastguard Worker  packet: RpcPacket,
66*61c4878aSAndroid Build Coastguard Worker  status: Status,
67*61c4878aSAndroid Build Coastguard Worker): Uint8Array {
68*61c4878aSAndroid Build Coastguard Worker  const errorPacket = new RpcPacket();
69*61c4878aSAndroid Build Coastguard Worker  errorPacket.setType(PacketType.CLIENT_ERROR);
70*61c4878aSAndroid Build Coastguard Worker  errorPacket.setChannelId(packet.getChannelId());
71*61c4878aSAndroid Build Coastguard Worker  errorPacket.setMethodId(packet.getMethodId());
72*61c4878aSAndroid Build Coastguard Worker  errorPacket.setServiceId(packet.getServiceId());
73*61c4878aSAndroid Build Coastguard Worker  errorPacket.setCallId(packet.getCallId());
74*61c4878aSAndroid Build Coastguard Worker  errorPacket.setStatus(status);
75*61c4878aSAndroid Build Coastguard Worker  return errorPacket.serializeBinary();
76*61c4878aSAndroid Build Coastguard Worker}
77*61c4878aSAndroid Build Coastguard Worker
78*61c4878aSAndroid Build Coastguard Workerexport function encodeClientStream(
79*61c4878aSAndroid Build Coastguard Worker  ids: idSet,
80*61c4878aSAndroid Build Coastguard Worker  message: Message,
81*61c4878aSAndroid Build Coastguard Worker  customSerializer?: MessageSerializer,
82*61c4878aSAndroid Build Coastguard Worker): Uint8Array {
83*61c4878aSAndroid Build Coastguard Worker  const streamPacket = new RpcPacket();
84*61c4878aSAndroid Build Coastguard Worker  streamPacket.setType(PacketType.CLIENT_STREAM);
85*61c4878aSAndroid Build Coastguard Worker  streamPacket.setChannelId(ids[0]);
86*61c4878aSAndroid Build Coastguard Worker  streamPacket.setServiceId(ids[1]);
87*61c4878aSAndroid Build Coastguard Worker  streamPacket.setMethodId(ids[2]);
88*61c4878aSAndroid Build Coastguard Worker  streamPacket.setCallId(ids[3]);
89*61c4878aSAndroid Build Coastguard Worker  const msgSerialized = serializeMessage(message, customSerializer);
90*61c4878aSAndroid Build Coastguard Worker  streamPacket.setPayload(msgSerialized);
91*61c4878aSAndroid Build Coastguard Worker  return streamPacket.serializeBinary();
92*61c4878aSAndroid Build Coastguard Worker}
93*61c4878aSAndroid Build Coastguard Worker
94*61c4878aSAndroid Build Coastguard Workerexport function encodeClientStreamEnd(ids: idSet): Uint8Array {
95*61c4878aSAndroid Build Coastguard Worker  const streamEnd = new RpcPacket();
96*61c4878aSAndroid Build Coastguard Worker  streamEnd.setType(PacketType.CLIENT_REQUEST_COMPLETION);
97*61c4878aSAndroid Build Coastguard Worker  streamEnd.setChannelId(ids[0]);
98*61c4878aSAndroid Build Coastguard Worker  streamEnd.setServiceId(ids[1]);
99*61c4878aSAndroid Build Coastguard Worker  streamEnd.setMethodId(ids[2]);
100*61c4878aSAndroid Build Coastguard Worker  streamEnd.setCallId(ids[3]);
101*61c4878aSAndroid Build Coastguard Worker  return streamEnd.serializeBinary();
102*61c4878aSAndroid Build Coastguard Worker}
103*61c4878aSAndroid Build Coastguard Worker
104*61c4878aSAndroid Build Coastguard Workerexport function encodeRequest(
105*61c4878aSAndroid Build Coastguard Worker  ids: idSet,
106*61c4878aSAndroid Build Coastguard Worker  request?: Message,
107*61c4878aSAndroid Build Coastguard Worker  customSerializer?: MessageSerializer,
108*61c4878aSAndroid Build Coastguard Worker): Uint8Array {
109*61c4878aSAndroid Build Coastguard Worker  const payload = serializeMessage(request, customSerializer);
110*61c4878aSAndroid Build Coastguard Worker  const packet = new RpcPacket();
111*61c4878aSAndroid Build Coastguard Worker  packet.setType(PacketType.REQUEST);
112*61c4878aSAndroid Build Coastguard Worker  packet.setChannelId(ids[0]);
113*61c4878aSAndroid Build Coastguard Worker  packet.setServiceId(ids[1]);
114*61c4878aSAndroid Build Coastguard Worker  packet.setMethodId(ids[2]);
115*61c4878aSAndroid Build Coastguard Worker  packet.setCallId(ids[3]);
116*61c4878aSAndroid Build Coastguard Worker  packet.setPayload(payload);
117*61c4878aSAndroid Build Coastguard Worker  return packet.serializeBinary();
118*61c4878aSAndroid Build Coastguard Worker}
119*61c4878aSAndroid Build Coastguard Worker
120*61c4878aSAndroid Build Coastguard Workerexport function encodeResponse(ids: idSet, response: Message): Uint8Array {
121*61c4878aSAndroid Build Coastguard Worker  const packet = new RpcPacket();
122*61c4878aSAndroid Build Coastguard Worker  packet.setType(PacketType.RESPONSE);
123*61c4878aSAndroid Build Coastguard Worker  packet.setChannelId(ids[0]);
124*61c4878aSAndroid Build Coastguard Worker  packet.setServiceId(ids[1]);
125*61c4878aSAndroid Build Coastguard Worker  packet.setMethodId(ids[2]);
126*61c4878aSAndroid Build Coastguard Worker  packet.setCallId(ids[3]);
127*61c4878aSAndroid Build Coastguard Worker  const msgSerialized = (response as any)['serializeBinary']();
128*61c4878aSAndroid Build Coastguard Worker  packet.setPayload(msgSerialized);
129*61c4878aSAndroid Build Coastguard Worker  return packet.serializeBinary();
130*61c4878aSAndroid Build Coastguard Worker}
131*61c4878aSAndroid Build Coastguard Worker
132*61c4878aSAndroid Build Coastguard Workerexport function encodeCancel(ids: idSet): Uint8Array {
133*61c4878aSAndroid Build Coastguard Worker  const packet = new RpcPacket();
134*61c4878aSAndroid Build Coastguard Worker  packet.setType(PacketType.CLIENT_ERROR);
135*61c4878aSAndroid Build Coastguard Worker  packet.setStatus(Status.CANCELLED);
136*61c4878aSAndroid Build Coastguard Worker  packet.setChannelId(ids[0]);
137*61c4878aSAndroid Build Coastguard Worker  packet.setServiceId(ids[1]);
138*61c4878aSAndroid Build Coastguard Worker  packet.setMethodId(ids[2]);
139*61c4878aSAndroid Build Coastguard Worker  packet.setCallId(ids[3]);
140*61c4878aSAndroid Build Coastguard Worker  return packet.serializeBinary();
141*61c4878aSAndroid Build Coastguard Worker}
142