dropspace 0.1.0 → 0.1.1

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.
@@ -1,5 +1,6 @@
1
1
  import { ProtocolValidationError } from "./envelope.js";
2
2
  export const WIRE_MAGIC_BYTE = 0xd5;
3
+ export const WIRE_PREFIX_BYTES = 6;
3
4
  export var WireFrameType;
4
5
  (function (WireFrameType) {
5
6
  WireFrameType[WireFrameType["CONTROL_JSON"] = 1] = "CONTROL_JSON";
@@ -11,9 +12,36 @@ export var WireFrameType;
11
12
  WireFrameType[WireFrameType["HUB_RELAY"] = 7] = "HUB_RELAY";
12
13
  })(WireFrameType || (WireFrameType = {}));
13
14
  const textEncoder = new TextEncoder();
14
- const textDecoder = new TextDecoder();
15
+ const textDecoder = new TextDecoder("utf-8", { fatal: true });
15
16
  export const MAX_HEADER_BYTES = 16 * 1024; // 16 KiB header limit
16
- export const DEFAULT_MAX_FRAME_PAYLOAD_BYTES = 64 * 1024; // 64 KiB safe WebRTC DataChannel chunk size
17
+ export const DEFAULT_MAX_TOTAL_FRAME_BYTES = 64 * 1024; // 64 KiB safe WebRTC SCTP baseline
18
+ export const DEFAULT_MAX_FRAME_PAYLOAD_BYTES = 48 * 1024; // 48 KiB payload leaves room for prefix + header within 64 KiB
19
+ export const MAX_DECODE_FRAME_BYTES = 256 * 1024; // 256 KiB max incoming frame guard
20
+ function validateFrameTypeSpecificHeader(frameType, header) {
21
+ if (typeof header.timestamp !== "number" || !Number.isFinite(header.timestamp)) {
22
+ throw new ProtocolValidationError("Wire frame header requires finite numeric timestamp", "header.timestamp");
23
+ }
24
+ if (frameType === WireFrameType.TRANSFER_CHUNK) {
25
+ if (!header.transferId || typeof header.transferId !== "string") {
26
+ throw new ProtocolValidationError("TRANSFER_CHUNK frame requires header.transferId", "header.transferId");
27
+ }
28
+ if (typeof header.byteOffset !== "number" ||
29
+ !Number.isFinite(header.byteOffset) ||
30
+ header.byteOffset < 0) {
31
+ throw new ProtocolValidationError("TRANSFER_CHUNK frame requires non-negative header.byteOffset", "header.byteOffset");
32
+ }
33
+ }
34
+ else if (frameType === WireFrameType.CRDT_SYNC) {
35
+ if (!header.documentId || typeof header.documentId !== "string") {
36
+ throw new ProtocolValidationError("CRDT_SYNC frame requires header.documentId", "header.documentId");
37
+ }
38
+ }
39
+ else if (frameType === WireFrameType.HUB_RELAY) {
40
+ if (!header.targetDeviceId || typeof header.targetDeviceId !== "string") {
41
+ throw new ProtocolValidationError("HUB_RELAY frame requires header.targetDeviceId", "header.targetDeviceId");
42
+ }
43
+ }
44
+ }
17
45
  /**
18
46
  * Binary frame layout:
19
47
  * Byte 0: WIRE_MAGIC_BYTE (0xD5)
@@ -21,34 +49,48 @@ export const DEFAULT_MAX_FRAME_PAYLOAD_BYTES = 64 * 1024; // 64 KiB safe WebRTC
21
49
  * Bytes 2..5: Header byte length (uint32 big-endian)
22
50
  * Bytes 6..(6 + headerLen - 1): UTF-8 JSON encoded WireFrameHeader
23
51
  * Remaining bytes: Raw binary payload (Uint8Array)
52
+ *
53
+ * totalFrameBytes = WIRE_PREFIX_BYTES (6) + encodedHeaderBytes + payloadBytes
24
54
  */
