hbsig 0.3.2 → 0.3.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 (95) hide show
  1. package/.babelrc-cjs +5 -0
  2. package/.babelrc-esm +5 -0
  3. package/README.md +1 -0
  4. package/dist/package.json +39 -0
  5. package/make.js +36 -0
  6. package/package.json +16 -17
  7. package/src/bin_to_str.js +46 -0
  8. package/src/collect-body-keys.js +436 -0
  9. package/src/commit.js +219 -0
  10. package/src/encode-array-item.js +112 -0
  11. package/src/encode-utils.js +191 -0
  12. package/src/encode.js +1256 -0
  13. package/src/erl_json.js +292 -0
  14. package/src/erl_str.js +1144 -0
  15. package/src/flat.js +250 -0
  16. package/src/http-message-signatures/httpbis.js +438 -0
  17. package/src/http-message-signatures/index.js +4 -0
  18. package/src/http-message-signatures/structured-header.js +105 -0
  19. package/src/httpsig.js +866 -0
  20. package/src/id.js +459 -0
  21. package/src/index.js +13 -0
  22. package/src/nocrypto.js +4 -0
  23. package/src/parser.js +171 -0
  24. package/src/send-utils.js +1132 -0
  25. package/src/send.js +142 -0
  26. package/src/signer-utils.js +375 -0
  27. package/src/signer.js +312 -0
  28. package/src/structured.js +496 -0
  29. package/src/test.js +2 -0
  30. package/src/utils.js +29 -0
  31. package/test/commit.test.js +41 -0
  32. package/test/erl_json.test.js +8 -0
  33. package/test/flat.test.js +27 -0
  34. package/test/httpsig.test.js +31 -0
  35. package/test/id.test.js +114 -0
  36. package/test/lib/all_cases.js +408 -0
  37. package/test/lib/cases.js +408 -0
  38. package/test/lib/erl_json_cases.js +161 -0
  39. package/test/lib/flat_cases.js +189 -0
  40. package/test/lib/gen.js +528 -0
  41. package/test/lib/httpsig_cases.js +313 -0
  42. package/test/lib/structured_cases.js +222 -0
  43. package/test/lib/test-utils.js +399 -0
  44. package/test/signer.test.js +48 -0
  45. package/test/structured.test.js +35 -0
  46. package/bin/install-deps +0 -0
  47. /package/{cjs → dist/cjs}/bin_to_str.js +0 -0
  48. /package/{cjs → dist/cjs}/collect-body-keys.js +0 -0
  49. /package/{cjs → dist/cjs}/commit.js +0 -0
  50. /package/{cjs → dist/cjs}/encode-array-item.js +0 -0
  51. /package/{cjs → dist/cjs}/encode-utils.js +0 -0
  52. /package/{cjs → dist/cjs}/encode.js +0 -0
  53. /package/{cjs → dist/cjs}/erl_json.js +0 -0
  54. /package/{cjs → dist/cjs}/erl_str.js +0 -0
  55. /package/{cjs → dist/cjs}/flat.js +0 -0
  56. /package/{cjs → dist/cjs}/http-message-signatures/httpbis.js +0 -0
  57. /package/{cjs → dist/cjs}/http-message-signatures/index.js +0 -0
  58. /package/{cjs → dist/cjs}/http-message-signatures/structured-header.js +0 -0
  59. /package/{cjs → dist/cjs}/httpsig.js +0 -0
  60. /package/{cjs → dist/cjs}/id.js +0 -0
  61. /package/{cjs → dist/cjs}/index.js +0 -0
  62. /package/{cjs → dist/cjs}/nocrypto.js +0 -0
  63. /package/{cjs → dist/cjs}/parser.js +0 -0
  64. /package/{cjs → dist/cjs}/send-utils.js +0 -0
  65. /package/{cjs → dist/cjs}/send.js +0 -0
  66. /package/{cjs → dist/cjs}/signer-utils.js +0 -0
  67. /package/{cjs → dist/cjs}/signer.js +0 -0
  68. /package/{cjs → dist/cjs}/structured.js +0 -0
  69. /package/{cjs → dist/cjs}/test.js +0 -0
  70. /package/{cjs → dist/cjs}/utils.js +0 -0
  71. /package/{esm → dist/esm}/bin_to_str.js +0 -0
  72. /package/{esm → dist/esm}/collect-body-keys.js +0 -0
  73. /package/{esm → dist/esm}/commit.js +0 -0
  74. /package/{esm → dist/esm}/encode-array-item.js +0 -0
  75. /package/{esm → dist/esm}/encode-utils.js +0 -0
  76. /package/{esm → dist/esm}/encode.js +0 -0
  77. /package/{esm → dist/esm}/erl_json.js +0 -0
  78. /package/{esm → dist/esm}/erl_str.js +0 -0
  79. /package/{esm → dist/esm}/flat.js +0 -0
  80. /package/{esm → dist/esm}/http-message-signatures/httpbis.js +0 -0
  81. /package/{esm → dist/esm}/http-message-signatures/index.js +0 -0
  82. /package/{esm → dist/esm}/http-message-signatures/structured-header.js +0 -0
  83. /package/{esm → dist/esm}/httpsig.js +0 -0
  84. /package/{esm → dist/esm}/id.js +0 -0
  85. /package/{esm → dist/esm}/index.js +0 -0
  86. /package/{esm → dist/esm}/nocrypto.js +0 -0
  87. /package/{esm → dist/esm}/package.json +0 -0
  88. /package/{esm → dist/esm}/parser.js +0 -0
  89. /package/{esm → dist/esm}/send-utils.js +0 -0
  90. /package/{esm → dist/esm}/send.js +0 -0
  91. /package/{esm → dist/esm}/signer-utils.js +0 -0
  92. /package/{esm → dist/esm}/signer.js +0 -0
  93. /package/{esm → dist/esm}/structured.js +0 -0
  94. /package/{esm → dist/esm}/test.js +0 -0
  95. /package/{esm → dist/esm}/utils.js +0 -0
