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