hbsig 0.3.1 → 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 (94) 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 -16
  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/{cjs → dist/cjs}/bin_to_str.js +0 -0
  47. /package/{cjs → dist/cjs}/collect-body-keys.js +0 -0
  48. /package/{cjs → dist/cjs}/commit.js +0 -0
  49. /package/{cjs → dist/cjs}/encode-array-item.js +0 -0
  50. /package/{cjs → dist/cjs}/encode-utils.js +0 -0
  51. /package/{cjs → dist/cjs}/encode.js +0 -0
  52. /package/{cjs → dist/cjs}/erl_json.js +0 -0
  53. /package/{cjs → dist/cjs}/erl_str.js +0 -0
  54. /package/{cjs → dist/cjs}/flat.js +0 -0
  55. /package/{cjs → dist/cjs}/http-message-signatures/httpbis.js +0 -0
  56. /package/{cjs → dist/cjs}/http-message-signatures/index.js +0 -0
  57. /package/{cjs → dist/cjs}/http-message-signatures/structured-header.js +0 -0
  58. /package/{cjs → dist/cjs}/httpsig.js +0 -0
  59. /package/{cjs → dist/cjs}/id.js +0 -0
  60. /package/{cjs → dist/cjs}/index.js +0 -0
  61. /package/{cjs → dist/cjs}/nocrypto.js +0 -0
  62. /package/{cjs → dist/cjs}/parser.js +0 -0
  63. /package/{cjs → dist/cjs}/send-utils.js +0 -0
  64. /package/{cjs → dist/cjs}/send.js +0 -0
  65. /package/{cjs → dist/cjs}/signer-utils.js +0 -0
  66. /package/{cjs → dist/cjs}/signer.js +0 -0
  67. /package/{cjs → dist/cjs}/structured.js +0 -0
  68. /package/{cjs → dist/cjs}/test.js +0 -0
  69. /package/{cjs → dist/cjs}/utils.js +0 -0
  70. /package/{esm → dist/esm}/bin_to_str.js +0 -0
  71. /package/{esm → dist/esm}/collect-body-keys.js +0 -0
  72. /package/{esm → dist/esm}/commit.js +0 -0
  73. /package/{esm → dist/esm}/encode-array-item.js +0 -0
  74. /package/{esm → dist/esm}/encode-utils.js +0 -0
  75. /package/{esm → dist/esm}/encode.js +0 -0
  76. /package/{esm → dist/esm}/erl_json.js +0 -0
  77. /package/{esm → dist/esm}/erl_str.js +0 -0
  78. /package/{esm → dist/esm}/flat.js +0 -0
  79. /package/{esm → dist/esm}/http-message-signatures/httpbis.js +0 -0
  80. /package/{esm → dist/esm}/http-message-signatures/index.js +0 -0
  81. /package/{esm → dist/esm}/http-message-signatures/structured-header.js +0 -0
  82. /package/{esm → dist/esm}/httpsig.js +0 -0
  83. /package/{esm → dist/esm}/id.js +0 -0
  84. /package/{esm → dist/esm}/index.js +0 -0
  85. /package/{esm → dist/esm}/nocrypto.js +0 -0
  86. /package/{esm → dist/esm}/package.json +0 -0
  87. /package/{esm → dist/esm}/parser.js +0 -0
  88. /package/{esm → dist/esm}/send-utils.js +0 -0
  89. /package/{esm → dist/esm}/send.js +0 -0
  90. /package/{esm → dist/esm}/signer-utils.js +0 -0
  91. /package/{esm → dist/esm}/signer.js +0 -0
  92. /package/{esm → dist/esm}/structured.js +0 -0
  93. /package/{esm → dist/esm}/test.js +0 -0
  94. /package/{esm → dist/esm}/utils.js +0 -0