@@ -0,0 +1,408 @@
1
+ const bin = Buffer.from([1, 2, 3])
2
+ const empty_bin = Buffer.from([])
3
+
4
+ export const map_errors = [
5
+ { types: ["", 0, "", false, Symbol("null"), [], {}, -1] },
6
+ { chaos: [1, "three", true, Symbol("ok"), null, [], {}, 4.5] },
7
+ { mixed_empty_full: ["", [1], {}, { a: 1 }] },
8
+ {
9
+ data: [
10
+ 1,
11
+ "abc",
12
+ true,
13
+ "ok",
14
+ 1.23,
15
+ { bool: false, float: 3.14, int: 1, nested: "ok", str: "abc" },
16
+ ],
17
+ },
18
+ { mixed_empty: ["", 0, [], "", {}, null, false] },
19
+ ]
20
+ export const httpsig_errors = [
21
+ {
22
+ data: {
23
+ bytes: Buffer.from([0, 127, 255]),
24
+ empty: { list: [], map: {} },
25
+ },
26
+ },
27
+ {
28
+ data: "plain text",
29
+ body: { content: Buffer.from([192, 168, 1, 1]) },
30
+ },
31
+ {
32
+ items: {
33
+ first: Buffer.from([255]),
34
+ second: Buffer.from([0]),
35
+ third: Buffer.from([128]),
36
+ },
37
+ },
38
+ {
39
+ data: { body: Buffer.from([255]) },
40
+ body: { data: Buffer.from([0]) },
41
+ },
42
+ ]
43
+ export const signer_errors = [
44
+ { binary: bin },
45
+ { body: bin, data: bin },
46
+ { bin },
47
+ { data: bin },
48
+ { body: bin },
49
+ { bin, data: bin },
50
+ { bin, body: bin },
51
+ { bin, data: bin, body: bin },
52
+ ]
53
+ export const ok = [
54
+ { recursive: [1, [2, [3, [4]]]] },
55
+ { alternating: [1, "one", 2, "two", 3, "three"] },
56
+ {
57
+ binary_data: "some binary content",
58
+ symbols: [Symbol("success"), Symbol("failure"), Symbol("pending")],
59
+ numbers: [0, -1, 42, 3.14, -99.99],
60
+ strings: ["hello", "world", "test"],
61
+ },
62
+ {
63
+ count: 10,
64
+ active: true,
65
+ tags: ["alpha", "beta", "gamma"],
66
+ },
67
+ {
68
+ values: [1, 2, 3, 4, 5],
69
+ states: [Symbol("active"), Symbol("inactive"), Symbol("pending")],
70
+ },
71
+ { empty: Buffer.from([]), nested: [Buffer.from([]), 3] },
72
+ { list: [1, [2, 3]] },
73
+ { list: [53.05] },
74
+ { list: [Symbol("ok")] },
75
+
76
+ { "data-field": 1, data_field: 2, dataField: 3 },
77
+ {
78
+ matrix: [
79
+ [
80
+ { x: 1, y: 1 },
81
+ { x: 2, y: 2 },
82
+ ],
83
+ [
84
+ { x: 3, y: 3 },
85
+ { x: 4, y: 4 },
86
+ ],
87
+ ],
88
+ },
89
+
90
+ { network: { nodes: [{ ip: "127.0.0.1", port: 8080 }] } },
91
+ { nested_maps: { a: [{ val: 1 }], b: [{ val: 2 }] } },
92
+ { tree: { value: 1, children: [{ value: 2 }, { value: 3 }] } },
93
+ { complex_empty: { lists: [[]], maps: [{}] } },
94
+ { empty_in_maps: [{ empty: "" }, { empty: [] }, { empty: {} }] },
95
+ { empty_nested: [[], [[]], [[], []]] },
96
+ { empty_maps_list: [{}, {}, {}] },
97
+ { empty_map_array: [{}, { a: 1 }, {}, { b: 2 }] },
98
+ { users: [{ id: 1 }, { id: 2 }] },
99
+ {
100
+ items: [
101
+ { name: "a", value: 1 },
102
+ { name: "b", value: 2 },
103
+ ],
104
+ },
105
+ {
106
+ mixed_maps: [
107
+ { type: "binary", data: [1, 2, 3] },
108
+ { type: "text", data: "hello" },
109
+ ],
110
+ },
111
+ { nested_array_maps: [{ items: [1, 2, 3] }, { items: [4, 5, 6] }] },
112
+
113
+ { maps_different_keys: [{ x: 1 }, { y: 2 }, { z: 3 }] },
114
+ { deep_map_array: [{ level: { deep: 1 } }, { level: { deep: 2 } }] },
115
+ { maps_with_arrays: [{ arr: [1, 2] }, { arr: [3, 4] }] },
116
+ { max_int32: 2147483647 },
117
+ { min_int32: -2147483648 },
118
+ { _field: 1, field: 2, field_: 3 },
119
+ {
120
+ matrix: [
121
+ [1, 2],
122
+ [3, 4],
123
+ [5, 6],
124
+ ],
125
+ },
126
+ { layers: [{ data: [1, 2] }, { data: [3, 4] }] },
127
+ { mixed_types: [{ int: 2, str: "three" }] },
128
+ {
129
+ config: [
130
+ { setting: "on", value: 1 },
131
+ { setting: "off", value: 0 },
132
+ ],
133
+ },
134
+ { wrapped: [[1], [2], ["three"], [true], [Symbol("ok")]] },
135
+ {
136
+ indexed: [
137
+ { idx: 1, data: 1 },
138
+ { idx: 2, data: "two" },
139
+ ],
140
+ },
141
+ {
142
+ flagged: [
143
+ { flag: true, value: 1 },
144
+ { flag: false, value: 0 },
145
+ ],
146
+ },
147
+ {
148
+ tagged: [
149
+ { tag: "num", val: 123 },
150
+ { tag: "str", val: "hello" },
151
+ ],
152
+ },
153
+ { protocol: { header: [1, 2, 3, 4], body: { data: [9, 10, 11] } } },
154
+ { messages: [{ from: 1, to: 2, data: "hello" }] },
155
+
156
+ {
157
+ files: [
158
+ { name: "file1", size: 123 },
159
+ { name: "file2", size: 456 },
160
+ ],
161
+ },
162
+ { stream: { chunks: ["part1", "part2", "part3"], eof: true } },
163
+ {
164
+ levels: {
165
+ 1: [1],
166
+ 2: [1, 2],
167
+ 3: [1, 2, 3],
168
+ empty: [],
169
+ },
170
+ },
171
+ { data: { test: [1.23, "str", 1, Symbol("ok"), [1, 2, 3]] } },
172
+ { key: [{ str: "abc" }] },
173
+ {
174
+ complex: {
175
+ nested: {
176
+ array: [true, false, "text", 42],
177
+ empty_map: {},
178
+ symbol: Symbol("atom_value"),
179
+ },
180
+ simple: "value",
181
+ },
182
+ },
183
+ {
184
+ mixed_array: [{ name: "John", age: 25 }, "standalone_string", 3.14159],
185
+ boolean_flag: true,
186
+ number: 999,
187
+ },
188
+ {
189
+ list_of_maps: [
190
+ { id: 1, status: Symbol("active") },
191
+ {
192
+ id: 2,
193
+ status: Symbol("inactive"),
194
+ meta: { created: "2024-01-01" },
195
+ },
196
+ ],
197
+ metadata: { version: "1.0", timestamp: 1640995200 },
198
+ },
199
+ {
200
+ deep_nesting: {
201
+ level1: {
202
+ level2: {
203
+ level3: [Symbol("error"), Symbol("warning"), Symbol("info")],
204
+ config: { debug: true },
205
+ },
206
+ },
207
+ },
208
+ simple_list: [1, 2, 3, 4, 5],
209
+ },
210
+ {
211
+ body: Buffer.from([1, 2, 3, 255, 0]),
212
+ empty_list: [],
213
+ empty_binary: Buffer.from([]),
214
+ },
215
+ {
216
+ nested_empty: {
217
+ a: {},
218
+ b: { c: [] },
219
+ },
220
+ flag: false,
221
+ },
222
+ {
223
+ data: [[], [1], [1, 2], []],
224
+ meta: null,
225
+ },
226
+ {
227
+ body: {
228
+ raw: Buffer.from([0, 0, 0, 0]),
229
+ encoded: "base64_content",
230
+ },
231
+ empty_string: "",
232
+ },
233
+ {
234
+ body: { a: { b: 5, c: 3 } },
235
+ data: { d: { e: 5, f: 3 } },
236
+ key: { g: { h: 5, i: 3 } },
237
+ num: 3,
238
+ list: [1, 2, 3],
239
+ str: "Hello",
240
+ },
241
+ { data: { a: 3, b: 4 } },
242
+ { body: { a: { c: 3 }, b: 4 } },
243
+ { data: { a: 3, b: { c: { d: 4 } } }, body: { a: 3, b: { c: { d: 4 } } } },
244
+ {
245
+ float: 1.23,
246
+ int: 1,
247
+ bool: true,
248
+ atom: Symbol("ok"),
249
+ nest: { bool: true, atom: Symbol("ok") },
250
+ body: { bool: true, nest: { atom: Symbol("ok") } },
251
+ data: { bool: true, nest: { atom: Symbol("ok") } },
252
+ },
253
+ { key: [{ str: "abc" }] },
254
+ { key: [{ int: 1 }] },
255
+ { null: null, undefined: undefined },
256
+ { body: { list: [], map: {} }, nested: { list: [], map: {} } },
257
+ {
258
+ str: "abc",
259
+ bool: true,
260
+ num: 123,
261
+ float: 3.14,
262
+ atom: Symbol("ok"),
263
+ list: [1, 2, 3],
264
+ body: bin,
265
+ },
266
+ { map: { a: 1, b: 2, c: { d: 3 } }, body: bin },
267
+ { map: { a: 3, b: "abc", c: { d: { e: 3 } } } },
268
+ { map: { jntzf: 8.02 } },
269
+ { map: { float: 86.01, bool: true } },
270
+ { key: [[8.02]] },
271
+ { base64: Buffer.from([1, 2, 3]).toString("base64") },
272
+
273
+ { bin: empty_bin },
274
+ { body: empty_bin },
275
+ { bin: empty_bin, body: empty_bin },
276
+ { bin: {} },
277
+ { data: {} },
278
+ { body: {} },
279
+ { data: {}, body: {} },
280
+ { bin: {}, data: {} },
281
+ { bin: {}, body: {} },
282
+ { bin: {}, data: {}, body: {} },
283
+ { bin: [] },
284
+ { data: [] },
285
+ { body: [] },
286
+ { data: [], body: [] },
287
+ { bin: [], data: [] },
288
+ { bin: [], body: [] },
289
+ { bin: [], data: [], body: [] },
290
+
291
+ { num: Symbol("atom") },
292
+ { data: Symbol("atom") },
293
+ { body: Symbol("atom") },
294
+ { data: Symbol("atom"), body: Symbol("atom") },
295
+ { num: Symbol("atom"), data: Symbol("atom") },
296
+ { num: Symbol("atom"), body: Symbol("atom") },
297
+ { num: Symbol("atom"), data: Symbol("atom"), body: Symbol("atom") },
298
+ { num: 3.14 },
299
+ { data: 3.14 },
300
+ { body: 3.14 },
301
+ { data: 3.14, body: 3.14 },
302
+ { num: 3.14, data: 3.14 },
303
+ { num: 3.14, body: 3.14 },
304
+ { num: 3.14, data: 3.14, body: 3.14 },
305
+ { data: "abc" },
306
+ { body: "abc" },
307
+ { data: "abc", body: "abc" },
308
+ { str: "abc" },
309
+ { data: "abc", str: "abc" },
310
+ { body: "abc", str: "abc" },
311
+ { data: "abc", body: "abc", str: "abc" },
312
+ { ok: true },
313
+ { data: true },
314
+ { body: true },
315
+ { data: true, body: true },
316
+ { ok: true, data: true },
317
+ { ok: true, body: true },
318
+ { ok: true, data: true, body: true },
319
+ { num: 1 },
320
+ { data: 1 },
321
+ { body: 1 },
322
+ { data: 1, body: 1 },
323
+ { num: 1, data: 1 },
324
+ { num: 1, body: 1 },
325
+ { num: 1, data: 1, body: 1 },
326
+ ]
327
+
328
+ export const errors = [
329
+ {
330
+ nested: {
331
+ nums: [1, 2, 3, 4, 5, 6, 7, 8, 9, 10],
332
+ maps: [{ n: 1 }, { n: 2 }, { n: 3 }, { n: 4 }, { n: 5 }],
333
+ empty: ["", [], {}, null],
334
+ },
335
+ },
336
+ { binary: Buffer.from([1, 2, 3]), binary2: Buffer.from([1, 2, 3]) },
337
+ { bin: [bin, bin] },
338
+ { list: [Symbol("ok"), [bin]] },
339
+ { data: empty_bin },
340
+ { data: empty_bin, body: empty_bin },
341
+ { bin: empty_bin, data: empty_bin },
342
+ { bin: empty_bin, data: empty_bin, body: empty_bin },
343
+ { max_int64: 9223372036854775807 },
344
+ { min_int64: -9223372036854775808 },
345
+ { large_positive: 1000000000000000 },
346
+ { large_negative: -1000000000000000 },
347
+ { int_array: [9223372036854775807, -9223372036854775808, 0] },
348
+ { boundary_ints: { max: 9223372036854775807, min: -9223372036854775808 } },
349
+ { data: 1, Data: 2, DATA: 3 },
350
+ { body: "a", Body: "b", BODY: "c" },
351
+ { test: 1, Test: 2, TEST: 3, TeSt: 4 },
352
+ { a1: 1, A1: 2, "1a": 3, "1A": 4 },
353
+ { 123: "numeric", abc: "alpha", ABC: "ALPHA" },
354
+ { "field!": 1, "field?": 2, "field#": 3 },
355
+ { "": "empty_key", " ": "space_key", " ": "two_spaces" },
356
+ {
357
+ data: [1, 9223372036854775807, "text", { val: 2 }],
358
+ Data: [3, -9223372036854775808, [], {}],
359
+ DATA: ["", null, Symbol("undefined"), Symbol("ok")],
360
+ },
361
+ {
362
+ users: [
363
+ { id: 9223372036854775807, name: "user1", tags: ["a", "b"] },
364
+ { id: -9223372036854775808, name: "user2", tags: [] },
365
+ ],
366
+ },
367
+ {
368
+ types: [
369
+ { type: "integer", value: 9223372036854775807 },
370
+ { type: "empty", value: "" },
371
+ { type: "list", value: [1, 2] },
372
+ ],
373
+ },
374
+ {
375
+ field: 1,
376
+ Field: [2],
377
+ FIELD: { data: 3 },
378
+ FiElD: [{ val: 4 }],
379
+ },
380
+ {
381
+ all: [
382
+ 0,
383
+ 255,
384
+ 9223372036854775807,
385
+ -9223372036854775808,
386
+ "",
387
+ [],
388
+ {},
389
+ { a: 1 },
390
+ [2, 3],
391
+ null,
392
+ Symbol("undefined"),
393
+ Symbol("ok"),
394
+ ],
395
+ },
396
+ {
397
+ ultimate: [
398
+ { id: 1, data: "small", meta: { empty: "" } },
399
+ { id: 9223372036854775807, data: [4, 5, 6], meta: {} },
400
+ { id: -9223372036854775808, data: "", meta: { list: [7] } },
401
+ ],
402
+ Data: 255,
403
+ data: 0,
404
+ DATA: [128],
405
+ },
406
+ ]
407
+
408
+ export default [...ok, ...map_errors, ...httpsig_errors, ...signer_errors]
@@ -0,0 +1,161 @@
1
+ // Test cases for json_to_erl endpoint
2
+ // These are JS objects with Erlang types (Buffer for binaries, Symbol for atoms)
3
+ export const cases_from = [
4
+ // 1. Simple binary
5
+ { bin: Buffer.from([1, 2, 3]) },
6
+
7
+ // 2. Empty binary
8
+ { empty: Buffer.alloc(0) },
9
+
10
+ // 3. Text as binary
11
+ { text: Buffer.from("Hello World") },
12
+
13
+ // 4. Multiple binaries
14
+ {
15
+ a: Buffer.from([255]),
16
+ b: Buffer.from([0, 128]),
17
+ c: Buffer.from("test"),
18
+ },
19
+
20
+ // 5. Mixed types
21
+ {
22
+ name: "test",
23
+ count: 42,
24
+ active: true,
25
+ data: Buffer.from([1, 2, 3]),
26
+ },
27
+
28
+ // 6. Nested maps with binary
29
+ {
30
+ user: {
31
+ name: "Alice",
32
+ avatar: Buffer.from("image data"),
33
+ },
34
+ },
35
+
36
+ // 7. Array with binaries
37
+ {
38
+ items: ["text", Buffer.from("binary"), 123, true],
39
+ },
40
+
41
+ // 8. Null and binary
42
+ {
43
+ value: null,
44
+ data: Buffer.from("null test"),
45
+ },
46
+
47
+ // 9. All primitive types
48
+ {
49
+ str: "string",
50
+ int: 42,
51
+ float: 3.14,
52
+ bool_t: true,
53
+ bool_f: false,
54
+ nil: null,
55
+ bin: Buffer.from("data"),
56
+ },
57
+
58
+ // 10. Empty collections with binary
59
+ {
60
+ list: [],
61
+ map: {},
62
+ data: Buffer.from([255, 254, 253]),
63
+ },
64
+
65
+ // 11. Large binary
66
+ {
67
+ large: Buffer.from(
68
+ "Lorem ipsum dolor sit amet, consectetur adipiscing elit. ".repeat(10)
69
+ ),
70
+ },
71
+
72
+ // 12. Binary with all byte values
73
+ {
74
+ bytes: Buffer.from([0, 1, 127, 128, 255]),
75
+ },
76
+
77
+ // 13. Unicode text as binary
78
+ {
79
+ unicode: Buffer.from("Hello 世界 😀", "utf8"),
80
+ },
81
+
82
+ // 14. Deep nesting with binaries
83
+ {
84
+ a: {
85
+ b: {
86
+ c: {
87
+ data: Buffer.from("deep"),
88
+ more: {
89
+ bin: Buffer.from([42]),
90
+ },
91
+ },
92
+ },
93
+ },
94
+ },
95
+
96
+ // 15. Array of maps with binaries
97
+ {
98
+ users: [
99
+ { name: "Alice", key: Buffer.from("key1") },
100
+ { name: "Bob", key: Buffer.from("key2") },
101
+ { name: "Charlie", key: Buffer.from([1, 2, 3]) },
102
+ ],
103
+ },
104
+
105
+ // 16. Binary and string with same content
106
+ {
107
+ as_string: "test",
108
+ as_binary: Buffer.from("test"),
109
+ },
110
+
111
+ // 17. Map with numeric keys (converted to strings in JSON)
112
+ {
113
+ 123: Buffer.from("numeric key"),
114
+ regular: "value",
115
+ },
116
+
117
+ // 18. Special characters in strings
118
+ {
119
+ text: "Line1\nLine2\tTab",
120
+ binary: Buffer.from("Line1\nLine2\tTab"),
121
+ },
122
+
123
+ // 19. Floats and binaries
124
+ {
125
+ pi: 3.14159265359,
126
+ e: 2.71828182846,
127
+ data: Buffer.from(Float64Array.from([3.14159265359]).buffer),
128
+ },
129
+
130
+ // 20. Everything combined
131
+ {
132
+ // Primitives
133
+ string: "hello",
134
+ integer: 42,
135
+ float: 3.14,
136
+ bool_true: true,
137
+ bool_false: false,
138
+ null_value: null,
139
+
140
+ // Binary data
141
+ binary: Buffer.from([0, 1, 2, 255]),
142
+ text_binary: Buffer.from("Hello, World!"),
143
+ empty_binary: Buffer.alloc(0),
144
+
145
+ // Collections
146
+ array: [1, "two", Buffer.from("three"), true, null],
147
+ nested: {
148
+ map: {
149
+ with: {
150
+ binary: Buffer.from("nested binary"),
151
+ },
152
+ },
153
+ },
154
+
155
+ // Array of objects
156
+ list: [
157
+ { id: 1, data: Buffer.from("first") },
158
+ { id: 2, data: Buffer.from([255, 0, 128]) },
159
+ ],
160
+ },
161
+ ]