@graffiti-garden/implementation-decentralized 0.0.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.
Files changed (193) hide show
  1. package/LICENSE +674 -0
  2. package/dist/1-services/1-authorization.d.ts +37 -0
  3. package/dist/1-services/1-authorization.d.ts.map +1 -0
  4. package/dist/1-services/2-dids-tests.d.ts +2 -0
  5. package/dist/1-services/2-dids-tests.d.ts.map +1 -0
  6. package/dist/1-services/2-dids.d.ts +9 -0
  7. package/dist/1-services/2-dids.d.ts.map +1 -0
  8. package/dist/1-services/3-storage-buckets-tests.d.ts +2 -0
  9. package/dist/1-services/3-storage-buckets-tests.d.ts.map +1 -0
  10. package/dist/1-services/3-storage-buckets.d.ts +11 -0
  11. package/dist/1-services/3-storage-buckets.d.ts.map +1 -0
  12. package/dist/1-services/4-inboxes-tests.d.ts +2 -0
  13. package/dist/1-services/4-inboxes-tests.d.ts.map +1 -0
  14. package/dist/1-services/4-inboxes.d.ts +87 -0
  15. package/dist/1-services/4-inboxes.d.ts.map +1 -0
  16. package/dist/1-services/utilities.d.ts +7 -0
  17. package/dist/1-services/utilities.d.ts.map +1 -0
  18. package/dist/2-primitives/1-string-encoding-tests.d.ts +2 -0
  19. package/dist/2-primitives/1-string-encoding-tests.d.ts.map +1 -0
  20. package/dist/2-primitives/1-string-encoding.d.ts +6 -0
  21. package/dist/2-primitives/1-string-encoding.d.ts.map +1 -0
  22. package/dist/2-primitives/2-content-addresses-tests.d.ts +2 -0
  23. package/dist/2-primitives/2-content-addresses-tests.d.ts.map +1 -0
  24. package/dist/2-primitives/2-content-addresses.d.ts +8 -0
  25. package/dist/2-primitives/2-content-addresses.d.ts.map +1 -0
  26. package/dist/2-primitives/3-channel-attestations-tests.d.ts +2 -0
  27. package/dist/2-primitives/3-channel-attestations-tests.d.ts.map +1 -0
  28. package/dist/2-primitives/3-channel-attestations.d.ts +13 -0
  29. package/dist/2-primitives/3-channel-attestations.d.ts.map +1 -0
  30. package/dist/2-primitives/4-allowed-attestations-tests.d.ts +2 -0
  31. package/dist/2-primitives/4-allowed-attestations-tests.d.ts.map +1 -0
  32. package/dist/2-primitives/4-allowed-attestations.d.ts +9 -0
  33. package/dist/2-primitives/4-allowed-attestations.d.ts.map +1 -0
  34. package/dist/3-protocol/1-sessions.d.ts +81 -0
  35. package/dist/3-protocol/1-sessions.d.ts.map +1 -0
  36. package/dist/3-protocol/2-handles-tests.d.ts +2 -0
  37. package/dist/3-protocol/2-handles-tests.d.ts.map +1 -0
  38. package/dist/3-protocol/2-handles.d.ts +13 -0
  39. package/dist/3-protocol/2-handles.d.ts.map +1 -0
  40. package/dist/3-protocol/3-object-encoding-tests.d.ts +2 -0
  41. package/dist/3-protocol/3-object-encoding-tests.d.ts.map +1 -0
  42. package/dist/3-protocol/3-object-encoding.d.ts +43 -0
  43. package/dist/3-protocol/3-object-encoding.d.ts.map +1 -0
  44. package/dist/3-protocol/4-graffiti.d.ts +79 -0
  45. package/dist/3-protocol/4-graffiti.d.ts.map +1 -0
  46. package/dist/3-protocol/login-dialog.html.d.ts +2 -0
  47. package/dist/3-protocol/login-dialog.html.d.ts.map +1 -0
  48. package/dist/browser/ajv-QBSREQSI.js +9 -0
  49. package/dist/browser/ajv-QBSREQSI.js.map +7 -0
  50. package/dist/browser/build-BXWPS7VK.js +2 -0
  51. package/dist/browser/build-BXWPS7VK.js.map +7 -0
  52. package/dist/browser/chunk-RFBBAUMM.js +2 -0
  53. package/dist/browser/chunk-RFBBAUMM.js.map +7 -0
  54. package/dist/browser/graffiti-KV3G3O72-URO7SJIJ.js +2 -0
  55. package/dist/browser/graffiti-KV3G3O72-URO7SJIJ.js.map +7 -0
  56. package/dist/browser/index.js +16 -0
  57. package/dist/browser/index.js.map +7 -0
  58. package/dist/browser/login-dialog.html-XUWYDNNI.js +44 -0
  59. package/dist/browser/login-dialog.html-XUWYDNNI.js.map +7 -0
  60. package/dist/browser/rock-salt-LI7DAH66-KPFEBIBO.js +2 -0
  61. package/dist/browser/rock-salt-LI7DAH66-KPFEBIBO.js.map +7 -0
  62. package/dist/browser/style-YUTCEBZV-RWYJV575.js +287 -0
  63. package/dist/browser/style-YUTCEBZV-RWYJV575.js.map +7 -0
  64. package/dist/cjs/1-services/1-authorization.js +317 -0
  65. package/dist/cjs/1-services/1-authorization.js.map +7 -0
  66. package/dist/cjs/1-services/2-dids-tests.js +44 -0
  67. package/dist/cjs/1-services/2-dids-tests.js.map +7 -0
  68. package/dist/cjs/1-services/2-dids.js +47 -0
  69. package/dist/cjs/1-services/2-dids.js.map +7 -0
  70. package/dist/cjs/1-services/3-storage-buckets-tests.js +123 -0
  71. package/dist/cjs/1-services/3-storage-buckets-tests.js.map +7 -0
  72. package/dist/cjs/1-services/3-storage-buckets.js +148 -0
  73. package/dist/cjs/1-services/3-storage-buckets.js.map +7 -0
  74. package/dist/cjs/1-services/4-inboxes-tests.js +145 -0
  75. package/dist/cjs/1-services/4-inboxes-tests.js.map +7 -0
  76. package/dist/cjs/1-services/4-inboxes.js +539 -0
  77. package/dist/cjs/1-services/4-inboxes.js.map +7 -0
  78. package/dist/cjs/1-services/utilities.js +75 -0
  79. package/dist/cjs/1-services/utilities.js.map +7 -0
  80. package/dist/cjs/2-primitives/1-string-encoding-tests.js +50 -0
  81. package/dist/cjs/2-primitives/1-string-encoding-tests.js.map +7 -0
  82. package/dist/cjs/2-primitives/1-string-encoding.js +46 -0
  83. package/dist/cjs/2-primitives/1-string-encoding.js.map +7 -0
  84. package/dist/cjs/2-primitives/2-content-addresses-tests.js +62 -0
  85. package/dist/cjs/2-primitives/2-content-addresses-tests.js.map +7 -0
  86. package/dist/cjs/2-primitives/2-content-addresses.js +53 -0
  87. package/dist/cjs/2-primitives/2-content-addresses.js.map +7 -0
  88. package/dist/cjs/2-primitives/3-channel-attestations-tests.js +130 -0
  89. package/dist/cjs/2-primitives/3-channel-attestations-tests.js.map +7 -0
  90. package/dist/cjs/2-primitives/3-channel-attestations.js +84 -0
  91. package/dist/cjs/2-primitives/3-channel-attestations.js.map +7 -0
  92. package/dist/cjs/2-primitives/4-allowed-attestations-tests.js +96 -0
  93. package/dist/cjs/2-primitives/4-allowed-attestations-tests.js.map +7 -0
  94. package/dist/cjs/2-primitives/4-allowed-attestations.js +68 -0
  95. package/dist/cjs/2-primitives/4-allowed-attestations.js.map +7 -0
  96. package/dist/cjs/3-protocol/1-sessions.js +473 -0
  97. package/dist/cjs/3-protocol/1-sessions.js.map +7 -0
  98. package/dist/cjs/3-protocol/2-handles-tests.js +39 -0
  99. package/dist/cjs/3-protocol/2-handles-tests.js.map +7 -0
  100. package/dist/cjs/3-protocol/2-handles.js +65 -0
  101. package/dist/cjs/3-protocol/2-handles.js.map +7 -0
  102. package/dist/cjs/3-protocol/3-object-encoding-tests.js +253 -0
  103. package/dist/cjs/3-protocol/3-object-encoding-tests.js.map +7 -0
  104. package/dist/cjs/3-protocol/3-object-encoding.js +287 -0
  105. package/dist/cjs/3-protocol/3-object-encoding.js.map +7 -0
  106. package/dist/cjs/3-protocol/4-graffiti.js +937 -0
  107. package/dist/cjs/3-protocol/4-graffiti.js.map +7 -0
  108. package/dist/cjs/3-protocol/login-dialog.html.js +67 -0
  109. package/dist/cjs/3-protocol/login-dialog.html.js.map +7 -0
  110. package/dist/cjs/index.js +32 -0
  111. package/dist/cjs/index.js.map +7 -0
  112. package/dist/cjs/index.spec.js +130 -0
  113. package/dist/cjs/index.spec.js.map +7 -0
  114. package/dist/esm/1-services/1-authorization.js +304 -0
  115. package/dist/esm/1-services/1-authorization.js.map +7 -0
  116. package/dist/esm/1-services/2-dids-tests.js +24 -0
  117. package/dist/esm/1-services/2-dids-tests.js.map +7 -0
  118. package/dist/esm/1-services/2-dids.js +27 -0
  119. package/dist/esm/1-services/2-dids.js.map +7 -0
  120. package/dist/esm/1-services/3-storage-buckets-tests.js +103 -0
  121. package/dist/esm/1-services/3-storage-buckets-tests.js.map +7 -0
  122. package/dist/esm/1-services/3-storage-buckets.js +132 -0
  123. package/dist/esm/1-services/3-storage-buckets.js.map +7 -0
  124. package/dist/esm/1-services/4-inboxes-tests.js +125 -0
  125. package/dist/esm/1-services/4-inboxes-tests.js.map +7 -0
  126. package/dist/esm/1-services/4-inboxes.js +533 -0
  127. package/dist/esm/1-services/4-inboxes.js.map +7 -0
  128. package/dist/esm/1-services/utilities.js +60 -0
  129. package/dist/esm/1-services/utilities.js.map +7 -0
  130. package/dist/esm/2-primitives/1-string-encoding-tests.js +33 -0
  131. package/dist/esm/2-primitives/1-string-encoding-tests.js.map +7 -0
  132. package/dist/esm/2-primitives/1-string-encoding.js +26 -0
  133. package/dist/esm/2-primitives/1-string-encoding.js.map +7 -0
  134. package/dist/esm/2-primitives/2-content-addresses-tests.js +45 -0
  135. package/dist/esm/2-primitives/2-content-addresses-tests.js.map +7 -0
  136. package/dist/esm/2-primitives/2-content-addresses.js +33 -0
  137. package/dist/esm/2-primitives/2-content-addresses.js.map +7 -0
  138. package/dist/esm/2-primitives/3-channel-attestations-tests.js +116 -0
  139. package/dist/esm/2-primitives/3-channel-attestations-tests.js.map +7 -0
  140. package/dist/esm/2-primitives/3-channel-attestations.js +69 -0
  141. package/dist/esm/2-primitives/3-channel-attestations.js.map +7 -0
  142. package/dist/esm/2-primitives/4-allowed-attestations-tests.js +82 -0
  143. package/dist/esm/2-primitives/4-allowed-attestations-tests.js.map +7 -0
  144. package/dist/esm/2-primitives/4-allowed-attestations.js +51 -0
  145. package/dist/esm/2-primitives/4-allowed-attestations.js.map +7 -0
  146. package/dist/esm/3-protocol/1-sessions.js +465 -0
  147. package/dist/esm/3-protocol/1-sessions.js.map +7 -0
  148. package/dist/esm/3-protocol/2-handles-tests.js +19 -0
  149. package/dist/esm/3-protocol/2-handles-tests.js.map +7 -0
  150. package/dist/esm/3-protocol/2-handles.js +45 -0
  151. package/dist/esm/3-protocol/2-handles.js.map +7 -0
  152. package/dist/esm/3-protocol/3-object-encoding-tests.js +248 -0
  153. package/dist/esm/3-protocol/3-object-encoding-tests.js.map +7 -0
  154. package/dist/esm/3-protocol/3-object-encoding.js +280 -0
  155. package/dist/esm/3-protocol/3-object-encoding.js.map +7 -0
  156. package/dist/esm/3-protocol/4-graffiti.js +957 -0
  157. package/dist/esm/3-protocol/4-graffiti.js.map +7 -0
  158. package/dist/esm/3-protocol/login-dialog.html.js +47 -0
  159. package/dist/esm/3-protocol/login-dialog.html.js.map +7 -0
  160. package/dist/esm/index.js +14 -0
  161. package/dist/esm/index.js.map +7 -0
  162. package/dist/esm/index.spec.js +133 -0
  163. package/dist/esm/index.spec.js.map +7 -0
  164. package/dist/index.d.ts +10 -0
  165. package/dist/index.d.ts.map +1 -0
  166. package/dist/index.spec.d.ts +2 -0
  167. package/dist/index.spec.d.ts.map +1 -0
  168. package/package.json +62 -0
  169. package/src/1-services/1-authorization.ts +399 -0
  170. package/src/1-services/2-dids-tests.ts +24 -0
  171. package/src/1-services/2-dids.ts +30 -0
  172. package/src/1-services/3-storage-buckets-tests.ts +121 -0
  173. package/src/1-services/3-storage-buckets.ts +183 -0
  174. package/src/1-services/4-inboxes-tests.ts +154 -0
  175. package/src/1-services/4-inboxes.ts +722 -0
  176. package/src/1-services/utilities.ts +65 -0
  177. package/src/2-primitives/1-string-encoding-tests.ts +33 -0
  178. package/src/2-primitives/1-string-encoding.ts +33 -0
  179. package/src/2-primitives/2-content-addresses-tests.ts +46 -0
  180. package/src/2-primitives/2-content-addresses.ts +42 -0
  181. package/src/2-primitives/3-channel-attestations-tests.ts +125 -0
  182. package/src/2-primitives/3-channel-attestations.ts +95 -0
  183. package/src/2-primitives/4-allowed-attestations-tests.ts +86 -0
  184. package/src/2-primitives/4-allowed-attestations.ts +69 -0
  185. package/src/3-protocol/1-sessions.ts +601 -0
  186. package/src/3-protocol/2-handles-tests.ts +17 -0
  187. package/src/3-protocol/2-handles.ts +60 -0
  188. package/src/3-protocol/3-object-encoding-tests.ts +269 -0
  189. package/src/3-protocol/3-object-encoding.ts +396 -0
  190. package/src/3-protocol/4-graffiti.ts +1265 -0
  191. package/src/3-protocol/login-dialog.html.ts +43 -0
  192. package/src/index.spec.ts +158 -0
  193. package/src/index.ts +16 -0
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../src/1-services/utilities.ts"],
4
+ "sourcesContent": ["import {\n GraffitiErrorCursorExpired,\n GraffitiErrorForbidden,\n GraffitiErrorNotFound,\n GraffitiErrorTooLarge,\n} from \"@graffiti-garden/api\";\n\nconst SERVICE_ENDPOINT_PREFIX_HTTPS = \"https://\";\nexport function verifyHTTPSEndpoint(endpoint: string): void {\n if (!endpoint.startsWith(SERVICE_ENDPOINT_PREFIX_HTTPS)) {\n throw new Error(\"Unrecognized storage bucket endpoint type\");\n }\n}\n\nexport async function getAuthorizationEndpoint(\n serviceEndpoint: string,\n): Promise<string> {\n verifyHTTPSEndpoint(serviceEndpoint);\n const authUrl = `${serviceEndpoint}/auth`;\n\n const response = await fetch(authUrl);\n if (!response.ok) {\n throw new Error(\"Failed to get storage bucket authorization endpoint\");\n }\n return await response.text();\n}\n\nexport class GraffitiErrorUnauthorized extends Error {\n constructor(message?: string) {\n super(message);\n this.name = \"GraffitiErrorUnauthorized\";\n Object.setPrototypeOf(this, GraffitiErrorUnauthorized.prototype);\n }\n}\n\nexport async function fetchWithErrorHandling(\n ...args: Parameters<typeof fetch>\n) {\n const response = await fetch(...args);\n\n if (!response.ok) {\n let errorText: string;\n try {\n errorText = await response.text();\n } catch {\n errorText = response.statusText;\n }\n\n if (response.status === 401) {\n throw new GraffitiErrorUnauthorized(errorText);\n } else if (response.status === 403) {\n throw new GraffitiErrorForbidden(errorText);\n } else if (response.status === 404) {\n throw new GraffitiErrorNotFound(errorText);\n } else if (response.status === 410) {\n throw new GraffitiErrorCursorExpired(errorText);\n } else if (response.status === 413) {\n throw new GraffitiErrorTooLarge(errorText);\n } else {\n throw new Error(errorText);\n }\n }\n\n return response;\n}\n"],
5
+ "mappings": ";;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,iBAKO;AAEP,MAAM,gCAAgC;AAC/B,SAAS,oBAAoB,UAAwB;AAC1D,MAAI,CAAC,SAAS,WAAW,6BAA6B,GAAG;AACvD,UAAM,IAAI,MAAM,2CAA2C;AAAA,EAC7D;AACF;AAEA,eAAsB,yBACpB,iBACiB;AACjB,sBAAoB,eAAe;AACnC,QAAM,UAAU,GAAG,eAAe;AAElC,QAAM,WAAW,MAAM,MAAM,OAAO;AACpC,MAAI,CAAC,SAAS,IAAI;AAChB,UAAM,IAAI,MAAM,qDAAqD;AAAA,EACvE;AACA,SAAO,MAAM,SAAS,KAAK;AAC7B;AAEO,MAAM,kCAAkC,MAAM;AAAA,EACnD,YAAY,SAAkB;AAC5B,UAAM,OAAO;AACb,SAAK,OAAO;AACZ,WAAO,eAAe,MAAM,0BAA0B,SAAS;AAAA,EACjE;AACF;AAEA,eAAsB,0BACjB,MACH;AACA,QAAM,WAAW,MAAM,MAAM,GAAG,IAAI;AAEpC,MAAI,CAAC,SAAS,IAAI;AAChB,QAAI;AACJ,QAAI;AACF,kBAAY,MAAM,SAAS,KAAK;AAAA,IAClC,QAAQ;AACN,kBAAY,SAAS;AAAA,IACvB;AAEA,QAAI,SAAS,WAAW,KAAK;AAC3B,YAAM,IAAI,0BAA0B,SAAS;AAAA,IAC/C,WAAW,SAAS,WAAW,KAAK;AAClC,YAAM,IAAI,kCAAuB,SAAS;AAAA,IAC5C,WAAW,SAAS,WAAW,KAAK;AAClC,YAAM,IAAI,iCAAsB,SAAS;AAAA,IAC3C,WAAW,SAAS,WAAW,KAAK;AAClC,YAAM,IAAI,sCAA2B,SAAS;AAAA,IAChD,WAAW,SAAS,WAAW,KAAK;AAClC,YAAM,IAAI,iCAAsB,SAAS;AAAA,IAC3C,OAAO;AACL,YAAM,IAAI,MAAM,SAAS;AAAA,IAC3B;AAAA,EACF;AAEA,SAAO;AACT;",
6
+ "names": []
7
+ }
@@ -0,0 +1,50 @@
1
+ "use strict";
2
+ var __defProp = Object.defineProperty;
3
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
4
+ var __getOwnPropNames = Object.getOwnPropertyNames;
5
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
6
+ var __export = (target, all) => {
7
+ for (var name in all)
8
+ __defProp(target, name, { get: all[name], enumerable: true });
9
+ };
10
+ var __copyProps = (to, from, except, desc) => {
11
+ if (from && typeof from === "object" || typeof from === "function") {
12
+ for (let key of __getOwnPropNames(from))
13
+ if (!__hasOwnProp.call(to, key) && key !== except)
14
+ __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
15
+ }
16
+ return to;
17
+ };
18
+ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
19
+ var string_encoding_tests_exports = {};
20
+ __export(string_encoding_tests_exports, {
21
+ stringEncodingTests: () => stringEncodingTests
22
+ });
23
+ module.exports = __toCommonJS(string_encoding_tests_exports);
24
+ var import_vitest = require("vitest");
25
+ var import_string_encoding = require("./1-string-encoding");
26
+ var import_utils = require("@noble/hashes/utils.js");
27
+ function stringEncodingTests() {
28
+ (0, import_vitest.describe)("String encoding tests", () => {
29
+ const stringEncodingMethods = [import_string_encoding.STRING_ENCODER_METHOD_BASE64URL];
30
+ const stringEncoder = new import_string_encoding.StringEncoder();
31
+ (0, import_vitest.test)("Invalid string decoding method", async () => {
32
+ const bytes = (0, import_utils.randomBytes)();
33
+ await (0, import_vitest.expect)(
34
+ () => stringEncoder.encode("invalid-method", bytes)
35
+ ).rejects.toThrow();
36
+ });
37
+ for (const method of stringEncodingMethods) {
38
+ (0, import_vitest.describe)(`String Encoding Method: ${method}`, () => {
39
+ (0, import_vitest.test)("encodes and decodes strings correctly", async () => {
40
+ const bytes = (0, import_utils.randomBytes)();
41
+ const encoded = await stringEncoder.encode(method, bytes);
42
+ const decoded = await stringEncoder.decode(encoded);
43
+ (0, import_vitest.expect)(decoded).toEqual(bytes);
44
+ (0, import_vitest.expect)(decoded).not.toEqual((0, import_utils.randomBytes)());
45
+ });
46
+ });
47
+ }
48
+ });
49
+ }
50
+ //# sourceMappingURL=1-string-encoding-tests.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../src/2-primitives/1-string-encoding-tests.ts"],
4
+ "sourcesContent": ["import { describe, expect, test } from \"vitest\";\nimport {\n STRING_ENCODER_METHOD_BASE64URL,\n StringEncoder,\n} from \"./1-string-encoding\";\nimport { randomBytes } from \"@noble/hashes/utils.js\";\n\nexport function stringEncodingTests() {\n describe(\"String encoding tests\", () => {\n const stringEncodingMethods = [STRING_ENCODER_METHOD_BASE64URL];\n const stringEncoder = new StringEncoder();\n\n test(\"Invalid string decoding method\", async () => {\n const bytes = randomBytes();\n await expect(() =>\n stringEncoder.encode(\"invalid-method\", bytes),\n ).rejects.toThrow();\n });\n\n for (const method of stringEncodingMethods) {\n describe(`String Encoding Method: ${method}`, () => {\n test(\"encodes and decodes strings correctly\", async () => {\n const bytes = randomBytes();\n const encoded = await stringEncoder.encode(method, bytes);\n const decoded = await stringEncoder.decode(encoded);\n\n expect(decoded).toEqual(bytes);\n expect(decoded).not.toEqual(randomBytes());\n });\n });\n }\n });\n}\n"],
5
+ "mappings": ";;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,oBAAuC;AACvC,6BAGO;AACP,mBAA4B;AAErB,SAAS,sBAAsB;AACpC,8BAAS,yBAAyB,MAAM;AACtC,UAAM,wBAAwB,CAAC,sDAA+B;AAC9D,UAAM,gBAAgB,IAAI,qCAAc;AAExC,4BAAK,kCAAkC,YAAY;AACjD,YAAM,YAAQ,0BAAY;AAC1B,gBAAM;AAAA,QAAO,MACX,cAAc,OAAO,kBAAkB,KAAK;AAAA,MAC9C,EAAE,QAAQ,QAAQ;AAAA,IACpB,CAAC;AAED,eAAW,UAAU,uBAAuB;AAC1C,kCAAS,2BAA2B,MAAM,IAAI,MAAM;AAClD,gCAAK,yCAAyC,YAAY;AACxD,gBAAM,YAAQ,0BAAY;AAC1B,gBAAM,UAAU,MAAM,cAAc,OAAO,QAAQ,KAAK;AACxD,gBAAM,UAAU,MAAM,cAAc,OAAO,OAAO;AAElD,oCAAO,OAAO,EAAE,QAAQ,KAAK;AAC7B,oCAAO,OAAO,EAAE,IAAI,YAAQ,0BAAY,CAAC;AAAA,QAC3C,CAAC;AAAA,MACH,CAAC;AAAA,IACH;AAAA,EACF,CAAC;AACH;",
6
+ "names": []
7
+ }
@@ -0,0 +1,46 @@
1
+ "use strict";
2
+ var __defProp = Object.defineProperty;
3
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
4
+ var __getOwnPropNames = Object.getOwnPropertyNames;
5
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
6
+ var __export = (target, all) => {
7
+ for (var name in all)
8
+ __defProp(target, name, { get: all[name], enumerable: true });
9
+ };
10
+ var __copyProps = (to, from, except, desc) => {
11
+ if (from && typeof from === "object" || typeof from === "function") {
12
+ for (let key of __getOwnPropNames(from))
13
+ if (!__hasOwnProp.call(to, key) && key !== except)
14
+ __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
15
+ }
16
+ return to;
17
+ };
18
+ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
19
+ var string_encoding_exports = {};
20
+ __export(string_encoding_exports, {
21
+ STRING_ENCODER_METHOD_BASE64URL: () => STRING_ENCODER_METHOD_BASE64URL,
22
+ StringEncoder: () => StringEncoder
23
+ });
24
+ module.exports = __toCommonJS(string_encoding_exports);
25
+ const STRING_ENCODER_METHOD_BASE64URL = "base64url";
26
+ const STRING_ENCODER_PREFIX_BASE64URL = "u";
27
+ class StringEncoder {
28
+ async encode(method, bytes) {
29
+ if (method !== STRING_ENCODER_METHOD_BASE64URL) {
30
+ throw new Error(`Unsupported string encoding method: ${method}`);
31
+ }
32
+ const base64 = btoa(String.fromCodePoint(...bytes));
33
+ const encoded = base64.replace(/\+/g, "-").replace(/\//g, "_").replace(/\=+$/, "");
34
+ return STRING_ENCODER_PREFIX_BASE64URL + encoded;
35
+ }
36
+ async decode(base64Url) {
37
+ if (!base64Url.startsWith(STRING_ENCODER_PREFIX_BASE64URL)) {
38
+ throw new Error(`Unsupported string encoding prefix: ${base64Url[0]}`);
39
+ }
40
+ base64Url = base64Url.slice(1);
41
+ let base64 = base64Url.replace(/-/g, "+").replace(/_/g, "/");
42
+ while (base64.length % 4 !== 0) base64 += "=";
43
+ return Uint8Array.from(atob(base64), (c) => c.charCodeAt(0));
44
+ }
45
+ }
46
+ //# sourceMappingURL=1-string-encoding.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../src/2-primitives/1-string-encoding.ts"],
4
+ "sourcesContent": ["// https://github.com/multiformats/multibase/blob/master/multibase.csv\nexport const STRING_ENCODER_METHOD_BASE64URL = \"base64url\";\nconst STRING_ENCODER_PREFIX_BASE64URL = \"u\";\n\nexport class StringEncoder {\n async encode(method: string, bytes: Uint8Array): Promise<string> {\n if (method !== STRING_ENCODER_METHOD_BASE64URL) {\n throw new Error(`Unsupported string encoding method: ${method}`);\n }\n // Convert it to base64\n const base64 = btoa(String.fromCodePoint(...bytes));\n // Make sure it is url safe\n const encoded = base64\n .replace(/\\+/g, \"-\")\n .replace(/\\//g, \"_\")\n .replace(/\\=+$/, \"\");\n // Append method prefix\n return STRING_ENCODER_PREFIX_BASE64URL + encoded;\n }\n\n async decode(base64Url: string): Promise<Uint8Array> {\n if (!base64Url.startsWith(STRING_ENCODER_PREFIX_BASE64URL)) {\n throw new Error(`Unsupported string encoding prefix: ${base64Url[0]}`);\n }\n base64Url = base64Url.slice(1);\n // Undo url-safe base64\n let base64 = base64Url.replace(/-/g, \"+\").replace(/_/g, \"/\");\n // Add padding if necessary\n while (base64.length % 4 !== 0) base64 += \"=\";\n // Decode\n return Uint8Array.from(atob(base64), (c) => c.charCodeAt(0));\n }\n}\n"],
5
+ "mappings": ";;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AACO,MAAM,kCAAkC;AAC/C,MAAM,kCAAkC;AAEjC,MAAM,cAAc;AAAA,EACzB,MAAM,OAAO,QAAgB,OAAoC;AAC/D,QAAI,WAAW,iCAAiC;AAC9C,YAAM,IAAI,MAAM,uCAAuC,MAAM,EAAE;AAAA,IACjE;AAEA,UAAM,SAAS,KAAK,OAAO,cAAc,GAAG,KAAK,CAAC;AAElD,UAAM,UAAU,OACb,QAAQ,OAAO,GAAG,EAClB,QAAQ,OAAO,GAAG,EAClB,QAAQ,QAAQ,EAAE;AAErB,WAAO,kCAAkC;AAAA,EAC3C;AAAA,EAEA,MAAM,OAAO,WAAwC;AACnD,QAAI,CAAC,UAAU,WAAW,+BAA+B,GAAG;AAC1D,YAAM,IAAI,MAAM,uCAAuC,UAAU,CAAC,CAAC,EAAE;AAAA,IACvE;AACA,gBAAY,UAAU,MAAM,CAAC;AAE7B,QAAI,SAAS,UAAU,QAAQ,MAAM,GAAG,EAAE,QAAQ,MAAM,GAAG;AAE3D,WAAO,OAAO,SAAS,MAAM,EAAG,WAAU;AAE1C,WAAO,WAAW,KAAK,KAAK,MAAM,GAAG,CAAC,MAAM,EAAE,WAAW,CAAC,CAAC;AAAA,EAC7D;AACF;",
6
+ "names": []
7
+ }
@@ -0,0 +1,62 @@
1
+ "use strict";
2
+ var __defProp = Object.defineProperty;
3
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
4
+ var __getOwnPropNames = Object.getOwnPropertyNames;
5
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
6
+ var __export = (target, all) => {
7
+ for (var name in all)
8
+ __defProp(target, name, { get: all[name], enumerable: true });
9
+ };
10
+ var __copyProps = (to, from, except, desc) => {
11
+ if (from && typeof from === "object" || typeof from === "function") {
12
+ for (let key of __getOwnPropNames(from))
13
+ if (!__hasOwnProp.call(to, key) && key !== except)
14
+ __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
15
+ }
16
+ return to;
17
+ };
18
+ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
19
+ var content_addresses_tests_exports = {};
20
+ __export(content_addresses_tests_exports, {
21
+ contentAddressesTests: () => contentAddressesTests
22
+ });
23
+ module.exports = __toCommonJS(content_addresses_tests_exports);
24
+ var import_vitest = require("vitest");
25
+ var import_content_addresses = require("./2-content-addresses");
26
+ var import_utils = require("@noble/hashes/utils.js");
27
+ function contentAddressesTests() {
28
+ (0, import_vitest.describe)("Content Address Tests", () => {
29
+ const contentAddressMethods = [import_content_addresses.CONTENT_ADDRESS_METHOD_SHA256];
30
+ const contentAddresses = new import_content_addresses.ContentAddresses();
31
+ (0, import_vitest.test)("Invalid content address method", async () => {
32
+ const bytes = (0, import_utils.randomBytes)();
33
+ await (0, import_vitest.expect)(
34
+ () => contentAddresses.register("invalid-method", bytes)
35
+ ).rejects.toThrow();
36
+ });
37
+ for (const method of contentAddressMethods) {
38
+ (0, import_vitest.describe)(`Content Address Method: ${method}`, () => {
39
+ (0, import_vitest.test)("idempotent addresses", async () => {
40
+ const bytes = (0, import_utils.randomBytes)();
41
+ const address1 = await contentAddresses.register(method, bytes);
42
+ const address2 = await contentAddresses.register(method, bytes);
43
+ (0, import_vitest.expect)(address1).toEqual(address2);
44
+ });
45
+ (0, import_vitest.test)("unique adddresses", async () => {
46
+ const bytes1 = (0, import_utils.randomBytes)();
47
+ const bytes2 = (0, import_utils.randomBytes)();
48
+ const address1 = await contentAddresses.register(method, bytes1);
49
+ const address2 = await contentAddresses.register(method, bytes2);
50
+ (0, import_vitest.expect)(address1).not.toEqual(address2);
51
+ });
52
+ (0, import_vitest.test)("get method", async () => {
53
+ const bytes = (0, import_utils.randomBytes)();
54
+ const address = await contentAddresses.register(method, bytes);
55
+ const retrievedMethod = await contentAddresses.getMethod(address);
56
+ (0, import_vitest.expect)(retrievedMethod).toEqual(method);
57
+ });
58
+ });
59
+ }
60
+ });
61
+ }
62
+ //# sourceMappingURL=2-content-addresses-tests.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../src/2-primitives/2-content-addresses-tests.ts"],
4
+ "sourcesContent": ["import { describe, expect, test } from \"vitest\";\nimport {\n CONTENT_ADDRESS_METHOD_SHA256,\n ContentAddresses,\n} from \"./2-content-addresses\";\nimport { randomBytes } from \"@noble/hashes/utils.js\";\n\nexport function contentAddressesTests() {\n describe(\"Content Address Tests\", () => {\n const contentAddressMethods = [CONTENT_ADDRESS_METHOD_SHA256];\n const contentAddresses = new ContentAddresses();\n\n test(\"Invalid content address method\", async () => {\n const bytes = randomBytes();\n await expect(() =>\n contentAddresses.register(\"invalid-method\", bytes),\n ).rejects.toThrow();\n });\n\n for (const method of contentAddressMethods) {\n describe(`Content Address Method: ${method}`, () => {\n test(\"idempotent addresses\", async () => {\n const bytes = randomBytes();\n const address1 = await contentAddresses.register(method, bytes);\n const address2 = await contentAddresses.register(method, bytes);\n expect(address1).toEqual(address2);\n });\n\n test(\"unique adddresses\", async () => {\n const bytes1 = randomBytes();\n const bytes2 = randomBytes();\n const address1 = await contentAddresses.register(method, bytes1);\n const address2 = await contentAddresses.register(method, bytes2);\n expect(address1).not.toEqual(address2);\n });\n\n test(\"get method\", async () => {\n const bytes = randomBytes();\n const address = await contentAddresses.register(method, bytes);\n const retrievedMethod = await contentAddresses.getMethod(address);\n expect(retrievedMethod).toEqual(method);\n });\n });\n }\n });\n}\n"],
5
+ "mappings": ";;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,oBAAuC;AACvC,+BAGO;AACP,mBAA4B;AAErB,SAAS,wBAAwB;AACtC,8BAAS,yBAAyB,MAAM;AACtC,UAAM,wBAAwB,CAAC,sDAA6B;AAC5D,UAAM,mBAAmB,IAAI,0CAAiB;AAE9C,4BAAK,kCAAkC,YAAY;AACjD,YAAM,YAAQ,0BAAY;AAC1B,gBAAM;AAAA,QAAO,MACX,iBAAiB,SAAS,kBAAkB,KAAK;AAAA,MACnD,EAAE,QAAQ,QAAQ;AAAA,IACpB,CAAC;AAED,eAAW,UAAU,uBAAuB;AAC1C,kCAAS,2BAA2B,MAAM,IAAI,MAAM;AAClD,gCAAK,wBAAwB,YAAY;AACvC,gBAAM,YAAQ,0BAAY;AAC1B,gBAAM,WAAW,MAAM,iBAAiB,SAAS,QAAQ,KAAK;AAC9D,gBAAM,WAAW,MAAM,iBAAiB,SAAS,QAAQ,KAAK;AAC9D,oCAAO,QAAQ,EAAE,QAAQ,QAAQ;AAAA,QACnC,CAAC;AAED,gCAAK,qBAAqB,YAAY;AACpC,gBAAM,aAAS,0BAAY;AAC3B,gBAAM,aAAS,0BAAY;AAC3B,gBAAM,WAAW,MAAM,iBAAiB,SAAS,QAAQ,MAAM;AAC/D,gBAAM,WAAW,MAAM,iBAAiB,SAAS,QAAQ,MAAM;AAC/D,oCAAO,QAAQ,EAAE,IAAI,QAAQ,QAAQ;AAAA,QACvC,CAAC;AAED,gCAAK,cAAc,YAAY;AAC7B,gBAAM,YAAQ,0BAAY;AAC1B,gBAAM,UAAU,MAAM,iBAAiB,SAAS,QAAQ,KAAK;AAC7D,gBAAM,kBAAkB,MAAM,iBAAiB,UAAU,OAAO;AAChE,oCAAO,eAAe,EAAE,QAAQ,MAAM;AAAA,QACxC,CAAC;AAAA,MACH,CAAC;AAAA,IACH;AAAA,EACF,CAAC;AACH;",
6
+ "names": []
7
+ }
@@ -0,0 +1,53 @@
1
+ "use strict";
2
+ var __defProp = Object.defineProperty;
3
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
4
+ var __getOwnPropNames = Object.getOwnPropertyNames;
5
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
6
+ var __export = (target, all) => {
7
+ for (var name in all)
8
+ __defProp(target, name, { get: all[name], enumerable: true });
9
+ };
10
+ var __copyProps = (to, from, except, desc) => {
11
+ if (from && typeof from === "object" || typeof from === "function") {
12
+ for (let key of __getOwnPropNames(from))
13
+ if (!__hasOwnProp.call(to, key) && key !== except)
14
+ __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
15
+ }
16
+ return to;
17
+ };
18
+ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
19
+ var content_addresses_exports = {};
20
+ __export(content_addresses_exports, {
21
+ CONTENT_ADDRESS_METHOD_SHA256: () => CONTENT_ADDRESS_METHOD_SHA256,
22
+ ContentAddresses: () => ContentAddresses,
23
+ MULTIHASH_CODE_SHA256: () => MULTIHASH_CODE_SHA256,
24
+ MULTIHASH_LENGTH_SHA256: () => MULTIHASH_LENGTH_SHA256
25
+ });
26
+ module.exports = __toCommonJS(content_addresses_exports);
27
+ var import_webcrypto = require("@noble/hashes/webcrypto.js");
28
+ const CONTENT_ADDRESS_METHOD_SHA256 = "sha2-256";
29
+ const MULTIHASH_CODE_SHA256 = 18;
30
+ const MULTIHASH_LENGTH_SHA256 = 32;
31
+ class ContentAddresses {
32
+ async register(contentAddressMethod, data) {
33
+ if (contentAddressMethod !== CONTENT_ADDRESS_METHOD_SHA256) {
34
+ throw new Error(
35
+ `Unsupported content address method: ${contentAddressMethod}`
36
+ );
37
+ }
38
+ const hash = await (0, import_webcrypto.sha256)(data);
39
+ const prefixedHash = new Uint8Array(2 + hash.length);
40
+ prefixedHash[0] = MULTIHASH_CODE_SHA256;
41
+ prefixedHash[1] = MULTIHASH_LENGTH_SHA256;
42
+ prefixedHash.set(hash, 2);
43
+ return prefixedHash;
44
+ }
45
+ async getMethod(contentAddress) {
46
+ if (contentAddress[0] === MULTIHASH_CODE_SHA256 && contentAddress[1] === MULTIHASH_LENGTH_SHA256 && contentAddress.length === 2 + MULTIHASH_LENGTH_SHA256) {
47
+ return CONTENT_ADDRESS_METHOD_SHA256;
48
+ } else {
49
+ throw new Error(`Unrecognized content address format.`);
50
+ }
51
+ }
52
+ }
53
+ //# sourceMappingURL=2-content-addresses.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../src/2-primitives/2-content-addresses.ts"],
4
+ "sourcesContent": ["import { sha256 } from \"@noble/hashes/webcrypto.js\";\n\nexport const CONTENT_ADDRESS_METHOD_SHA256 = \"sha2-256\";\n\n// Multihash code and length for SHA2-256\n// https://multiformats.io/multihash/#sha2-256---256-bits-aka-sha256\nexport const MULTIHASH_CODE_SHA256 = 0x12;\nexport const MULTIHASH_LENGTH_SHA256 = 32;\n\nexport class ContentAddresses {\n async register(\n contentAddressMethod: string,\n data: Uint8Array,\n ): Promise<Uint8Array> {\n if (contentAddressMethod !== CONTENT_ADDRESS_METHOD_SHA256) {\n throw new Error(\n `Unsupported content address method: ${contentAddressMethod}`,\n );\n }\n\n const hash = await sha256(data);\n\n const prefixedHash = new Uint8Array(2 + hash.length);\n prefixedHash[0] = MULTIHASH_CODE_SHA256;\n prefixedHash[1] = MULTIHASH_LENGTH_SHA256;\n prefixedHash.set(hash, 2);\n\n return prefixedHash;\n }\n\n async getMethod(contentAddress: Uint8Array): Promise<string> {\n if (\n contentAddress[0] === MULTIHASH_CODE_SHA256 &&\n contentAddress[1] === MULTIHASH_LENGTH_SHA256 &&\n contentAddress.length === 2 + MULTIHASH_LENGTH_SHA256\n ) {\n return CONTENT_ADDRESS_METHOD_SHA256;\n } else {\n throw new Error(`Unrecognized content address format.`);\n }\n }\n}\n"],
5
+ "mappings": ";;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,uBAAuB;AAEhB,MAAM,gCAAgC;AAItC,MAAM,wBAAwB;AAC9B,MAAM,0BAA0B;AAEhC,MAAM,iBAAiB;AAAA,EAC5B,MAAM,SACJ,sBACA,MACqB;AACrB,QAAI,yBAAyB,+BAA+B;AAC1D,YAAM,IAAI;AAAA,QACR,uCAAuC,oBAAoB;AAAA,MAC7D;AAAA,IACF;AAEA,UAAM,OAAO,UAAM,yBAAO,IAAI;AAE9B,UAAM,eAAe,IAAI,WAAW,IAAI,KAAK,MAAM;AACnD,iBAAa,CAAC,IAAI;AAClB,iBAAa,CAAC,IAAI;AAClB,iBAAa,IAAI,MAAM,CAAC;AAExB,WAAO;AAAA,EACT;AAAA,EAEA,MAAM,UAAU,gBAA6C;AAC3D,QACE,eAAe,CAAC,MAAM,yBACtB,eAAe,CAAC,MAAM,2BACtB,eAAe,WAAW,IAAI,yBAC9B;AACA,aAAO;AAAA,IACT,OAAO;AACL,YAAM,IAAI,MAAM,sCAAsC;AAAA,IACxD;AAAA,EACF;AACF;",
6
+ "names": []
7
+ }
@@ -0,0 +1,130 @@
1
+ "use strict";
2
+ var __defProp = Object.defineProperty;
3
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
4
+ var __getOwnPropNames = Object.getOwnPropertyNames;
5
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
6
+ var __export = (target, all) => {
7
+ for (var name in all)
8
+ __defProp(target, name, { get: all[name], enumerable: true });
9
+ };
10
+ var __copyProps = (to, from, except, desc) => {
11
+ if (from && typeof from === "object" || typeof from === "function") {
12
+ for (let key of __getOwnPropNames(from))
13
+ if (!__hasOwnProp.call(to, key) && key !== except)
14
+ __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
15
+ }
16
+ return to;
17
+ };
18
+ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
19
+ var channel_attestations_tests_exports = {};
20
+ __export(channel_attestations_tests_exports, {
21
+ channelAttestationTests: () => channelAttestationTests
22
+ });
23
+ module.exports = __toCommonJS(channel_attestations_tests_exports);
24
+ var import_vitest = require("vitest");
25
+ var import_channel_attestations = require("./3-channel-attestations");
26
+ var import_utils = require("@noble/hashes/utils.js");
27
+ var import_string_encoding = require("./1-string-encoding");
28
+ function channelAttestationTests() {
29
+ (0, import_vitest.describe)("Channel Attestation Tests", () => {
30
+ const allowedAttestationMethods = [
31
+ import_channel_attestations.CHANNEL_ATTESTATION_METHOD_SHA256_ED25519
32
+ ];
33
+ const channelAttestations = new import_channel_attestations.ChannelAttestations();
34
+ async function randomActor() {
35
+ const bytes = (0, import_utils.randomBytes)();
36
+ const str = await new import_string_encoding.StringEncoder().encode(
37
+ import_string_encoding.STRING_ENCODER_METHOD_BASE64URL,
38
+ bytes
39
+ );
40
+ return `did:web:${str}.com`;
41
+ }
42
+ async function randomChannel() {
43
+ const bytes = (0, import_utils.randomBytes)();
44
+ return await new import_string_encoding.StringEncoder().encode(
45
+ import_string_encoding.STRING_ENCODER_METHOD_BASE64URL,
46
+ bytes
47
+ );
48
+ }
49
+ (0, import_vitest.test)("Invalid attestation method", async () => {
50
+ const actor = await randomActor();
51
+ await (0, import_vitest.expect)(
52
+ () => channelAttestations.register("invalid-method", actor)
53
+ ).rejects.toThrow();
54
+ });
55
+ for (const method of allowedAttestationMethods) {
56
+ (0, import_vitest.describe)(`Attestation Method: ${method}`, () => {
57
+ (0, import_vitest.test)("get method", async () => {
58
+ const channel = await randomChannel();
59
+ const publicId = await channelAttestations.register(method, channel);
60
+ const methodReturned = await channelAttestations.getMethod(publicId);
61
+ (0, import_vitest.expect)(methodReturned).toEqual(method);
62
+ });
63
+ (0, import_vitest.test)("Idempotent public Ids", async () => {
64
+ const channel = await randomChannel();
65
+ const publicId1 = await channelAttestations.register(method, channel);
66
+ const publicId2 = await channelAttestations.register(method, channel);
67
+ (0, import_vitest.expect)(publicId1).toEqual(publicId2);
68
+ });
69
+ (0, import_vitest.test)("Unique public ids", async () => {
70
+ const channel1 = await randomChannel();
71
+ const channel2 = await randomChannel();
72
+ const publicId1 = await channelAttestations.register(
73
+ method,
74
+ channel1
75
+ );
76
+ const publicId2 = await channelAttestations.register(
77
+ method,
78
+ channel2
79
+ );
80
+ (0, import_vitest.expect)(publicId1).not.toEqual(publicId2);
81
+ });
82
+ (0, import_vitest.test)("Valid attestation", async () => {
83
+ const actor = await randomActor();
84
+ const channel = await randomChannel();
85
+ const { attestation, channelPublicId } = await channelAttestations.attest(method, actor, channel);
86
+ const isValid = await channelAttestations.validate(
87
+ attestation,
88
+ actor,
89
+ channelPublicId
90
+ );
91
+ (0, import_vitest.expect)(isValid).toBe(true);
92
+ const channelPublicIdSeperate = await channelAttestations.register(
93
+ method,
94
+ channel
95
+ );
96
+ (0, import_vitest.expect)(channelPublicId).toEqual(channelPublicIdSeperate);
97
+ });
98
+ (0, import_vitest.test)("Invalid attestation with wrong actor", async () => {
99
+ const actor = await randomActor();
100
+ const wrongActor = await randomActor();
101
+ const channel = await randomChannel();
102
+ const { attestation, channelPublicId } = await channelAttestations.attest(method, actor, channel);
103
+ const isValid = await channelAttestations.validate(
104
+ attestation,
105
+ wrongActor,
106
+ channelPublicId
107
+ );
108
+ (0, import_vitest.expect)(isValid).toBe(false);
109
+ });
110
+ (0, import_vitest.test)("Invalid attestation with wrong channel", async () => {
111
+ const actor = await randomActor();
112
+ const channel = await randomChannel();
113
+ const wrongChannel = await randomChannel();
114
+ const { attestation, channelPublicId } = await channelAttestations.attest(method, actor, channel);
115
+ const wrongChannelPublicId = await channelAttestations.register(
116
+ method,
117
+ wrongChannel
118
+ );
119
+ const isValid = await channelAttestations.validate(
120
+ attestation,
121
+ actor,
122
+ wrongChannelPublicId
123
+ );
124
+ (0, import_vitest.expect)(isValid).toBe(false);
125
+ });
126
+ });
127
+ }
128
+ });
129
+ }
130
+ //# sourceMappingURL=3-channel-attestations-tests.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../src/2-primitives/3-channel-attestations-tests.ts"],
4
+ "sourcesContent": ["import { describe, expect, test } from \"vitest\";\nimport {\n CHANNEL_ATTESTATION_METHOD_SHA256_ED25519,\n ChannelAttestations,\n} from \"./3-channel-attestations\";\nimport { randomBytes } from \"@noble/hashes/utils.js\";\nimport {\n StringEncoder,\n STRING_ENCODER_METHOD_BASE64URL,\n} from \"./1-string-encoding\";\n\nexport function channelAttestationTests() {\n describe(\"Channel Attestation Tests\", () => {\n const allowedAttestationMethods = [\n CHANNEL_ATTESTATION_METHOD_SHA256_ED25519,\n ];\n const channelAttestations = new ChannelAttestations();\n\n async function randomActor() {\n const bytes = randomBytes();\n const str = await new StringEncoder().encode(\n STRING_ENCODER_METHOD_BASE64URL,\n bytes,\n );\n return `did:web:${str}.com`;\n }\n async function randomChannel() {\n const bytes = randomBytes();\n return await new StringEncoder().encode(\n STRING_ENCODER_METHOD_BASE64URL,\n bytes,\n );\n }\n\n test(\"Invalid attestation method\", async () => {\n const actor = await randomActor();\n await expect(() =>\n channelAttestations.register(\"invalid-method\", actor),\n ).rejects.toThrow();\n });\n\n for (const method of allowedAttestationMethods) {\n describe(`Attestation Method: ${method}`, () => {\n test(\"get method\", async () => {\n const channel = await randomChannel();\n const publicId = await channelAttestations.register(method, channel);\n const methodReturned = await channelAttestations.getMethod(publicId);\n expect(methodReturned).toEqual(method);\n });\n\n test(\"Idempotent public Ids\", async () => {\n const channel = await randomChannel();\n const publicId1 = await channelAttestations.register(method, channel);\n const publicId2 = await channelAttestations.register(method, channel);\n expect(publicId1).toEqual(publicId2);\n });\n\n test(\"Unique public ids\", async () => {\n const channel1 = await randomChannel();\n const channel2 = await randomChannel();\n const publicId1 = await channelAttestations.register(\n method,\n channel1,\n );\n const publicId2 = await channelAttestations.register(\n method,\n channel2,\n );\n expect(publicId1).not.toEqual(publicId2);\n });\n\n test(\"Valid attestation\", async () => {\n const actor = await randomActor();\n const channel = await randomChannel();\n const { attestation, channelPublicId } =\n await channelAttestations.attest(method, actor, channel);\n const isValid = await channelAttestations.validate(\n attestation,\n actor,\n channelPublicId,\n );\n expect(isValid).toBe(true);\n\n const channelPublicIdSeperate = await channelAttestations.register(\n method,\n channel,\n );\n expect(channelPublicId).toEqual(channelPublicIdSeperate);\n });\n\n test(\"Invalid attestation with wrong actor\", async () => {\n const actor = await randomActor();\n const wrongActor = await randomActor();\n const channel = await randomChannel();\n const { attestation, channelPublicId } =\n await channelAttestations.attest(method, actor, channel);\n const isValid = await channelAttestations.validate(\n attestation,\n wrongActor,\n channelPublicId,\n );\n expect(isValid).toBe(false);\n });\n\n test(\"Invalid attestation with wrong channel\", async () => {\n const actor = await randomActor();\n const channel = await randomChannel();\n const wrongChannel = await randomChannel();\n const { attestation, channelPublicId } =\n await channelAttestations.attest(method, actor, channel);\n const wrongChannelPublicId = await channelAttestations.register(\n method,\n wrongChannel,\n );\n const isValid = await channelAttestations.validate(\n attestation,\n actor,\n wrongChannelPublicId,\n );\n expect(isValid).toBe(false);\n });\n });\n }\n });\n}\n"],
5
+ "mappings": ";;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,oBAAuC;AACvC,kCAGO;AACP,mBAA4B;AAC5B,6BAGO;AAEA,SAAS,0BAA0B;AACxC,8BAAS,6BAA6B,MAAM;AAC1C,UAAM,4BAA4B;AAAA,MAChC;AAAA,IACF;AACA,UAAM,sBAAsB,IAAI,gDAAoB;AAEpD,mBAAe,cAAc;AAC3B,YAAM,YAAQ,0BAAY;AAC1B,YAAM,MAAM,MAAM,IAAI,qCAAc,EAAE;AAAA,QACpC;AAAA,QACA;AAAA,MACF;AACA,aAAO,WAAW,GAAG;AAAA,IACvB;AACA,mBAAe,gBAAgB;AAC7B,YAAM,YAAQ,0BAAY;AAC1B,aAAO,MAAM,IAAI,qCAAc,EAAE;AAAA,QAC/B;AAAA,QACA;AAAA,MACF;AAAA,IACF;AAEA,4BAAK,8BAA8B,YAAY;AAC7C,YAAM,QAAQ,MAAM,YAAY;AAChC,gBAAM;AAAA,QAAO,MACX,oBAAoB,SAAS,kBAAkB,KAAK;AAAA,MACtD,EAAE,QAAQ,QAAQ;AAAA,IACpB,CAAC;AAED,eAAW,UAAU,2BAA2B;AAC9C,kCAAS,uBAAuB,MAAM,IAAI,MAAM;AAC9C,gCAAK,cAAc,YAAY;AAC7B,gBAAM,UAAU,MAAM,cAAc;AACpC,gBAAM,WAAW,MAAM,oBAAoB,SAAS,QAAQ,OAAO;AACnE,gBAAM,iBAAiB,MAAM,oBAAoB,UAAU,QAAQ;AACnE,oCAAO,cAAc,EAAE,QAAQ,MAAM;AAAA,QACvC,CAAC;AAED,gCAAK,yBAAyB,YAAY;AACxC,gBAAM,UAAU,MAAM,cAAc;AACpC,gBAAM,YAAY,MAAM,oBAAoB,SAAS,QAAQ,OAAO;AACpE,gBAAM,YAAY,MAAM,oBAAoB,SAAS,QAAQ,OAAO;AACpE,oCAAO,SAAS,EAAE,QAAQ,SAAS;AAAA,QACrC,CAAC;AAED,gCAAK,qBAAqB,YAAY;AACpC,gBAAM,WAAW,MAAM,cAAc;AACrC,gBAAM,WAAW,MAAM,cAAc;AACrC,gBAAM,YAAY,MAAM,oBAAoB;AAAA,YAC1C;AAAA,YACA;AAAA,UACF;AACA,gBAAM,YAAY,MAAM,oBAAoB;AAAA,YAC1C;AAAA,YACA;AAAA,UACF;AACA,oCAAO,SAAS,EAAE,IAAI,QAAQ,SAAS;AAAA,QACzC,CAAC;AAED,gCAAK,qBAAqB,YAAY;AACpC,gBAAM,QAAQ,MAAM,YAAY;AAChC,gBAAM,UAAU,MAAM,cAAc;AACpC,gBAAM,EAAE,aAAa,gBAAgB,IACnC,MAAM,oBAAoB,OAAO,QAAQ,OAAO,OAAO;AACzD,gBAAM,UAAU,MAAM,oBAAoB;AAAA,YACxC;AAAA,YACA;AAAA,YACA;AAAA,UACF;AACA,oCAAO,OAAO,EAAE,KAAK,IAAI;AAEzB,gBAAM,0BAA0B,MAAM,oBAAoB;AAAA,YACxD;AAAA,YACA;AAAA,UACF;AACA,oCAAO,eAAe,EAAE,QAAQ,uBAAuB;AAAA,QACzD,CAAC;AAED,gCAAK,wCAAwC,YAAY;AACvD,gBAAM,QAAQ,MAAM,YAAY;AAChC,gBAAM,aAAa,MAAM,YAAY;AACrC,gBAAM,UAAU,MAAM,cAAc;AACpC,gBAAM,EAAE,aAAa,gBAAgB,IACnC,MAAM,oBAAoB,OAAO,QAAQ,OAAO,OAAO;AACzD,gBAAM,UAAU,MAAM,oBAAoB;AAAA,YACxC;AAAA,YACA;AAAA,YACA;AAAA,UACF;AACA,oCAAO,OAAO,EAAE,KAAK,KAAK;AAAA,QAC5B,CAAC;AAED,gCAAK,0CAA0C,YAAY;AACzD,gBAAM,QAAQ,MAAM,YAAY;AAChC,gBAAM,UAAU,MAAM,cAAc;AACpC,gBAAM,eAAe,MAAM,cAAc;AACzC,gBAAM,EAAE,aAAa,gBAAgB,IACnC,MAAM,oBAAoB,OAAO,QAAQ,OAAO,OAAO;AACzD,gBAAM,uBAAuB,MAAM,oBAAoB;AAAA,YACrD;AAAA,YACA;AAAA,UACF;AACA,gBAAM,UAAU,MAAM,oBAAoB;AAAA,YACxC;AAAA,YACA;AAAA,YACA;AAAA,UACF;AACA,oCAAO,OAAO,EAAE,KAAK,KAAK;AAAA,QAC5B,CAAC;AAAA,MACH,CAAC;AAAA,IACH;AAAA,EACF,CAAC;AACH;",
6
+ "names": []
7
+ }
@@ -0,0 +1,84 @@
1
+ "use strict";
2
+ var __defProp = Object.defineProperty;
3
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
4
+ var __getOwnPropNames = Object.getOwnPropertyNames;
5
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
6
+ var __export = (target, all) => {
7
+ for (var name in all)
8
+ __defProp(target, name, { get: all[name], enumerable: true });
9
+ };
10
+ var __copyProps = (to, from, except, desc) => {
11
+ if (from && typeof from === "object" || typeof from === "function") {
12
+ for (let key of __getOwnPropNames(from))
13
+ if (!__hasOwnProp.call(to, key) && key !== except)
14
+ __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
15
+ }
16
+ return to;
17
+ };
18
+ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
19
+ var channel_attestations_exports = {};
20
+ __export(channel_attestations_exports, {
21
+ CHANNEL_ATTESTATION_METHOD_SHA256_ED25519: () => CHANNEL_ATTESTATION_METHOD_SHA256_ED25519,
22
+ ChannelAttestations: () => ChannelAttestations
23
+ });
24
+ module.exports = __toCommonJS(channel_attestations_exports);
25
+ var import_ed25519 = require("@noble/ed25519");
26
+ var import_webcrypto = require("@noble/hashes/webcrypto.js");
27
+ import_ed25519.hashes.sha512Async = import_webcrypto.sha512;
28
+ const CHANNEL_ATTESTATION_METHOD_SHA256_ED25519 = "pk:sha2-256+ed25519";
29
+ const CHANNEL_ATTESTATION_METHOD_PREFIX_SHA256_ED25519 = 0;
30
+ class ChannelAttestations {
31
+ async register(channelAttestationMethod, channel) {
32
+ if (channelAttestationMethod !== CHANNEL_ATTESTATION_METHOD_SHA256_ED25519) {
33
+ throw new Error(
34
+ `Unsupported channel attestation method: ${channelAttestationMethod}`
35
+ );
36
+ }
37
+ const privateKey = await this.channelToPrivateKey(channel);
38
+ return await this.channelPublicIdFromPrivateKey(privateKey);
39
+ }
40
+ async getMethod(channelPublicId) {
41
+ if (channelPublicId[0] === CHANNEL_ATTESTATION_METHOD_PREFIX_SHA256_ED25519) {
42
+ return CHANNEL_ATTESTATION_METHOD_SHA256_ED25519;
43
+ } else {
44
+ throw new Error(`Unrecognized channel attestation method.`);
45
+ }
46
+ }
47
+ async channelToPrivateKey(channel) {
48
+ const channelBytes = new TextEncoder().encode(channel);
49
+ return await (0, import_webcrypto.sha256)(channelBytes);
50
+ }
51
+ async channelPublicIdFromPrivateKey(privateKey) {
52
+ const channelPublicIdRaw = await (0, import_ed25519.getPublicKeyAsync)(privateKey);
53
+ const channelPublicId = new Uint8Array(channelPublicIdRaw.length + 1);
54
+ channelPublicId[0] = CHANNEL_ATTESTATION_METHOD_PREFIX_SHA256_ED25519;
55
+ channelPublicId.set(channelPublicIdRaw, 1);
56
+ return channelPublicId;
57
+ }
58
+ async attest(channelAttestationMethod, actor, channel) {
59
+ if (channelAttestationMethod !== CHANNEL_ATTESTATION_METHOD_SHA256_ED25519) {
60
+ throw new Error(
61
+ `Unsupported channel attestation method: ${channelAttestationMethod}`
62
+ );
63
+ }
64
+ const privateKey = await this.channelToPrivateKey(channel);
65
+ const channelPublicId = await this.channelPublicIdFromPrivateKey(privateKey);
66
+ const actorBytes = new TextEncoder().encode(actor);
67
+ const attestation = await (0, import_ed25519.signAsync)(actorBytes, privateKey);
68
+ return { attestation, channelPublicId };
69
+ }
70
+ async validate(attestation, actor, channelPublicId) {
71
+ const prefix = channelPublicId[0];
72
+ if (prefix !== CHANNEL_ATTESTATION_METHOD_PREFIX_SHA256_ED25519) {
73
+ throw new Error(
74
+ `Unrecognized channel attestation method prefix: ${prefix}`
75
+ );
76
+ }
77
+ return await (0, import_ed25519.verifyAsync)(
78
+ attestation,
79
+ new TextEncoder().encode(actor),
80
+ channelPublicId.slice(1)
81
+ );
82
+ }
83
+ }
84
+ //# sourceMappingURL=3-channel-attestations.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../src/2-primitives/3-channel-attestations.ts"],
4
+ "sourcesContent": ["import {\n getPublicKeyAsync,\n signAsync,\n verifyAsync,\n hashes,\n} from \"@noble/ed25519\";\nimport { sha256, sha512 } from \"@noble/hashes/webcrypto.js\";\nhashes.sha512Async = sha512;\n\nexport const CHANNEL_ATTESTATION_METHOD_SHA256_ED25519 = \"pk:sha2-256+ed25519\";\nconst CHANNEL_ATTESTATION_METHOD_PREFIX_SHA256_ED25519 = 0;\n\nexport class ChannelAttestations {\n async register(\n channelAttestationMethod: string,\n channel: string,\n ): Promise<Uint8Array> {\n if (\n channelAttestationMethod !== CHANNEL_ATTESTATION_METHOD_SHA256_ED25519\n ) {\n throw new Error(\n `Unsupported channel attestation method: ${channelAttestationMethod}`,\n );\n }\n const privateKey = await this.channelToPrivateKey(channel);\n return await this.channelPublicIdFromPrivateKey(privateKey);\n }\n\n async getMethod(channelPublicId: Uint8Array): Promise<string> {\n if (\n channelPublicId[0] === CHANNEL_ATTESTATION_METHOD_PREFIX_SHA256_ED25519\n ) {\n return CHANNEL_ATTESTATION_METHOD_SHA256_ED25519;\n } else {\n throw new Error(`Unrecognized channel attestation method.`);\n }\n }\n\n protected async channelToPrivateKey(channel: string): Promise<Uint8Array> {\n const channelBytes = new TextEncoder().encode(channel);\n return await sha256(channelBytes);\n }\n protected async channelPublicIdFromPrivateKey(\n privateKey: Uint8Array,\n ): Promise<Uint8Array> {\n const channelPublicIdRaw = await getPublicKeyAsync(privateKey);\n const channelPublicId = new Uint8Array(channelPublicIdRaw.length + 1);\n channelPublicId[0] = CHANNEL_ATTESTATION_METHOD_PREFIX_SHA256_ED25519;\n channelPublicId.set(channelPublicIdRaw, 1);\n return channelPublicId;\n }\n\n async attest(\n channelAttestationMethod: string,\n actor: string,\n channel: string,\n ): Promise<{\n attestation: Uint8Array;\n channelPublicId: Uint8Array;\n }> {\n if (\n channelAttestationMethod !== CHANNEL_ATTESTATION_METHOD_SHA256_ED25519\n ) {\n throw new Error(\n `Unsupported channel attestation method: ${channelAttestationMethod}`,\n );\n }\n const privateKey = await this.channelToPrivateKey(channel);\n const channelPublicId =\n await this.channelPublicIdFromPrivateKey(privateKey);\n\n const actorBytes = new TextEncoder().encode(actor);\n const attestation = await signAsync(actorBytes, privateKey);\n return { attestation, channelPublicId };\n }\n\n async validate(\n attestation: Uint8Array,\n actor: string,\n channelPublicId: Uint8Array,\n ): Promise<boolean> {\n const prefix = channelPublicId[0];\n if (prefix !== CHANNEL_ATTESTATION_METHOD_PREFIX_SHA256_ED25519) {\n throw new Error(\n `Unrecognized channel attestation method prefix: ${prefix}`,\n );\n }\n\n return await verifyAsync(\n attestation,\n new TextEncoder().encode(actor),\n channelPublicId.slice(1),\n );\n }\n}\n"],
5
+ "mappings": ";;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,qBAKO;AACP,uBAA+B;AAC/B,sBAAO,cAAc;AAEd,MAAM,4CAA4C;AACzD,MAAM,mDAAmD;AAElD,MAAM,oBAAoB;AAAA,EAC/B,MAAM,SACJ,0BACA,SACqB;AACrB,QACE,6BAA6B,2CAC7B;AACA,YAAM,IAAI;AAAA,QACR,2CAA2C,wBAAwB;AAAA,MACrE;AAAA,IACF;AACA,UAAM,aAAa,MAAM,KAAK,oBAAoB,OAAO;AACzD,WAAO,MAAM,KAAK,8BAA8B,UAAU;AAAA,EAC5D;AAAA,EAEA,MAAM,UAAU,iBAA8C;AAC5D,QACE,gBAAgB,CAAC,MAAM,kDACvB;AACA,aAAO;AAAA,IACT,OAAO;AACL,YAAM,IAAI,MAAM,0CAA0C;AAAA,IAC5D;AAAA,EACF;AAAA,EAEA,MAAgB,oBAAoB,SAAsC;AACxE,UAAM,eAAe,IAAI,YAAY,EAAE,OAAO,OAAO;AACrD,WAAO,UAAM,yBAAO,YAAY;AAAA,EAClC;AAAA,EACA,MAAgB,8BACd,YACqB;AACrB,UAAM,qBAAqB,UAAM,kCAAkB,UAAU;AAC7D,UAAM,kBAAkB,IAAI,WAAW,mBAAmB,SAAS,CAAC;AACpE,oBAAgB,CAAC,IAAI;AACrB,oBAAgB,IAAI,oBAAoB,CAAC;AACzC,WAAO;AAAA,EACT;AAAA,EAEA,MAAM,OACJ,0BACA,OACA,SAIC;AACD,QACE,6BAA6B,2CAC7B;AACA,YAAM,IAAI;AAAA,QACR,2CAA2C,wBAAwB;AAAA,MACrE;AAAA,IACF;AACA,UAAM,aAAa,MAAM,KAAK,oBAAoB,OAAO;AACzD,UAAM,kBACJ,MAAM,KAAK,8BAA8B,UAAU;AAErD,UAAM,aAAa,IAAI,YAAY,EAAE,OAAO,KAAK;AACjD,UAAM,cAAc,UAAM,0BAAU,YAAY,UAAU;AAC1D,WAAO,EAAE,aAAa,gBAAgB;AAAA,EACxC;AAAA,EAEA,MAAM,SACJ,aACA,OACA,iBACkB;AAClB,UAAM,SAAS,gBAAgB,CAAC;AAChC,QAAI,WAAW,kDAAkD;AAC/D,YAAM,IAAI;AAAA,QACR,mDAAmD,MAAM;AAAA,MAC3D;AAAA,IACF;AAEA,WAAO,UAAM;AAAA,MACX;AAAA,MACA,IAAI,YAAY,EAAE,OAAO,KAAK;AAAA,MAC9B,gBAAgB,MAAM,CAAC;AAAA,IACzB;AAAA,EACF;AACF;",
6
+ "names": []
7
+ }
@@ -0,0 +1,96 @@
1
+ "use strict";
2
+ var __defProp = Object.defineProperty;
3
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
4
+ var __getOwnPropNames = Object.getOwnPropertyNames;
5
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
6
+ var __export = (target, all) => {
7
+ for (var name in all)
8
+ __defProp(target, name, { get: all[name], enumerable: true });
9
+ };
10
+ var __copyProps = (to, from, except, desc) => {
11
+ if (from && typeof from === "object" || typeof from === "function") {
12
+ for (let key of __getOwnPropNames(from))
13
+ if (!__hasOwnProp.call(to, key) && key !== except)
14
+ __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
15
+ }
16
+ return to;
17
+ };
18
+ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
19
+ var allowed_attestations_tests_exports = {};
20
+ __export(allowed_attestations_tests_exports, {
21
+ allowedAttestationTests: () => allowedAttestationTests
22
+ });
23
+ module.exports = __toCommonJS(allowed_attestations_tests_exports);
24
+ var import_vitest = require("vitest");
25
+ var import_allowed_attestations = require("./4-allowed-attestations");
26
+ var import_utils = require("@noble/hashes/utils.js");
27
+ var import_string_encoding = require("./1-string-encoding");
28
+ function allowedAttestationTests() {
29
+ (0, import_vitest.describe)("Allowed Attestation Tests", () => {
30
+ const allowedAttestationMethods = [import_allowed_attestations.ALLOWED_ATTESTATION_METHOD_HMAC_SHA256];
31
+ const allowedAttestations = new import_allowed_attestations.AllowedAttestations();
32
+ async function randomActor() {
33
+ const bytes = (0, import_utils.randomBytes)();
34
+ const str = await new import_string_encoding.StringEncoder().encode(
35
+ import_string_encoding.STRING_ENCODER_METHOD_BASE64URL,
36
+ bytes
37
+ );
38
+ return `did:web:${str}.com`;
39
+ }
40
+ (0, import_vitest.test)("Invalid attestation method", async () => {
41
+ const actor = await randomActor();
42
+ await (0, import_vitest.expect)(
43
+ () => allowedAttestations.attest("invalid-method", actor)
44
+ ).rejects.toThrow();
45
+ });
46
+ for (const method of allowedAttestationMethods) {
47
+ (0, import_vitest.describe)(`Attestation Method: ${method}`, () => {
48
+ (0, import_vitest.test)("Valid attestation", async () => {
49
+ const actor = await randomActor();
50
+ const { attestation, ticket } = await allowedAttestations.attest(
51
+ method,
52
+ actor
53
+ );
54
+ const isValid = await allowedAttestations.validate(
55
+ attestation,
56
+ actor,
57
+ ticket
58
+ );
59
+ (0, import_vitest.expect)(isValid).toBe(true);
60
+ });
61
+ (0, import_vitest.test)("Wrong actor", async () => {
62
+ const actor = await randomActor();
63
+ const { attestation, ticket } = await allowedAttestations.attest(
64
+ method,
65
+ actor
66
+ );
67
+ const otherActor = await randomActor();
68
+ const isValid = await allowedAttestations.validate(
69
+ attestation,
70
+ otherActor,
71
+ ticket
72
+ );
73
+ (0, import_vitest.expect)(isValid).toBe(false);
74
+ });
75
+ (0, import_vitest.test)("Wrong ticket", async () => {
76
+ const actor = await randomActor();
77
+ const { attestation: attestation1, ticket: ticket1 } = await allowedAttestations.attest(method, actor);
78
+ const { attestation: attestation2, ticket: ticket2 } = await allowedAttestations.attest(method, actor);
79
+ const isValid1 = await allowedAttestations.validate(
80
+ attestation1,
81
+ actor,
82
+ ticket2
83
+ );
84
+ const isValid2 = await allowedAttestations.validate(
85
+ attestation2,
86
+ actor,
87
+ ticket1
88
+ );
89
+ (0, import_vitest.expect)(isValid1).toBe(false);
90
+ (0, import_vitest.expect)(isValid2).toBe(false);
91
+ });
92
+ });
93
+ }
94
+ });
95
+ }
96
+ //# sourceMappingURL=4-allowed-attestations-tests.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../src/2-primitives/4-allowed-attestations-tests.ts"],
4
+ "sourcesContent": ["import { describe, expect, test } from \"vitest\";\nimport {\n ALLOWED_ATTESTATION_METHOD_HMAC_SHA256,\n AllowedAttestations,\n} from \"./4-allowed-attestations\";\nimport { randomBytes } from \"@noble/hashes/utils.js\";\nimport {\n StringEncoder,\n STRING_ENCODER_METHOD_BASE64URL,\n} from \"./1-string-encoding\";\n\nexport function allowedAttestationTests() {\n describe(\"Allowed Attestation Tests\", () => {\n const allowedAttestationMethods = [ALLOWED_ATTESTATION_METHOD_HMAC_SHA256];\n const allowedAttestations = new AllowedAttestations();\n\n async function randomActor() {\n const bytes = randomBytes();\n const str = await new StringEncoder().encode(\n STRING_ENCODER_METHOD_BASE64URL,\n bytes,\n );\n return `did:web:${str}.com`;\n }\n\n test(\"Invalid attestation method\", async () => {\n const actor = await randomActor();\n await expect(() =>\n allowedAttestations.attest(\"invalid-method\", actor),\n ).rejects.toThrow();\n });\n\n for (const method of allowedAttestationMethods) {\n describe(`Attestation Method: ${method}`, () => {\n test(\"Valid attestation\", async () => {\n const actor = await randomActor();\n const { attestation, ticket } = await allowedAttestations.attest(\n method,\n actor,\n );\n const isValid = await allowedAttestations.validate(\n attestation,\n actor,\n ticket,\n );\n expect(isValid).toBe(true);\n });\n\n test(\"Wrong actor\", async () => {\n const actor = await randomActor();\n const { attestation, ticket } = await allowedAttestations.attest(\n method,\n actor,\n );\n const otherActor = await randomActor();\n const isValid = await allowedAttestations.validate(\n attestation,\n otherActor,\n ticket,\n );\n expect(isValid).toBe(false);\n });\n\n test(\"Wrong ticket\", async () => {\n const actor = await randomActor();\n const { attestation: attestation1, ticket: ticket1 } =\n await allowedAttestations.attest(method, actor);\n const { attestation: attestation2, ticket: ticket2 } =\n await allowedAttestations.attest(method, actor);\n const isValid1 = await allowedAttestations.validate(\n attestation1,\n actor,\n ticket2,\n );\n const isValid2 = await allowedAttestations.validate(\n attestation2,\n actor,\n ticket1,\n );\n expect(isValid1).toBe(false);\n expect(isValid2).toBe(false);\n });\n });\n }\n });\n}\n"],
5
+ "mappings": ";;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,oBAAuC;AACvC,kCAGO;AACP,mBAA4B;AAC5B,6BAGO;AAEA,SAAS,0BAA0B;AACxC,8BAAS,6BAA6B,MAAM;AAC1C,UAAM,4BAA4B,CAAC,kEAAsC;AACzE,UAAM,sBAAsB,IAAI,gDAAoB;AAEpD,mBAAe,cAAc;AAC3B,YAAM,YAAQ,0BAAY;AAC1B,YAAM,MAAM,MAAM,IAAI,qCAAc,EAAE;AAAA,QACpC;AAAA,QACA;AAAA,MACF;AACA,aAAO,WAAW,GAAG;AAAA,IACvB;AAEA,4BAAK,8BAA8B,YAAY;AAC7C,YAAM,QAAQ,MAAM,YAAY;AAChC,gBAAM;AAAA,QAAO,MACX,oBAAoB,OAAO,kBAAkB,KAAK;AAAA,MACpD,EAAE,QAAQ,QAAQ;AAAA,IACpB,CAAC;AAED,eAAW,UAAU,2BAA2B;AAC9C,kCAAS,uBAAuB,MAAM,IAAI,MAAM;AAC9C,gCAAK,qBAAqB,YAAY;AACpC,gBAAM,QAAQ,MAAM,YAAY;AAChC,gBAAM,EAAE,aAAa,OAAO,IAAI,MAAM,oBAAoB;AAAA,YACxD;AAAA,YACA;AAAA,UACF;AACA,gBAAM,UAAU,MAAM,oBAAoB;AAAA,YACxC;AAAA,YACA;AAAA,YACA;AAAA,UACF;AACA,oCAAO,OAAO,EAAE,KAAK,IAAI;AAAA,QAC3B,CAAC;AAED,gCAAK,eAAe,YAAY;AAC9B,gBAAM,QAAQ,MAAM,YAAY;AAChC,gBAAM,EAAE,aAAa,OAAO,IAAI,MAAM,oBAAoB;AAAA,YACxD;AAAA,YACA;AAAA,UACF;AACA,gBAAM,aAAa,MAAM,YAAY;AACrC,gBAAM,UAAU,MAAM,oBAAoB;AAAA,YACxC;AAAA,YACA;AAAA,YACA;AAAA,UACF;AACA,oCAAO,OAAO,EAAE,KAAK,KAAK;AAAA,QAC5B,CAAC;AAED,gCAAK,gBAAgB,YAAY;AAC/B,gBAAM,QAAQ,MAAM,YAAY;AAChC,gBAAM,EAAE,aAAa,cAAc,QAAQ,QAAQ,IACjD,MAAM,oBAAoB,OAAO,QAAQ,KAAK;AAChD,gBAAM,EAAE,aAAa,cAAc,QAAQ,QAAQ,IACjD,MAAM,oBAAoB,OAAO,QAAQ,KAAK;AAChD,gBAAM,WAAW,MAAM,oBAAoB;AAAA,YACzC;AAAA,YACA;AAAA,YACA;AAAA,UACF;AACA,gBAAM,WAAW,MAAM,oBAAoB;AAAA,YACzC;AAAA,YACA;AAAA,YACA;AAAA,UACF;AACA,oCAAO,QAAQ,EAAE,KAAK,KAAK;AAC3B,oCAAO,QAAQ,EAAE,KAAK,KAAK;AAAA,QAC7B,CAAC;AAAA,MACH,CAAC;AAAA,IACH;AAAA,EACF,CAAC;AACH;",
6
+ "names": []
7
+ }