@sideband/secure-relay 0.2.1 → 0.2.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (46) hide show
  1. package/README.md +27 -8
  2. package/dist/.tsbuildinfo +1 -0
  3. package/dist/constants.d.ts +49 -0
  4. package/dist/constants.d.ts.map +1 -0
  5. package/dist/constants.js +51 -0
  6. package/dist/constants.js.map +1 -0
  7. package/dist/crypto.d.ts +70 -0
  8. package/dist/crypto.d.ts.map +1 -0
  9. package/dist/crypto.js +144 -0
  10. package/dist/crypto.js.map +1 -0
  11. package/dist/frame.d.ts +213 -0
  12. package/dist/frame.d.ts.map +1 -0
  13. package/dist/frame.js +547 -0
  14. package/dist/frame.js.map +1 -0
  15. package/dist/handshake.d.ts +39 -0
  16. package/dist/handshake.d.ts.map +1 -0
  17. package/dist/handshake.js +93 -0
  18. package/dist/handshake.js.map +1 -0
  19. package/dist/index.d.ts +46 -0
  20. package/dist/index.d.ts.map +1 -0
  21. package/dist/index.js +12 -0
  22. package/dist/index.js.map +1 -0
  23. package/dist/replay.d.ts +32 -0
  24. package/dist/replay.d.ts.map +1 -0
  25. package/dist/replay.js +88 -0
  26. package/dist/replay.js.map +1 -0
  27. package/dist/session.d.ts +67 -0
  28. package/dist/session.d.ts.map +1 -0
  29. package/dist/session.js +122 -0
  30. package/dist/session.js.map +1 -0
  31. package/dist/types.d.ts +119 -0
  32. package/dist/types.d.ts.map +1 -0
  33. package/dist/types.js +80 -0
  34. package/dist/types.js.map +1 -0
  35. package/package.json +4 -4
  36. package/src/constants.ts +3 -3
  37. package/src/crypto.test.ts +5 -5
  38. package/src/crypto.ts +9 -9
  39. package/src/frame.test.ts +59 -10
  40. package/src/frame.ts +101 -77
  41. package/src/handshake.test.ts +29 -41
  42. package/src/handshake.ts +25 -27
  43. package/src/index.ts +4 -10
  44. package/src/integration.test.ts +97 -138
  45. package/src/session.test.ts +12 -10
  46. package/src/types.ts +1 -12