@@ -0,0 +1,114 @@
1
+ import assert from "assert"
2
+ import { after, describe, it, before, beforeEach } from "node:test"
3
+ import {
4
+ generateCommitmentId,
5
+ rsaid,
6
+ hmacid,
7
+ verifyCommitmentId,
8
+ } from "../src/id.js"
9
+
10
+ // Test data from the Erlang implementation
11
+ const testMessage = {
12
+ commitments: {
13
+ "PDw08yIW-ImV2N3ItIlWQ1wBt2t_H1CGMUOxJjx47HE": {
14
+ alg: "rsa-pss-sha512",
15
+ "commitment-device": "httpsig@1.0",
16
+ committer: "Tbun4iRRQW93gUiSAmTmZJ2PGI-_yYaXsX69ETgzSRE",
17
+ signature:
18
+ "http-sig-bba7e22451416f77=:d6cEnlw7JDqPRoMZj1R748tDu8S+8R2OYmHTOeBdyrHkhSGeUj7nGGA1K7pLKE79OSuqU9FmQdw1sRnI5u133Ryj4cge751gIy/DCkHN91Vujm5YXzcki9baTk6zXg18RhdVYvkJgo1aLUB9jDfPUUj4tgO8aOwRoeSFXn1P5aWY5jxa9dg6vRmZt5U+J3Xsj80eeSOGI1cC+PWHiw0nnMYPGRnFBp1zhNFdRH01JTsnbOHYHjD4PhQ17DePywTE2QRhrLSMH+XjrQoQA7hhvK0ezyGnRbByro1FH+n4TGPTnt8G+tvI7f4e24T50QKKlK3//ZyDumcHTnK0i5A2YDRXin9A4ngkXhmVxGgPjsgZSE8SfUd/D9U8SJqkuP71WbGbsfTer21P7AGC7xoloTV2nF0ZYHCN4Mlo2CH4WJqdFqlAvIhQPhuThwsSq84yp3e+W0P6+ejqwtQPcnLXDCHpk6bVQeNgA5a5+GLvnyPNo9REPp5cJ4yz5k/ESvPLnjElZlsMJ/h+BwJ8AyPDQdwz42Vnz9vrr7d6CWIFEKuV+Sjw/4ZHu2GEa8rUw1JmrMqlb21genHug8nOzFG6DyITJXBwzvnytsaYowauw8cgyRDxJ8p5pqCXwDz+8wnwnszXZquDDfQJZkNgzgt/UFXtyVfUaLB1Uc+4qh894Yw=:",
19
+ "signature-input":
20
+ 'http-sig-bba7e22451416f77=("ao-types" "@path" "quantity" "recipient");alg="rsa-pss-sha512";keyid="o1kvTqZQ0wbS_WkdwX70TFCk7UF76ldnJ85l8iRV7t6mSlzkXBYCecb-8RXsNEQQmO0KergtHOvhuBJmB6YXaYe_UftI_gendojfIa6jlTgw-qmH6g4_oErI8djDRbQSm-5nCfGVRuYxsNZLYDeqw4gFb9K3b1h7tuMoLd6-d5pkaLfTMUNcvs2OqpkLo0i_av746FieaURdWozwFqO0APtdA7pLHDqQZDMNdTmsUBJFszL6SOa1bKe5cUWnrq4uaW4NAN3JAQniILKGsKZENeKtfXwiKVaFJtriWWsbhOaNT0JLcuBAwXQAP59RXzcr8bRY6XFn8zBmEmZBGszOD9c9ssDENRFDa5uyVhk8XgIgQjErAWYd9T6edrYcIp3R78jhNK_nLiIBBz8_Oz3bLjL5i_aiV2gpfIbd44DCHihuuxSWRAPJxhEy9TS0_QbVOIWhcDTIeEJE3aRPTwSTMt1_Fec7i9HJWN0mvMbAAJw8k6HxjA3pFZiCowZJw7FBwMAeYgEwIeB82f-S2-PtFLwR9i0tExo36hEBHqaS4Y-O3NGgQ8mKnhT7Z1EfxEbA2BpR9oL8rJFEnPIrHHu7B88OHDDfnfRD3D79fKktnisC7XOuwbHG3TQo0_j4_mElH7xj_7IyAbmCUHDd-eRa482wOYXBB01DGnad901qaHU"',
21
+ },
22
+ iK__u54zqDWrJpVVbf3uYvgvG1hxWZM6Tq1zusfGYIw: {
23
+ alg: "hmac-sha256",
24
+ "commitment-device": "httpsig@1.0",
25
+ signature:
26
+ "http-sig-bba7e22451416f77=:d6cEnlw7JDqPRoMZj1R748tDu8S+8R2OYmHTOeBdyrHkhSGeUj7nGGA1K7pLKE79OSuqU9FmQdw1sRnI5u133Ryj4cge751gIy/DCkHN91Vujm5YXzcki9baTk6zXg18RhdVYvkJgo1aLUB9jDfPUUj4tgO8aOwRoeSFXn1P5aWY5jxa9dg6vRmZt5U+J3Xsj80eeSOGI1cC+PWHiw0nnMYPGRnFBp1zhNFdRH01JTsnbOHYHjD4PhQ17DePywTE2QRhrLSMH+XjrQoQA7hhvK0ezyGnRbByro1FH+n4TGPTnt8G+tvI7f4e24T50QKKlK3//ZyDumcHTnK0i5A2YDRXin9A4ngkXhmVxGgPjsgZSE8SfUd/D9U8SJqkuP71WbGbsfTer21P7AGC7xoloTV2nF0ZYHCN4Mlo2CH4WJqdFqlAvIhQPhuThwsSq84yp3e+W0P6+ejqwtQPcnLXDCHpk6bVQeNgA5a5+GLvnyPNo9REPp5cJ4yz5k/ESvPLnjElZlsMJ/h+BwJ8AyPDQdwz42Vnz9vrr7d6CWIFEKuV+Sjw/4ZHu2GEa8rUw1JmrMqlb21genHug8nOzFG6DyITJXBwzvnytsaYowauw8cgyRDxJ8p5pqCXwDz+8wnwnszXZquDDfQJZkNgzgt/UFXtyVfUaLB1Uc+4qh894Yw=:",
27
+ "signature-input":
28
+ 'http-sig-bba7e22451416f77=("ao-types" "@path" "quantity" "recipient");alg="rsa-pss-sha512";keyid="o1kvTqZQ0wbS_WkdwX70TFCk7UF76ldnJ85l8iRV7t6mSlzkXBYCecb-8RXsNEQQmO0KergtHOvhuBJmB6YXaYe_UftI_gendojfIa6jlTgw-qmH6g4_oErI8djDRbQSm-5nCfGVRuYxsNZLYDeqw4gFb9K3b1h7tuMoLd6-d5pkaLfTMUNcvs2OqpkLo0i_av746FieaURdWozwFqO0APtdA7pLHDqQZDMNdTmsUBJFszL6SOa1bKe5cUWnrq4uaW4NAN3JAQniILKGsKZENeKtfXwiKVaFJtriWWsbhOaNT0JLcuBAwXQAP59RXzcr8bRY6XFn8zBmEmZBGszOD9c9ssDENRFDa5uyVhk8XgIgQjErAWYd9T6edrYcIp3R78jhNK_nLiIBBz8_Oz3bLjL5i_aiV2gpfIbd44DCHihuuxSWRAPJxhEy9TS0_QbVOIWhcDTIeEJE3aRPTwSTMt1_Fec7i9HJWN0mvMbAAJw8k6HxjA3pFZiCowZJw7FBwMAeYgEwIeB82f-S2-PtFLwR9i0tExo36hEBHqaS4Y-O3NGgQ8mKnhT7Z1EfxEbA2BpR9oL8rJFEnPIrHHu7B88OHDDfnfRD3D79fKktnisC7XOuwbHG3TQo0_j4_mElH7xj_7IyAbmCUHDd-eRa482wOYXBB01DGnad901qaHU"',
29
+ },
30
+ },
31
+ path: "credit-notice",
32
+ quantity: 100,
33
+ recipient: "Rix7e0HB-8OAaimcoYkxTZB-dStgTOHWUik1DvKD5vM",
34
+ }
35
+
36
+ // Message for HMAC computation (without commitments)
37
+ const hmacMessage = {
38
+ "ao-types": 'quantity="integer"',
39
+ path: "credit-notice",
40
+ quantity: "100",
41
+ recipient: "Rix7e0HB-8OAaimcoYkxTZB-dStgTOHWUik1DvKD5vM",
42
+ signature:
43
+ testMessage.commitments["PDw08yIW-ImV2N3ItIlWQ1wBt2t_H1CGMUOxJjx47HE"]
44
+ .signature,
45
+ "signature-input":
46
+ testMessage.commitments["PDw08yIW-ImV2N3ItIlWQ1wBt2t_H1CGMUOxJjx47HE"][
47
+ "signature-input"
48
+ ],
49
+ }
50
+
51
+ describe("ID", function () {
52
+ it("should validate", () => {
53
+ console.log("=== HyperBEAM ID Generator Test Suite ===\n")
54
+
55
+ // Test 1: RSA Commitment ID
56
+ console.log("Test 1: RSA-PSS Commitment ID Generation")
57
+ const rsaCommitment =
58
+ testMessage.commitments["PDw08yIW-ImV2N3ItIlWQ1wBt2t_H1CGMUOxJjx47HE"]
59
+ const rsaId = rsaid(rsaCommitment)
60
+ console.log("Expected ID: PDw08yIW-ImV2N3ItIlWQ1wBt2t_H1CGMUOxJjx47HE")
61
+ console.log("Generated ID:", rsaId)
62
+ assert.equal(rsaId, "PDw08yIW-ImV2N3ItIlWQ1wBt2t_H1CGMUOxJjx47HE")
63
+
64
+ // Test 2: HMAC Commitment ID
65
+ console.log("\nTest 2: HMAC Commitment ID Generation")
66
+ const hmacId = hmacid(hmacMessage)
67
+ console.log("Expected ID: iK__u54zqDWrJpVVbf3uYvgvG1hxWZM6Tq1zusfGYIw")
68
+ console.log("Generated ID:", hmacId)
69
+ assert.equal(hmacId, "iK__u54zqDWrJpVVbf3uYvgvG1hxWZM6Tq1zusfGYIw")
70
+
71
+ // Test 3: Generic commitment ID function
72
+ console.log("\nTest 3: Generic Commitment ID Function")
73
+ const genericRsaId = generateCommitmentId(rsaCommitment)
74
+ console.log("RSA via generic function:", genericRsaId)
75
+ assert.equal(genericRsaId, "PDw08yIW-ImV2N3ItIlWQ1wBt2t_H1CGMUOxJjx47HE")
76
+
77
+ const hmacCommitment = { alg: "hmac-sha256" }
78
+ const genericHmacId = generateCommitmentId(hmacCommitment, hmacMessage)
79
+ console.log("HMAC via generic function:", genericHmacId)
80
+ assert.equal(genericHmacId, "iK__u54zqDWrJpVVbf3uYvgvG1hxWZM6Tq1zusfGYIw")
81
+
82
+ // Test 4: Verify commitment IDs
83
+ console.log("\nTest 4: Verify Commitment IDs")
84
+ const rsaVerified = verifyCommitmentId(
85
+ rsaCommitment,
86
+ "PDw08yIW-ImV2N3ItIlWQ1wBt2t_H1CGMUOxJjx47HE",
87
+ )
88
+ assert(rsaVerified)
89
+
90
+ const hmacVerified = verifyCommitmentId(
91
+ hmacCommitment,
92
+ "iK__u54zqDWrJpVVbf3uYvgvG1hxWZM6Tq1zusfGYIw",
93
+ hmacMessage,
94
+ )
95
+ assert(hmacVerified)
96
+
97
+ // Test 5: Demonstrate HMAC independence from signature
98
+ console.log("\nTest 5: HMAC Independence from RSA Signature")
99
+ const modifiedMessage = {
100
+ ...hmacMessage,
101
+ signature:
102
+ "http-sig-bba7e22451416f77=:AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA=:",
103
+ }
104
+ const hmacIdModified = hmacid(modifiedMessage)
105
+ console.log("HMAC with different RSA signature:", hmacIdModified)
106
+ assert.equal(hmacIdModified, "iK__u54zqDWrJpVVbf3uYvgvG1hxWZM6Tq1zusfGYIw")
107
+
108
+ console.log("\n=== All Tests Completed ===")
109
+ console.log(
110
+ "The HMAC ID is deterministic and depends only on message content,",
111
+ )
112
+ console.log("not on the RSA signature value.")
113
+ })
114
+ })
@@ -0,0 +1,408 @@
1
+ const bin = Buffer.from([1, 2, 3])
2
+ const empty = 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 },
274
+ { body: empty },
275
+ { bin: empty, body: empty },
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 },
340
+ { data: empty, body: empty },
341
+ { bin: empty, data: empty },
342
+ { bin: empty, data: empty, body: empty },
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]