25
- export function encodeWireFrame(frameType, header, payload = new Uint8Array(0)) {
55
+ export function encodeWireFrame(frameType, header, payload = new Uint8Array(0), options) {
56
+ if (frameType < WireFrameType.CONTROL_JSON || frameType > WireFrameType.HUB_RELAY) {
57
+ throw new ProtocolValidationError(`Unknown wire frame type: 0x${Number(frameType).toString(16)}`, "frameType");
58
+ }
26
59
  if (!header.messageId || typeof header.messageId !== "string") {
27
60
  throw new ProtocolValidationError("WireFrameHeader requires messageId", "header.messageId");
28
61
  }
29
62
  if (!header.channel || typeof header.channel !== "string") {
30
63
  throw new ProtocolValidationError("WireFrameHeader requires channel", "header.channel");
31
64
  }
65
+ validateFrameTypeSpecificHeader(frameType, header);
32
66
  const headerBytes = textEncoder.encode(JSON.stringify(header));
33
67
  if (headerBytes.byteLength > MAX_HEADER_BYTES) {
34
68
  throw new ProtocolValidationError(`WireFrameHeader exceeds ${MAX_HEADER_BYTES} bytes`, "header", "MESSAGE_TOO_LARGE");
35
69
  }
36
- const totalLength = 6 + headerBytes.byteLength + payload.byteLength;
70
+ const totalLength = WIRE_PREFIX_BYTES + headerBytes.byteLength + payload.byteLength;
71
+ const maxTotal = options?.maxTotalFrameBytes ?? DEFAULT_MAX_TOTAL_FRAME_BYTES;
72
+ if (totalLength > maxTotal) {
73
+ throw new ProtocolValidationError(`Wire frame total size (${totalLength} bytes) exceeds limit (${maxTotal} bytes)`, "frame", "MESSAGE_TOO_LARGE");
74
+ }
37
75
  const buffer = new Uint8Array(totalLength);
38
76
  const view = new DataView(buffer.buffer, buffer.byteOffset, buffer.byteLength);
39
77
  view.setUint8(0, WIRE_MAGIC_BYTE);
40
78
  view.setUint8(1, frameType);
41
79
  view.setUint32(2, headerBytes.byteLength, false);
42
- buffer.set(headerBytes, 6);
80
+ buffer.set(headerBytes, WIRE_PREFIX_BYTES);
43
81
  if (payload.byteLength > 0) {
44
- buffer.set(payload, 6 + headerBytes.byteLength);
82
+ buffer.set(payload, WIRE_PREFIX_BYTES + headerBytes.byteLength);
45
83
  }
46
84
  return buffer;
47
85
  }
48
- export function decodeWireFrame(raw) {
86
+ export function decodeWireFrame(raw, options) {
49
87
  const bytes = raw instanceof Uint8Array ? raw : new Uint8Array(raw);
50
- if (bytes.byteLength < 6) {
51
- throw new ProtocolValidationError(`Wire frame too short (${bytes.byteLength} bytes, minimum 6)`, "frame");
88
+ const maxTotal = options?.maxTotalFrameBytes ?? MAX_DECODE_FRAME_BYTES;
89
+ if (bytes.byteLength > maxTotal) {
90
+ throw new ProtocolValidationError(`Wire frame size (${bytes.byteLength} bytes) exceeds limit (${maxTotal} bytes)`, "frame", "MESSAGE_TOO_LARGE");
91
+ }
92
+ if (bytes.byteLength < WIRE_PREFIX_BYTES) {
93
+ throw new ProtocolValidationError(`Wire frame too short (${bytes.byteLength} bytes, minimum ${WIRE_PREFIX_BYTES})`, "frame");
52
94
  }
53
95
  const view = new DataView(bytes.buffer, bytes.byteOffset, bytes.byteLength);
54
96
  const magic = view.getUint8(0);
@@ -60,13 +102,20 @@ export function decodeWireFrame(raw) {
60
102
  throw new ProtocolValidationError(`Unknown wire frame type: 0x${frameType.toString(16)}`, "frameType");
61
103
  }
62
104
  const headerLength = view.getUint32(2, false);
63
- if (headerLength > MAX_HEADER_BYTES || 6 + headerLength > bytes.byteLength) {
105
+ if (headerLength === 0 || headerLength > MAX_HEADER_BYTES || WIRE_PREFIX_BYTES + headerLength > bytes.byteLength) {
64
106
  throw new ProtocolValidationError(`Invalid wire frame header length: ${headerLength}`, "headerLength");
65
107
  }
66
- const headerSlice = bytes.subarray(6, 6 + headerLength);
108
+ const headerSlice = bytes.subarray(WIRE_PREFIX_BYTES, WIRE_PREFIX_BYTES + headerLength);
109
+ let headerJson;
110
+ try {
111
+ headerJson = textDecoder.decode(headerSlice);
112
+ }
113
+ catch {
114
+ throw new ProtocolValidationError("Invalid UTF-8 in wire frame header", "header");
115
+ }
67
116
  let header;
68
117
  try {
69
- header = JSON.parse(textDecoder.decode(headerSlice));
118
+ header = JSON.parse(headerJson);
70
119
  }
71
120
  catch {
72
121
  throw new ProtocolValidationError("Malformed JSON in wire frame header", "header");
@@ -74,10 +123,13 @@ export function decodeWireFrame(raw) {
74
123
  if (typeof header !== "object" ||
75
124
  header === null ||
76
125
  typeof header.messageId !== "string" ||
77
- typeof header.channel !== "string") {
126
+ header.messageId.length === 0 ||
127
+ typeof header.channel !== "string" ||
128
+ header.channel.length === 0) {
78
129
  throw new ProtocolValidationError("Wire frame header missing messageId or channel", "header");
79
130
  }
80
- const payload = bytes.subarray(6 + headerLength);
131
+ validateFrameTypeSpecificHeader(frameType, header);
132
+ const payload = bytes.subarray(WIRE_PREFIX_BYTES + headerLength);
81
133
  return {
82
134
  frameType,
83
135
  header,
@@ -1 +1 @@
1
- {"version":3,"file":"framing.js","sourceRoot":"","sources":["../../src/protocol/framing.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"framing.js","sourceRoot":"","sources":["../../src/protocol/framing.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,11 +1,14 @@
1
1
  {
2
2
  "name": "dropspace",
3
- "version": "0.1.0",
3
+ "version": "0.1.1",
4
4
  "description": "End-to-end encrypted peer-to-peer rooms, resumable file transfers, and Automerge CRDT sync over WebRTC & WebSocket.",
5
5
  "type": "module",
6
6
  "license": "MIT",
7
7
  "main": "./dist/index.js",
8
8
  "types": "./dist/index.d.ts",
9
+ "bin": {
10
+ "dropspace": "./dist/cli.js"
11
+ },
9
12
  "files": [
10
13
  "dist",
11
14
  "fixtures",
@@ -35,7 +38,12 @@
35
38
  "./fixtures/envelopes.json": "./fixtures/envelopes.json"
36
39
  },
37
40
  "dependencies": {
38
- "@automerge/automerge": "^2.2.8"
41
+ "@automerge/automerge": "^2.2.8",
42
+ "ws": "^8.18.0"
43
+ },
44
+ "devDependencies": {
45
+ "@types/node": "^20.17.0",
46
+ "@types/ws": "^8.5.13"
39
47
  },
40
48
  "scripts": {
41
49
  "build": "tsc -p tsconfig.json",