@@ -0,0 +1 @@
1
+ {"version":3,"file":"crypto.js","sourceRoot":"","sources":["../src/crypto.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,213 @@
1
+ import type { EncryptedMessage, HandshakeAccept, HandshakeInit, SessionId } from "./types.js";
2
+ import { SbrpErrorCode, SignalCode, SignalReason } from "./types.js";
3
+ /**
4
+ * Frame type discriminant (wire byte).
5
+ *
6
+ * Frame types are organized by authority:
7
+ * - Endpoint frames (0x01-0x03): Forwarded by relay, E2EE
8
+ * - Signal frame (0x04): Daemon → Relay only
9
+ * - Keepalive frames (0x10-0x11): Connection-scoped, never forwarded
10
+ * - Control frame (0x20): Relay → Endpoint only
11
+ */
12
+ export declare const FrameType: {
13
+ readonly HandshakeInit: 1;
14
+ readonly HandshakeAccept: 2;
15
+ readonly Data: 3;
16
+ readonly Signal: 4;
17
+ readonly Ping: 16;
18
+ readonly Pong: 17;
19
+ readonly Control: 32;
20
+ };
21
+ export type FrameType = (typeof FrameType)[keyof typeof FrameType];
22
+ /**
23
+ * Wire control codes (uint16, §14).
24
+ *
25
+ * Codes use ranges for categorization:
26
+ * - 0x01xx: Authentication (terminal)
27
+ * - 0x02xx: Routing (varies)
28
+ * - 0x03xx: Session (terminal)
29
+ * - 0x04xx: Wire format (terminal)
30
+ * - 0x09xx: Rate limiting (non-terminal)
31
+ * - 0x10xx: Session state (non-terminal)
32
+ */
33
+ export declare const WireControlCode: {
34
+ readonly Unauthorized: 257;
35
+ readonly Forbidden: 258;
36
+ readonly DaemonNotFound: 513;
37
+ readonly DaemonOffline: 514;
38
+ readonly SessionNotFound: 769;
39
+ readonly SessionExpired: 770;
40
+ readonly MalformedFrame: 1025;
41
+ readonly PayloadTooLarge: 1026;
42
+ readonly InvalidFrameType: 1027;
43
+ readonly InvalidSessionId: 1028;
44
+ readonly DisallowedSender: 1029;
45
+ readonly InternalError: 1537;
46
+ readonly RateLimited: 2305;
47
+ readonly SessionPaused: 4097;
48
+ readonly SessionResumed: 4098;
49
+ readonly SessionEnded: 4099;
50
+ readonly SessionPending: 4100;
51
+ };
52
+ export type WireControlCode = (typeof WireControlCode)[keyof typeof WireControlCode];
53
+ /** Check if a control code is terminal (closes connection) */
54
+ export declare function isTerminalCode(code: WireControlCode): boolean;
55
+ /** Decoded frame header */
56
+ export interface FrameHeader {
57
+ type: FrameType;
58
+ length: number;
59
+ sessionId: SessionId;
60
+ }
61
+ /** Decoded frame (header + payload) */
62
+ export interface Frame extends FrameHeader {
63
+ payload: Uint8Array;
64
+ }
65
+ /** Decoded Control frame payload */
66
+ export interface ControlPayload {
67
+ code: WireControlCode;
68
+ message: string;
69
+ }
70
+ /** Decoded Signal frame payload */
71
+ export interface SignalPayload {
72
+ signal: SignalCode;
73
+ reason: SignalReason;
74
+ }
75
+ /** Convert SbrpErrorCode to wire format (for relay-transmittable codes only) */
76
+ export declare function toWireControlCode(code: SbrpErrorCode): WireControlCode;
77
+ /** Convert wire control code to SbrpErrorCode */
78
+ export declare function fromWireControlCode(code: WireControlCode): SbrpErrorCode;
79
+ /**
80
+ * Encode a frame to binary wire format.
81
+ *
82
+ * @throws {SbrpError} if payload exceeds MAX_PAYLOAD_SIZE or sessionId is invalid
83
+ */
84
+ export declare function encodeFrame(type: FrameType, sessionId: SessionId, payload: Uint8Array): Uint8Array;
85
+ /**
86
+ * Read frame header without decoding payload.
87
+ * Useful for routing decisions before full decode.
88
+ *
89
+ * Validates wire format constraints including non-zero sessionId
90
+ * for session-bound frames (§13.2).
91
+ *
92
+ * @throws {SbrpError} if buffer is too short, length exceeds max, or sessionId invalid
93
+ */
94
+ export declare function readFrameHeader(data: Uint8Array): FrameHeader;
95
+ /**
96
+ * Decode a complete frame from binary data.
97
+ *
98
+ * Rejects trailing bytes to catch framing mistakes. Use `FrameDecoder`
99
+ * for streaming scenarios with multiple frames per buffer.
100
+ *
101
+ * @throws {SbrpError} if frame is malformed or has trailing bytes
102
+ */
103
+ export declare function decodeFrame(data: Uint8Array): Frame;
104
+ /**
105
+ * Encode HandshakeInit to wire frame.
106
+ *
107
+ * @throws {SbrpError} if initPublicKey is not exactly 32 bytes or sessionId is invalid
108
+ */
109
+ export declare function encodeHandshakeInit(sessionId: SessionId, init: HandshakeInit): Uint8Array;
110
+ /**
111
+ * Encode HandshakeAccept to wire frame.
112
+ *
113
+ * Wire layout (128 bytes): identityPublicKey(32) + acceptPublicKey(32) + signature(64)
114
+ *
115
+ * @throws {SbrpError} if field sizes are wrong or sessionId is invalid
116
+ */
117
+ export declare function encodeHandshakeAccept(sessionId: SessionId, accept: HandshakeAccept): Uint8Array;
118
+ /**
119
+ * Encode Data frame (encrypted message).
120
+ *
121
+ * @throws {SbrpError} if data is too short (< nonce + authTag) or sessionId is invalid
122
+ */
123
+ export declare function encodeData(sessionId: SessionId, message: EncryptedMessage): Uint8Array;
124
+ /**
125
+ * Encode Signal frame (daemon → relay).
126
+ *
127
+ * @param sessionId Session being signaled
128
+ * @param signal Signal code (ready or close)
129
+ * @param reason Reason code (for close signal)
130
+ */
131
+ export declare function encodeSignal(sessionId: SessionId, signal: SignalCode, reason?: SignalReason): Uint8Array;
132
+ /**
133
+ * Encode Ping frame (connection-scoped keepalive).
134
+ *
135
+ * @param payload Optional 0-8 byte payload for RTT measurement
136
+ */
137
+ export declare function encodePing(payload?: Uint8Array): Uint8Array;
138
+ /**
139
+ * Encode Pong frame (connection-scoped keepalive response).
140
+ *
141
+ * @param payload Payload from corresponding Ping (must be copied)
142
+ */
143
+ export declare function encodePong(payload?: Uint8Array): Uint8Array;
144
+ /**
145
+ * Encode Control frame (relay → endpoint).
146
+ *
147
+ * @param sessionId Session ID (non-zero for session events, 0 for connection errors)
148
+ * @param code Control code from WireControlCode
149
+ * @param message Optional diagnostic message (for errors only)
150
+ */
151
+ export declare function encodeControl(sessionId: SessionId, code: WireControlCode, message?: string): Uint8Array;
152
+ /**
153
+ * Decode HandshakeInit from frame.
154
+ *
155
+ * @throws {SbrpError} if frame type or payload size is invalid
156
+ */
157
+ export declare function decodeHandshakeInit(frame: Frame): HandshakeInit;
158
+ /**
159
+ * Decode HandshakeAccept from frame.
160
+ *
161
+ * Wire layout (128 bytes): identityPublicKey(32) + acceptPublicKey(32) + signature(64)
162
+ *
163
+ * @throws {SbrpError} if frame type or payload size is invalid
164
+ */
165
+ export declare function decodeHandshakeAccept(frame: Frame): HandshakeAccept;
166
+ /**
167
+ * Decode Data frame (encrypted message).
168
+ *
169
+ * @throws {SbrpError} if frame type or payload is invalid
170
+ */
171
+ export declare function decodeData(frame: Frame): EncryptedMessage;
172
+ /**
173
+ * Decode Signal frame (daemon → relay).
174
+ *
175
+ * @throws {SbrpError} if frame type, payload size, or signal values are invalid
176
+ */
177
+ export declare function decodeSignal(frame: Frame): SignalPayload;
178
+ /**
179
+ * Decode Control frame (relay → endpoint).
180
+ *
181
+ * Invalid UTF-8 sequences in message are replaced with U+FFFD.
182
+ *
183
+ * @throws {SbrpError} if frame type or payload is invalid
184
+ */
185
+ export declare function decodeControl(frame: Frame): ControlPayload;
186
+ /**
187
+ * Streaming frame decoder for incremental parsing.
188
+ *
189
+ * Accumulates bytes and yields complete frames. Useful when frames
190
+ * may be fragmented across WebSocket messages or TCP reads.
191
+ *
192
+ * @example
193
+ * ```typescript
194
+ * const decoder = new FrameDecoder();
195
+ * ws.on("message", (data) => {
196
+ * for (const frame of decoder.push(data)) {
197
+ * handleFrame(frame);
198
+ * }
199
+ * });
200
+ * ```
201
+ */
202
+ export declare class FrameDecoder {
203
+ private buffer;
204
+ /**
205
+ * Push data and yield any complete frames.
206
+ */
207
+ push(data: Uint8Array): Generator<Frame>;
208
+ /** Reset decoder state, discarding any buffered data */
209
+ reset(): void;
210
+ /** Number of bytes currently buffered */
211
+ get bufferedBytes(): number;
212
+ }
213
+ //# sourceMappingURL=frame.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"frame.d.ts","sourceRoot":"","sources":["../src/frame.ts"],"names":[],"mappings":"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"}