pronounce as wrap(ræp)
- Glue - Platform-specific code to implement sockets
- Socket - Way for sending and receiving data between the two platforms
- Channel - An interface that allows information to be exchanged in units of messages using sockets.
- Guest - An interface that can send requests to hosts using channels.
- Host - An interface that allows you to process and respond to requests received from guests.
Whenever the channel sends a message, it writes the message size as a 4-byte little-endian integer to the socket, and then writes a message payload as that size.
The message payload is defined in the ./src/wrp.proto file.
sequenceDiagram
participant H as WrpHost
participant G as WrpGuest
H->>G: HostInitialize
Note over H, G: Send available methods
loop
G->>+H: GuestReqStart
H-->>G: HostResStart
par request
loop
G-->>H: GuestReqPayload
end
G-->>H: GuestReqFinish
end
par response
loop
H-->>G: HostResPayload
end
H-->>-G: HostResFinish
end
end
// Glue implementation provides socket object. type Socket = Reader & Writer; interface Reader { read(p: Uint8Array): Promise<number | null>; } interface Writer { write(p: Uint8Array): Promise<number>; } // Channel provides a per-message communication method. interface WrpChannel { listen(): AsyncGenerator<WrpMessage>; send(message: WrpMessage): Promise<void>; } type Metadata = Record<string, string>; interface LazyMetadata { [key: string]: | undefined | string | Promise<string | undefined> | (() => string | undefined) | (() => Promise<string | undefined>); } // Guest provides a way to send requests to the host. interface WrpGuest { availableMethods: Set<string>; request( methodName: string, req: AsyncGenerator<Uint8Array>, metadata?: LazyMetadata, ): { res: AsyncGenerator<Uint8Array>; header: Promise<Metadata>; trailer: Promise<Metadata>; }; } // Host provides a way to handle and respond to requests from guests. interface WrpHost { listen(): AsyncGenerator<WrpRequest>; } interface WrpRequest { methodName: string; metadata: Metadata; req: AsyncGenerator<Uint8Array>; sendHeader(value: Metadata): void; sendPayload(value: Uint8Array): void; sendTrailer(value: Metadata): void; }