@polkadot-apps/statement-store 0.2.0
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.
- package/dist/channels.d.ts +117 -0
- package/dist/channels.d.ts.map +1 -0
- package/dist/channels.js +422 -0
- package/dist/channels.js.map +1 -0
- package/dist/client.d.ts +133 -0
- package/dist/client.d.ts.map +1 -0
- package/dist/client.js +688 -0
- package/dist/client.js.map +1 -0
- package/dist/codec.d.ts +74 -0
- package/dist/codec.d.ts.map +1 -0
- package/dist/codec.js +564 -0
- package/dist/codec.js.map +1 -0
- package/dist/errors.d.ts +60 -0
- package/dist/errors.d.ts.map +1 -0
- package/dist/errors.js +152 -0
- package/dist/errors.js.map +1 -0
- package/dist/index.d.ts +10 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +14 -0
- package/dist/index.js.map +1 -0
- package/dist/topics.d.ts +60 -0
- package/dist/topics.d.ts.map +1 -0
- package/dist/topics.js +187 -0
- package/dist/topics.js.map +1 -0
- package/dist/transport.d.ts +94 -0
- package/dist/transport.d.ts.map +1 -0
- package/dist/transport.js +590 -0
- package/dist/transport.js.map +1 -0
- package/dist/types.d.ts +276 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +12 -0
- package/dist/types.js.map +1 -0
- package/package.json +33 -0
package/dist/codec.js
ADDED
|
@@ -0,0 +1,564 @@
|
|
|
1
|
+
import { StatementDataTooLargeError, StatementEncodingError } from "./errors.js";
|
|
2
|
+
import { MAX_STATEMENT_SIZE } from "./types.js";
|
|
3
|
+
// ============================================================================
|
|
4
|
+
// Internal SCALE Helpers
|
|
5
|
+
//
|
|
6
|
+
// These are statement-format-specific SCALE primitives (~60 lines). While
|
|
7
|
+
// @polkadot-api/substrate-bindings exists in the catalog, it doesn't expose
|
|
8
|
+
// simple compact/u64 encode/decode in a convenient form for our use case.
|
|
9
|
+
// If a second consumer needs these, extract to a shared @polkadot-apps/scale.
|
|
10
|
+
// ============================================================================
|
|
11
|
+
/**
|
|
12
|
+
* Encode an integer using SCALE compact encoding.
|
|
13
|
+
*
|
|
14
|
+
* Supports values up to 2^30 - 1 (mode 0–2).
|
|
15
|
+
* @see https://docs.substrate.io/reference/scale-codec/
|
|
16
|
+
*/
|
|
17
|
+
function encodeCompact(value) {
|
|
18
|
+
if (value < 0) {
|
|
19
|
+
throw new StatementEncodingError(`Negative value in compact encoding: ${value}`);
|
|
20
|
+
}
|
|
21
|
+
if (value < 64) {
|
|
22
|
+
return new Uint8Array([value << 2]);
|
|
23
|
+
}
|
|
24
|
+
if (value < 0x4000) {
|
|
25
|
+
return new Uint8Array([(value << 2) | 1, value >> 6]);
|
|
26
|
+
}
|
|
27
|
+
if (value < 0x40000000) {
|
|
28
|
+
return new Uint8Array([(value << 2) | 2, value >> 6, value >> 14, value >> 22]);
|
|
29
|
+
}
|
|
30
|
+
throw new StatementEncodingError(`Value too large for compact encoding: ${value}`);
|
|
31
|
+
}
|
|
32
|
+
/**
|
|
33
|
+
* Decode a SCALE compact-encoded integer.
|
|
34
|
+
*
|
|
35
|
+
* @returns A tuple of [decodedValue, bytesConsumed].
|
|
36
|
+
*/
|
|
37
|
+
function decodeCompact(bytes, offset) {
|
|
38
|
+
if (offset >= bytes.length) {
|
|
39
|
+
throw new StatementEncodingError("Unexpected end of input in compact decoding");
|
|
40
|
+
}
|
|
41
|
+
const mode = bytes[offset] & 0x03;
|
|
42
|
+
if (mode === 0) {
|
|
43
|
+
return [bytes[offset] >> 2, 1];
|
|
44
|
+
}
|
|
45
|
+
if (mode === 1) {
|
|
46
|
+
if (offset + 1 >= bytes.length) {
|
|
47
|
+
throw new StatementEncodingError("Unexpected end of input in compact decoding (mode 1)");
|
|
48
|
+
}
|
|
49
|
+
return [(bytes[offset] >> 2) | (bytes[offset + 1] << 6), 2];
|
|
50
|
+
}
|
|
51
|
+
if (mode === 2) {
|
|
52
|
+
if (offset + 3 >= bytes.length) {
|
|
53
|
+
throw new StatementEncodingError("Unexpected end of input in compact decoding (mode 2)");
|
|
54
|
+
}
|
|
55
|
+
return [
|
|
56
|
+
(bytes[offset] >> 2) |
|
|
57
|
+
(bytes[offset + 1] << 6) |
|
|
58
|
+
(bytes[offset + 2] << 14) |
|
|
59
|
+
(bytes[offset + 3] << 22),
|
|
60
|
+
4,
|
|
61
|
+
];
|
|
62
|
+
}
|
|
63
|
+
throw new StatementEncodingError("Unsupported compact encoding mode (big integer)");
|
|
64
|
+
}
|
|
65
|
+
/** Encode a 64-bit unsigned integer in little-endian byte order. */
|
|
66
|
+
function encodeU64LE(value) {
|
|
67
|
+
const buffer = new Uint8Array(8);
|
|
68
|
+
for (let i = 0; i < 8; i++) {
|
|
69
|
+
buffer[i] = Number((value >> BigInt(i * 8)) & 0xffn);
|
|
70
|
+
}
|
|
71
|
+
return buffer;
|
|
72
|
+
}
|
|
73
|
+
/** Decode a 64-bit unsigned integer from little-endian bytes. */
|
|
74
|
+
function decodeU64LE(bytes, offset) {
|
|
75
|
+
if (offset + 8 > bytes.length) {
|
|
76
|
+
throw new StatementEncodingError("Unexpected end of input in U64LE decoding");
|
|
77
|
+
}
|
|
78
|
+
let value = 0n;
|
|
79
|
+
for (let i = 0; i < 8; i++) {
|
|
80
|
+
value |= BigInt(bytes[offset + i]) << BigInt(i * 8);
|
|
81
|
+
}
|
|
82
|
+
return value;
|
|
83
|
+
}
|
|
84
|
+
/** Concatenate multiple Uint8Arrays into one. */
|
|
85
|
+
function concatBytes(...arrays) {
|
|
86
|
+
const totalLength = arrays.reduce((sum, arr) => sum + arr.length, 0);
|
|
87
|
+
const result = new Uint8Array(totalLength);
|
|
88
|
+
let offset = 0;
|
|
89
|
+
for (const arr of arrays) {
|
|
90
|
+
result.set(arr, offset);
|
|
91
|
+
offset += arr.length;
|
|
92
|
+
}
|
|
93
|
+
return result;
|
|
94
|
+
}
|
|
95
|
+
/** Convert a hex string (with or without 0x prefix) to bytes. */
|
|
96
|
+
export function fromHex(hex) {
|
|
97
|
+
const clean = hex.startsWith("0x") ? hex.slice(2) : hex;
|
|
98
|
+
const bytes = new Uint8Array(clean.length / 2);
|
|
99
|
+
for (let i = 0; i < bytes.length; i++) {
|
|
100
|
+
bytes[i] = parseInt(clean.substring(i * 2, i * 2 + 2), 16);
|
|
101
|
+
}
|
|
102
|
+
return bytes;
|
|
103
|
+
}
|
|
104
|
+
/** Convert bytes to a hex string with 0x prefix. */
|
|
105
|
+
export function toHex(bytes) {
|
|
106
|
+
let hex = "0x";
|
|
107
|
+
for (let i = 0; i < bytes.length; i++) {
|
|
108
|
+
hex += bytes[i].toString(16).padStart(2, "0");
|
|
109
|
+
}
|
|
110
|
+
return hex;
|
|
111
|
+
}
|
|
112
|
+
// ============================================================================
|
|
113
|
+
// Statement Encoding
|
|
114
|
+
// ============================================================================
|
|
115
|
+
/**
|
|
116
|
+
* Create the signature material for a statement.
|
|
117
|
+
*
|
|
118
|
+
* This is the byte sequence that gets signed with Sr25519 to produce
|
|
119
|
+
* the authenticity proof. It includes all fields **except** the proof itself.
|
|
120
|
+
*
|
|
121
|
+
* The field encoding follows the on-chain statement format:
|
|
122
|
+
* - Tag 2: expiry (U64LE, upper 32 bits = timestamp, lower 32 bits = sequence)
|
|
123
|
+
* - Tag 3: decryptionKey (32 bytes, optional)
|
|
124
|
+
* - Tag 4: topic1 (32 bytes, optional)
|
|
125
|
+
* - Tag 5: topic2 (32 bytes, optional)
|
|
126
|
+
* - Tag 6: channel (32 bytes, optional)
|
|
127
|
+
* - Tag 8: data (compact-length-prefixed bytes, optional)
|
|
128
|
+
*
|
|
129
|
+
* @param fields - The statement fields to include in the signature material.
|
|
130
|
+
* @returns The concatenated bytes to be signed.
|
|
131
|
+
*/
|
|
132
|
+
export function createSignatureMaterial(fields) {
|
|
133
|
+
const parts = [];
|
|
134
|
+
// Field tag 2: Expiry (always present)
|
|
135
|
+
const expiry = (BigInt(fields.expirationTimestamp) << 32n) | BigInt(fields.sequenceNumber);
|
|
136
|
+
parts.push(new Uint8Array([2]));
|
|
137
|
+
parts.push(encodeU64LE(expiry));
|
|
138
|
+
// Field tag 3: DecryptionKey (optional, 32 bytes)
|
|
139
|
+
if (fields.decryptionKey) {
|
|
140
|
+
parts.push(new Uint8Array([3]));
|
|
141
|
+
parts.push(fields.decryptionKey);
|
|
142
|
+
}
|
|
143
|
+
// Field tag 4: Topic1 (optional, 32 bytes)
|
|
144
|
+
if (fields.topic1) {
|
|
145
|
+
parts.push(new Uint8Array([4]));
|
|
146
|
+
parts.push(fields.topic1);
|
|
147
|
+
}
|
|
148
|
+
// Field tag 5: Topic2 (optional, 32 bytes)
|
|
149
|
+
if (fields.topic2) {
|
|
150
|
+
parts.push(new Uint8Array([5]));
|
|
151
|
+
parts.push(fields.topic2);
|
|
152
|
+
}
|
|
153
|
+
// Field tag 6: Channel (optional, 32 bytes)
|
|
154
|
+
if (fields.channel) {
|
|
155
|
+
parts.push(new Uint8Array([6]));
|
|
156
|
+
parts.push(fields.channel);
|
|
157
|
+
}
|
|
158
|
+
// Field tag 8: Data (optional, compact-length-prefixed)
|
|
159
|
+
if (fields.data) {
|
|
160
|
+
parts.push(new Uint8Array([8]));
|
|
161
|
+
parts.push(encodeCompact(fields.data.length));
|
|
162
|
+
parts.push(fields.data);
|
|
163
|
+
}
|
|
164
|
+
return concatBytes(...parts);
|
|
165
|
+
}
|
|
166
|
+
/**
|
|
167
|
+
* Encode a complete SCALE-encoded statement with all fields including the proof.
|
|
168
|
+
*
|
|
169
|
+
* The encoded format is `Vec<Field>`: a compact-encoded field count followed by
|
|
170
|
+
* the concatenated field encodings. Field tag 0 contains the Sr25519 authenticity proof.
|
|
171
|
+
*
|
|
172
|
+
* @param fields - The statement fields.
|
|
173
|
+
* @param signer - The 32-byte Sr25519 public key of the signer.
|
|
174
|
+
* @param signature - The 64-byte Sr25519 signature.
|
|
175
|
+
* @returns The complete SCALE-encoded statement.
|
|
176
|
+
*/
|
|
177
|
+
export function encodeStatement(fields, signer, signature) {
|
|
178
|
+
const fieldArrays = [];
|
|
179
|
+
// Field tag 0: AuthenticityProof (Sr25519 = variant 0)
|
|
180
|
+
fieldArrays.push(concatBytes(new Uint8Array([0, 0]), // tag 0, Sr25519 variant 0
|
|
181
|
+
signature, signer));
|
|
182
|
+
// Field tag 2: Expiry
|
|
183
|
+
const expiry = (BigInt(fields.expirationTimestamp) << 32n) | BigInt(fields.sequenceNumber);
|
|
184
|
+
fieldArrays.push(concatBytes(new Uint8Array([2]), encodeU64LE(expiry)));
|
|
185
|
+
// Field tag 3: DecryptionKey (optional)
|
|
186
|
+
if (fields.decryptionKey) {
|
|
187
|
+
fieldArrays.push(concatBytes(new Uint8Array([3]), fields.decryptionKey));
|
|
188
|
+
}
|
|
189
|
+
// Field tag 4: Topic1 (optional)
|
|
190
|
+
if (fields.topic1) {
|
|
191
|
+
fieldArrays.push(concatBytes(new Uint8Array([4]), fields.topic1));
|
|
192
|
+
}
|
|
193
|
+
// Field tag 5: Topic2 (optional)
|
|
194
|
+
if (fields.topic2) {
|
|
195
|
+
fieldArrays.push(concatBytes(new Uint8Array([5]), fields.topic2));
|
|
196
|
+
}
|
|
197
|
+
// Field tag 6: Channel (optional)
|
|
198
|
+
if (fields.channel) {
|
|
199
|
+
fieldArrays.push(concatBytes(new Uint8Array([6]), fields.channel));
|
|
200
|
+
}
|
|
201
|
+
// Field tag 8: Data (optional)
|
|
202
|
+
if (fields.data) {
|
|
203
|
+
fieldArrays.push(concatBytes(new Uint8Array([8]), encodeCompact(fields.data.length), fields.data));
|
|
204
|
+
}
|
|
205
|
+
// Encode as Vec<Field>: compact length prefix + concatenated fields
|
|
206
|
+
const allFields = concatBytes(...fieldArrays);
|
|
207
|
+
return concatBytes(encodeCompact(fieldArrays.length), allFields);
|
|
208
|
+
}
|
|
209
|
+
/**
|
|
210
|
+
* Decode a SCALE-encoded statement from a hex string.
|
|
211
|
+
*
|
|
212
|
+
* Parses all known field tags (0, 2, 3, 4, 5, 6, 8).
|
|
213
|
+
* Throws {@link StatementEncodingError} on unknown tags or structural corruption.
|
|
214
|
+
*
|
|
215
|
+
* @param hex - A hex-encoded statement string (with or without "0x" prefix).
|
|
216
|
+
* @returns The decoded statement fields.
|
|
217
|
+
* @throws {StatementEncodingError} If the statement is structurally malformed.
|
|
218
|
+
*/
|
|
219
|
+
export function decodeStatement(hex) {
|
|
220
|
+
const bytes = fromHex(hex);
|
|
221
|
+
const result = {};
|
|
222
|
+
let offset = 0;
|
|
223
|
+
const [fieldCount, countBytes] = decodeCompact(bytes, offset);
|
|
224
|
+
offset += countBytes;
|
|
225
|
+
for (let i = 0; i < fieldCount; i++) {
|
|
226
|
+
if (offset >= bytes.length) {
|
|
227
|
+
throw new StatementEncodingError(`Unexpected end of input at field ${i}/${fieldCount}`);
|
|
228
|
+
}
|
|
229
|
+
const tag = bytes[offset];
|
|
230
|
+
offset += 1;
|
|
231
|
+
switch (tag) {
|
|
232
|
+
case 0: {
|
|
233
|
+
// AuthenticityProof: variant (1 byte) + signature (64 bytes) + signer (32 bytes)
|
|
234
|
+
if (offset + 1 + 64 + 32 > bytes.length) {
|
|
235
|
+
throw new StatementEncodingError("Truncated authenticity proof");
|
|
236
|
+
}
|
|
237
|
+
offset += 1 + 64; // skip variant + signature
|
|
238
|
+
result.signer = bytes.slice(offset, offset + 32);
|
|
239
|
+
offset += 32;
|
|
240
|
+
break;
|
|
241
|
+
}
|
|
242
|
+
case 2: {
|
|
243
|
+
result.expiry = decodeU64LE(bytes, offset);
|
|
244
|
+
offset += 8;
|
|
245
|
+
break;
|
|
246
|
+
}
|
|
247
|
+
case 3: {
|
|
248
|
+
if (offset + 32 > bytes.length) {
|
|
249
|
+
throw new StatementEncodingError("Truncated decryption key");
|
|
250
|
+
}
|
|
251
|
+
result.decryptionKey = bytes.slice(offset, offset + 32);
|
|
252
|
+
offset += 32;
|
|
253
|
+
break;
|
|
254
|
+
}
|
|
255
|
+
case 4: {
|
|
256
|
+
if (offset + 32 > bytes.length) {
|
|
257
|
+
throw new StatementEncodingError("Truncated topic1");
|
|
258
|
+
}
|
|
259
|
+
result.topic1 = bytes.slice(offset, offset + 32);
|
|
260
|
+
offset += 32;
|
|
261
|
+
break;
|
|
262
|
+
}
|
|
263
|
+
case 5: {
|
|
264
|
+
if (offset + 32 > bytes.length) {
|
|
265
|
+
throw new StatementEncodingError("Truncated topic2");
|
|
266
|
+
}
|
|
267
|
+
result.topic2 = bytes.slice(offset, offset + 32);
|
|
268
|
+
offset += 32;
|
|
269
|
+
break;
|
|
270
|
+
}
|
|
271
|
+
case 6: {
|
|
272
|
+
if (offset + 32 > bytes.length) {
|
|
273
|
+
throw new StatementEncodingError("Truncated channel");
|
|
274
|
+
}
|
|
275
|
+
result.channel = bytes.slice(offset, offset + 32);
|
|
276
|
+
offset += 32;
|
|
277
|
+
break;
|
|
278
|
+
}
|
|
279
|
+
case 8: {
|
|
280
|
+
const [dataLen, lenBytes] = decodeCompact(bytes, offset);
|
|
281
|
+
offset += lenBytes;
|
|
282
|
+
if (offset + dataLen > bytes.length) {
|
|
283
|
+
throw new StatementEncodingError("Truncated data payload");
|
|
284
|
+
}
|
|
285
|
+
result.data = bytes.slice(offset, offset + dataLen);
|
|
286
|
+
offset += dataLen;
|
|
287
|
+
break;
|
|
288
|
+
}
|
|
289
|
+
default:
|
|
290
|
+
// We must throw here rather than skip — without knowing the
|
|
291
|
+
// field's wire size, we can't advance the offset safely.
|
|
292
|
+
throw new StatementEncodingError(`Unknown field tag: ${tag}`);
|
|
293
|
+
}
|
|
294
|
+
}
|
|
295
|
+
return result;
|
|
296
|
+
}
|
|
297
|
+
/**
|
|
298
|
+
* Encode a value as a JSON-serialized data payload for a statement.
|
|
299
|
+
*
|
|
300
|
+
* Serializes the value as JSON and encodes to UTF-8 bytes.
|
|
301
|
+
* Throws {@link StatementDataTooLargeError} if the result exceeds
|
|
302
|
+
* {@link MAX_STATEMENT_SIZE} bytes.
|
|
303
|
+
*
|
|
304
|
+
* @typeParam T - The type of value being encoded.
|
|
305
|
+
* @param value - The value to serialize.
|
|
306
|
+
* @returns UTF-8 encoded JSON bytes.
|
|
307
|
+
* @throws {StatementDataTooLargeError} If the encoded data exceeds 512 bytes.
|
|
308
|
+
*
|
|
309
|
+
* @example
|
|
310
|
+
* ```ts
|
|
311
|
+
* const data = encodeData({ type: "presence", peerId: "abc" });
|
|
312
|
+
* ```
|
|
313
|
+
*/
|
|
314
|
+
export function encodeData(value) {
|
|
315
|
+
const json = JSON.stringify(value);
|
|
316
|
+
const bytes = new TextEncoder().encode(json);
|
|
317
|
+
if (bytes.length > MAX_STATEMENT_SIZE) {
|
|
318
|
+
throw new StatementDataTooLargeError(bytes.length);
|
|
319
|
+
}
|
|
320
|
+
return bytes;
|
|
321
|
+
}
|
|
322
|
+
/**
|
|
323
|
+
* Decode a JSON-serialized data payload from statement bytes.
|
|
324
|
+
*
|
|
325
|
+
* @typeParam T - The expected parsed type.
|
|
326
|
+
* @param bytes - UTF-8 encoded JSON bytes.
|
|
327
|
+
* @returns The parsed value.
|
|
328
|
+
* @throws {StatementEncodingError} If the bytes are not valid UTF-8 or valid JSON.
|
|
329
|
+
*/
|
|
330
|
+
export function decodeData(bytes) {
|
|
331
|
+
try {
|
|
332
|
+
const json = new TextDecoder("utf-8", { fatal: true }).decode(bytes);
|
|
333
|
+
return JSON.parse(json);
|
|
334
|
+
}
|
|
335
|
+
catch (error) {
|
|
336
|
+
throw new StatementEncodingError("Failed to decode JSON data", { cause: error });
|
|
337
|
+
}
|
|
338
|
+
}
|
|
339
|
+
if (import.meta.vitest) {
|
|
340
|
+
const { describe, test, expect } = import.meta.vitest;
|
|
341
|
+
describe("compact encoding", () => {
|
|
342
|
+
test("encodes and decodes single-byte mode (0-63)", () => {
|
|
343
|
+
for (const val of [0, 1, 42, 63]) {
|
|
344
|
+
const encoded = encodeCompact(val);
|
|
345
|
+
expect(encoded.length).toBe(1);
|
|
346
|
+
const [decoded, bytesRead] = decodeCompact(encoded, 0);
|
|
347
|
+
expect(decoded).toBe(val);
|
|
348
|
+
expect(bytesRead).toBe(1);
|
|
349
|
+
}
|
|
350
|
+
});
|
|
351
|
+
test("encodes and decodes two-byte mode (64-16383)", () => {
|
|
352
|
+
for (const val of [64, 100, 255, 1000, 16383]) {
|
|
353
|
+
const encoded = encodeCompact(val);
|
|
354
|
+
expect(encoded.length).toBe(2);
|
|
355
|
+
const [decoded, bytesRead] = decodeCompact(encoded, 0);
|
|
356
|
+
expect(decoded).toBe(val);
|
|
357
|
+
expect(bytesRead).toBe(2);
|
|
358
|
+
}
|
|
359
|
+
});
|
|
360
|
+
test("encodes and decodes four-byte mode (16384-2^30-1)", () => {
|
|
361
|
+
for (const val of [16384, 65535, 1_000_000]) {
|
|
362
|
+
const encoded = encodeCompact(val);
|
|
363
|
+
expect(encoded.length).toBe(4);
|
|
364
|
+
const [decoded, bytesRead] = decodeCompact(encoded, 0);
|
|
365
|
+
expect(decoded).toBe(val);
|
|
366
|
+
expect(bytesRead).toBe(4);
|
|
367
|
+
}
|
|
368
|
+
});
|
|
369
|
+
test("throws for values too large", () => {
|
|
370
|
+
expect(() => encodeCompact(0x40000000)).toThrow(StatementEncodingError);
|
|
371
|
+
});
|
|
372
|
+
test("throws for negative values", () => {
|
|
373
|
+
expect(() => encodeCompact(-1)).toThrow(StatementEncodingError);
|
|
374
|
+
});
|
|
375
|
+
test("throws on truncated input", () => {
|
|
376
|
+
expect(() => decodeCompact(new Uint8Array(0), 0)).toThrow(StatementEncodingError);
|
|
377
|
+
});
|
|
378
|
+
});
|
|
379
|
+
describe("U64LE encoding", () => {
|
|
380
|
+
test("round-trips zero", () => {
|
|
381
|
+
const encoded = encodeU64LE(0n);
|
|
382
|
+
expect(encoded.length).toBe(8);
|
|
383
|
+
expect(decodeU64LE(encoded, 0)).toBe(0n);
|
|
384
|
+
});
|
|
385
|
+
test("round-trips max u32", () => {
|
|
386
|
+
const val = BigInt(0xffffffff);
|
|
387
|
+
expect(decodeU64LE(encodeU64LE(val), 0)).toBe(val);
|
|
388
|
+
});
|
|
389
|
+
test("round-trips large value", () => {
|
|
390
|
+
const val = (BigInt(1700000000) << 32n) | BigInt(12345);
|
|
391
|
+
expect(decodeU64LE(encodeU64LE(val), 0)).toBe(val);
|
|
392
|
+
});
|
|
393
|
+
test("throws on truncated input", () => {
|
|
394
|
+
expect(() => decodeU64LE(new Uint8Array(4), 0)).toThrow(StatementEncodingError);
|
|
395
|
+
});
|
|
396
|
+
});
|
|
397
|
+
describe("encodeStatement / decodeStatement", () => {
|
|
398
|
+
const fakeSigner = new Uint8Array(32).fill(0xaa);
|
|
399
|
+
const fakeSignature = new Uint8Array(64).fill(0xbb);
|
|
400
|
+
test("round-trips minimal statement (expiry only)", () => {
|
|
401
|
+
const fields = {
|
|
402
|
+
expirationTimestamp: 1700000000,
|
|
403
|
+
sequenceNumber: 42,
|
|
404
|
+
};
|
|
405
|
+
const encoded = encodeStatement(fields, fakeSigner, fakeSignature);
|
|
406
|
+
const hex = toHex(encoded);
|
|
407
|
+
const decoded = decodeStatement(hex);
|
|
408
|
+
expect(decoded.signer).toEqual(fakeSigner);
|
|
409
|
+
const expectedExpiry = (BigInt(1700000000) << 32n) | 42n;
|
|
410
|
+
expect(decoded.expiry).toBe(expectedExpiry);
|
|
411
|
+
expect(decoded.data).toBeUndefined();
|
|
412
|
+
expect(decoded.channel).toBeUndefined();
|
|
413
|
+
expect(decoded.topic1).toBeUndefined();
|
|
414
|
+
expect(decoded.topic2).toBeUndefined();
|
|
415
|
+
expect(decoded.decryptionKey).toBeUndefined();
|
|
416
|
+
});
|
|
417
|
+
test("round-trips statement with all fields", () => {
|
|
418
|
+
const topic1 = new Uint8Array(32).fill(0x11);
|
|
419
|
+
const topic2 = new Uint8Array(32).fill(0x22);
|
|
420
|
+
const channel = new Uint8Array(32).fill(0x33);
|
|
421
|
+
const decryptionKey = new Uint8Array(32).fill(0x44);
|
|
422
|
+
const data = new TextEncoder().encode('{"type":"presence"}');
|
|
423
|
+
const fields = {
|
|
424
|
+
expirationTimestamp: 1700000030,
|
|
425
|
+
sequenceNumber: 999,
|
|
426
|
+
decryptionKey,
|
|
427
|
+
channel,
|
|
428
|
+
topic1,
|
|
429
|
+
topic2,
|
|
430
|
+
data,
|
|
431
|
+
};
|
|
432
|
+
const encoded = encodeStatement(fields, fakeSigner, fakeSignature);
|
|
433
|
+
const hex = toHex(encoded);
|
|
434
|
+
const decoded = decodeStatement(hex);
|
|
435
|
+
expect(decoded.signer).toEqual(fakeSigner);
|
|
436
|
+
expect(decoded.decryptionKey).toEqual(decryptionKey);
|
|
437
|
+
expect(decoded.topic1).toEqual(topic1);
|
|
438
|
+
expect(decoded.topic2).toEqual(topic2);
|
|
439
|
+
expect(decoded.channel).toEqual(channel);
|
|
440
|
+
expect(decoded.data).toEqual(data);
|
|
441
|
+
});
|
|
442
|
+
test("decodes hex with 0x prefix", () => {
|
|
443
|
+
const fields = {
|
|
444
|
+
expirationTimestamp: 100,
|
|
445
|
+
sequenceNumber: 1,
|
|
446
|
+
};
|
|
447
|
+
const encoded = encodeStatement(fields, fakeSigner, fakeSignature);
|
|
448
|
+
const hex = toHex(encoded);
|
|
449
|
+
expect(hex.startsWith("0x")).toBe(true);
|
|
450
|
+
const decoded = decodeStatement(hex);
|
|
451
|
+
expect(decoded.signer).toEqual(fakeSigner);
|
|
452
|
+
});
|
|
453
|
+
test("decodes hex without 0x prefix", () => {
|
|
454
|
+
const fields = {
|
|
455
|
+
expirationTimestamp: 100,
|
|
456
|
+
sequenceNumber: 1,
|
|
457
|
+
};
|
|
458
|
+
const encoded = encodeStatement(fields, fakeSigner, fakeSignature);
|
|
459
|
+
const hex = toHex(encoded).slice(2); // remove 0x
|
|
460
|
+
const decoded = decodeStatement(hex);
|
|
461
|
+
expect(decoded.signer).toEqual(fakeSigner);
|
|
462
|
+
});
|
|
463
|
+
test("throws on unknown field tag", () => {
|
|
464
|
+
// Craft a statement with 1 field, tag=99
|
|
465
|
+
const bytes = new Uint8Array([4, 99]); // compact(1)=4, then tag 99
|
|
466
|
+
const hex = toHex(bytes);
|
|
467
|
+
expect(() => decodeStatement(hex)).toThrow(StatementEncodingError);
|
|
468
|
+
});
|
|
469
|
+
test("throws on truncated authenticity proof", () => {
|
|
470
|
+
// 1 field, tag 0, but only 2 more bytes (need 97)
|
|
471
|
+
const bytes = new Uint8Array([4, 0, 0, 0]);
|
|
472
|
+
expect(() => decodeStatement(toHex(bytes))).toThrow(StatementEncodingError);
|
|
473
|
+
});
|
|
474
|
+
test("throws on truncated 32-byte fields", () => {
|
|
475
|
+
// tag 3 (decryptionKey) with only 16 bytes instead of 32
|
|
476
|
+
const bytes = new Uint8Array(18);
|
|
477
|
+
bytes[0] = 4; // compact(1)
|
|
478
|
+
bytes[1] = 3; // tag 3
|
|
479
|
+
// only 16 remaining bytes, need 32
|
|
480
|
+
expect(() => decodeStatement(toHex(bytes))).toThrow("Truncated");
|
|
481
|
+
// tag 4 (topic1)
|
|
482
|
+
const bytes2 = new Uint8Array(18);
|
|
483
|
+
bytes2[0] = 4;
|
|
484
|
+
bytes2[1] = 4;
|
|
485
|
+
expect(() => decodeStatement(toHex(bytes2))).toThrow("Truncated");
|
|
486
|
+
// tag 6 (channel)
|
|
487
|
+
const bytes3 = new Uint8Array(18);
|
|
488
|
+
bytes3[0] = 4;
|
|
489
|
+
bytes3[1] = 6;
|
|
490
|
+
expect(() => decodeStatement(toHex(bytes3))).toThrow("Truncated");
|
|
491
|
+
});
|
|
492
|
+
test("throws on truncated data payload", () => {
|
|
493
|
+
// tag 8 with compact length=100 but only 2 bytes of data
|
|
494
|
+
const bytes = new Uint8Array([4, 8, 144, 1, 0, 0]); // compact(1), tag 8, compact(100)=0x190
|
|
495
|
+
expect(() => decodeStatement(toHex(bytes))).toThrow("Truncated");
|
|
496
|
+
});
|
|
497
|
+
test("throws on unexpected end of input mid-fields", () => {
|
|
498
|
+
// Claim 3 fields but only provide 1
|
|
499
|
+
const encoded = encodeStatement({ expirationTimestamp: 100, sequenceNumber: 1 }, fakeSigner, fakeSignature);
|
|
500
|
+
// Truncate to cut off some fields
|
|
501
|
+
const truncated = encoded.slice(0, 20);
|
|
502
|
+
expect(() => decodeStatement(toHex(truncated))).toThrow(StatementEncodingError);
|
|
503
|
+
});
|
|
504
|
+
});
|
|
505
|
+
describe("createSignatureMaterial", () => {
|
|
506
|
+
test("produces deterministic output", () => {
|
|
507
|
+
const fields = {
|
|
508
|
+
expirationTimestamp: 1700000000,
|
|
509
|
+
sequenceNumber: 42,
|
|
510
|
+
topic1: new Uint8Array(32).fill(0x11),
|
|
511
|
+
};
|
|
512
|
+
const a = createSignatureMaterial(fields);
|
|
513
|
+
const b = createSignatureMaterial(fields);
|
|
514
|
+
expect(a).toEqual(b);
|
|
515
|
+
});
|
|
516
|
+
test("differs when fields change", () => {
|
|
517
|
+
const base = {
|
|
518
|
+
expirationTimestamp: 1700000000,
|
|
519
|
+
sequenceNumber: 42,
|
|
520
|
+
};
|
|
521
|
+
const modified = {
|
|
522
|
+
expirationTimestamp: 1700000001,
|
|
523
|
+
sequenceNumber: 42,
|
|
524
|
+
};
|
|
525
|
+
expect(createSignatureMaterial(base)).not.toEqual(createSignatureMaterial(modified));
|
|
526
|
+
});
|
|
527
|
+
});
|
|
528
|
+
describe("encodeData / decodeData", () => {
|
|
529
|
+
test("round-trips JSON object", () => {
|
|
530
|
+
const original = { type: "presence", peerId: "abc123", timestamp: 1234 };
|
|
531
|
+
const encoded = encodeData(original);
|
|
532
|
+
const decoded = decodeData(encoded);
|
|
533
|
+
expect(decoded).toEqual(original);
|
|
534
|
+
});
|
|
535
|
+
test("round-trips string", () => {
|
|
536
|
+
const encoded = encodeData("hello");
|
|
537
|
+
expect(decodeData(encoded)).toBe("hello");
|
|
538
|
+
});
|
|
539
|
+
test("round-trips number", () => {
|
|
540
|
+
const encoded = encodeData(42);
|
|
541
|
+
expect(decodeData(encoded)).toBe(42);
|
|
542
|
+
});
|
|
543
|
+
test("throws StatementDataTooLargeError for oversized data", () => {
|
|
544
|
+
const large = { data: "x".repeat(600) };
|
|
545
|
+
expect(() => encodeData(large)).toThrow(StatementDataTooLargeError);
|
|
546
|
+
});
|
|
547
|
+
test("allows data at exactly MAX_STATEMENT_SIZE", () => {
|
|
548
|
+
// Create a string that when JSON-serialized + UTF-8 encoded = exactly 512 bytes
|
|
549
|
+
// JSON.stringify adds 2 quote chars, so the string content needs to be 510 chars
|
|
550
|
+
const str = "a".repeat(510);
|
|
551
|
+
const encoded = encodeData(str);
|
|
552
|
+
expect(encoded.length).toBe(512);
|
|
553
|
+
});
|
|
554
|
+
test("throws StatementEncodingError for invalid JSON bytes", () => {
|
|
555
|
+
const invalid = new TextEncoder().encode("{not valid json");
|
|
556
|
+
expect(() => decodeData(invalid)).toThrow(StatementEncodingError);
|
|
557
|
+
});
|
|
558
|
+
test("throws StatementEncodingError for non-UTF-8 bytes", () => {
|
|
559
|
+
const invalid = new Uint8Array([0xff, 0xfe, 0xfd]);
|
|
560
|
+
expect(() => decodeData(invalid)).toThrow(StatementEncodingError);
|
|
561
|
+
});
|
|
562
|
+
});
|
|
563
|
+
}
|
|
564
|
+
//# sourceMappingURL=codec.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"codec.js","sourceRoot":"","sources":["../src/codec.ts"],"names":[],"mappings":"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"}
|
package/dist/errors.d.ts
ADDED
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Base class for all statement store errors.
|
|
3
|
+
*
|
|
4
|
+
* Use `instanceof StatementStoreError` to catch any error originating
|
|
5
|
+
* from the statement store package.
|
|
6
|
+
*/
|
|
7
|
+
export declare class StatementStoreError extends Error {
|
|
8
|
+
constructor(message: string, options?: ErrorOptions);
|
|
9
|
+
}
|
|
10
|
+
/**
|
|
11
|
+
* A SCALE encoding or decoding operation failed.
|
|
12
|
+
*
|
|
13
|
+
* Thrown when statement bytes cannot be parsed (corrupt data, unknown field tags)
|
|
14
|
+
* or when encoding produces invalid output.
|
|
15
|
+
*/
|
|
16
|
+
export declare class StatementEncodingError extends StatementStoreError {
|
|
17
|
+
constructor(message: string, options?: ErrorOptions);
|
|
18
|
+
}
|
|
19
|
+
/**
|
|
20
|
+
* The statement store node rejected a submitted statement.
|
|
21
|
+
*
|
|
22
|
+
* Carries the raw RPC response detail for programmatic inspection.
|
|
23
|
+
*/
|
|
24
|
+
export declare class StatementSubmitError extends StatementStoreError {
|
|
25
|
+
/** The raw response from the RPC call. */
|
|
26
|
+
readonly detail: unknown;
|
|
27
|
+
constructor(detail: unknown);
|
|
28
|
+
}
|
|
29
|
+
/**
|
|
30
|
+
* Failed to set up or maintain a statement subscription.
|
|
31
|
+
*
|
|
32
|
+
* This is a non-fatal error — the client falls back to polling
|
|
33
|
+
* when subscriptions are unavailable.
|
|
34
|
+
*/
|
|
35
|
+
export declare class StatementSubscriptionError extends StatementStoreError {
|
|
36
|
+
constructor(message: string, options?: ErrorOptions);
|
|
37
|
+
}
|
|
38
|
+
/**
|
|
39
|
+
* Failed to connect to the statement store transport.
|
|
40
|
+
*
|
|
41
|
+
* Thrown when the WebSocket connection cannot be established
|
|
42
|
+
* or the chain-client's bulletin chain is not connected.
|
|
43
|
+
*/
|
|
44
|
+
export declare class StatementConnectionError extends StatementStoreError {
|
|
45
|
+
constructor(message: string, options?: ErrorOptions);
|
|
46
|
+
}
|
|
47
|
+
/**
|
|
48
|
+
* The statement data payload exceeds the maximum allowed size.
|
|
49
|
+
*
|
|
50
|
+
* The statement store protocol limits individual statement data
|
|
51
|
+
* to {@link MAX_STATEMENT_SIZE} bytes (512 bytes).
|
|
52
|
+
*/
|
|
53
|
+
export declare class StatementDataTooLargeError extends StatementStoreError {
|
|
54
|
+
/** The actual size of the data in bytes. */
|
|
55
|
+
readonly actualSize: number;
|
|
56
|
+
/** The maximum allowed size in bytes. */
|
|
57
|
+
readonly maxSize: number;
|
|
58
|
+
constructor(actualSize: number, maxSize?: number);
|
|
59
|
+
}
|
|
60
|
+
//# sourceMappingURL=errors.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"errors.d.ts","sourceRoot":"","sources":["../src/errors.ts"],"names":[],"mappings":"AAEA;;;;;GAKG;AACH,qBAAa,mBAAoB,SAAQ,KAAK;gBAC9B,OAAO,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,YAAY;CAItD;AAED;;;;;GAKG;AACH,qBAAa,sBAAuB,SAAQ,mBAAmB;gBAC/C,OAAO,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,YAAY;CAItD;AAED;;;;GAIG;AACH,qBAAa,oBAAqB,SAAQ,mBAAmB;IACzD,0CAA0C;IAC1C,QAAQ,CAAC,MAAM,EAAE,OAAO,CAAC;gBAEb,MAAM,EAAE,OAAO;CAK9B;AAED;;;;;GAKG;AACH,qBAAa,0BAA2B,SAAQ,mBAAmB;gBACnD,OAAO,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,YAAY;CAItD;AAED;;;;;GAKG;AACH,qBAAa,wBAAyB,SAAQ,mBAAmB;gBACjD,OAAO,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,YAAY;CAItD;AAED;;;;;GAKG;AACH,qBAAa,0BAA2B,SAAQ,mBAAmB;IAC/D,4CAA4C;IAC5C,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAC5B,yCAAyC;IACzC,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;gBAEb,UAAU,EAAE,MAAM,EAAE,OAAO,GAAE,MAA2B;CAMvE"}
|