@enbox/dwn-sdk-js 0.3.4 → 0.3.6

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 (246) hide show
  1. package/dist/browser.mjs +8 -8
  2. package/dist/browser.mjs.map +4 -4
  3. package/dist/esm/generated/precompiled-validators.js +766 -1224
  4. package/dist/esm/generated/precompiled-validators.js.map +1 -1
  5. package/dist/esm/src/core/abstract-message.js +3 -3
  6. package/dist/esm/src/core/abstract-message.js.map +1 -1
  7. package/dist/esm/src/core/grant-authorization.js +6 -2
  8. package/dist/esm/src/core/grant-authorization.js.map +1 -1
  9. package/dist/esm/src/core/message.js +4 -4
  10. package/dist/esm/src/core/message.js.map +1 -1
  11. package/dist/esm/src/core/protocol-authorization-action.js +3 -3
  12. package/dist/esm/src/core/protocol-authorization-action.js.map +1 -1
  13. package/dist/esm/src/core/protocol-authorization-validation.js +1 -1
  14. package/dist/esm/src/core/protocol-authorization-validation.js.map +1 -1
  15. package/dist/esm/src/core/protocol-authorization.js +11 -11
  16. package/dist/esm/src/core/protocol-authorization.js.map +1 -1
  17. package/dist/esm/src/core/records-grant-authorization.js +1 -1
  18. package/dist/esm/src/core/records-grant-authorization.js.map +1 -1
  19. package/dist/esm/src/core/resumable-task-manager.js.map +1 -1
  20. package/dist/esm/src/dwn.js +9 -4
  21. package/dist/esm/src/dwn.js.map +1 -1
  22. package/dist/esm/src/event-stream/event-emitter-event-log.js +12 -12
  23. package/dist/esm/src/event-stream/event-emitter-event-log.js.map +1 -1
  24. package/dist/esm/src/handlers/messages-read.js +7 -7
  25. package/dist/esm/src/handlers/messages-read.js.map +1 -1
  26. package/dist/esm/src/handlers/messages-subscribe.js +1 -1
  27. package/dist/esm/src/handlers/messages-subscribe.js.map +1 -1
  28. package/dist/esm/src/handlers/messages-sync.js +18 -18
  29. package/dist/esm/src/handlers/messages-sync.js.map +1 -1
  30. package/dist/esm/src/handlers/protocols-configure.js +1 -1
  31. package/dist/esm/src/handlers/protocols-configure.js.map +1 -1
  32. package/dist/esm/src/handlers/protocols-query.js +1 -1
  33. package/dist/esm/src/handlers/protocols-query.js.map +1 -1
  34. package/dist/esm/src/handlers/records-count.js.map +1 -1
  35. package/dist/esm/src/handlers/records-delete.js.map +1 -1
  36. package/dist/esm/src/handlers/records-query.js.map +1 -1
  37. package/dist/esm/src/handlers/records-read.js +6 -6
  38. package/dist/esm/src/handlers/records-read.js.map +1 -1
  39. package/dist/esm/src/handlers/records-subscribe.js +1 -1
  40. package/dist/esm/src/handlers/records-subscribe.js.map +1 -1
  41. package/dist/esm/src/handlers/records-write.js +16 -16
  42. package/dist/esm/src/handlers/records-write.js.map +1 -1
  43. package/dist/esm/src/index.js +2 -2
  44. package/dist/esm/src/index.js.map +1 -1
  45. package/dist/esm/src/interfaces/messages-subscribe.js +1 -1
  46. package/dist/esm/src/interfaces/messages-subscribe.js.map +1 -1
  47. package/dist/esm/src/interfaces/messages-sync.js +1 -1
  48. package/dist/esm/src/interfaces/messages-sync.js.map +1 -1
  49. package/dist/esm/src/interfaces/protocols-configure.js +9 -9
  50. package/dist/esm/src/interfaces/protocols-configure.js.map +1 -1
  51. package/dist/esm/src/interfaces/protocols-query.js +1 -1
  52. package/dist/esm/src/interfaces/protocols-query.js.map +1 -1
  53. package/dist/esm/src/interfaces/records-count.js +1 -1
  54. package/dist/esm/src/interfaces/records-count.js.map +1 -1
  55. package/dist/esm/src/interfaces/records-delete.js +1 -1
  56. package/dist/esm/src/interfaces/records-delete.js.map +1 -1
  57. package/dist/esm/src/interfaces/records-query.js +1 -1
  58. package/dist/esm/src/interfaces/records-query.js.map +1 -1
  59. package/dist/esm/src/interfaces/records-read.js +1 -1
  60. package/dist/esm/src/interfaces/records-read.js.map +1 -1
  61. package/dist/esm/src/interfaces/records-subscribe.js +1 -1
  62. package/dist/esm/src/interfaces/records-subscribe.js.map +1 -1
  63. package/dist/esm/src/interfaces/records-write-signing.js +1 -1
  64. package/dist/esm/src/interfaces/records-write-signing.js.map +1 -1
  65. package/dist/esm/src/interfaces/records-write.js +9 -9
  66. package/dist/esm/src/interfaces/records-write.js.map +1 -1
  67. package/dist/esm/src/jose/jws/general/builder.js.map +1 -1
  68. package/dist/esm/src/jose/jws/general/verifier.js +30 -2
  69. package/dist/esm/src/jose/jws/general/verifier.js.map +1 -1
  70. package/dist/esm/src/protocols/permissions.js +1 -1
  71. package/dist/esm/src/protocols/permissions.js.map +1 -1
  72. package/dist/esm/src/smt/smt-store-level.js.map +1 -1
  73. package/dist/esm/src/smt/smt-store-memory.js.map +1 -1
  74. package/dist/esm/src/smt/sparse-merkle-tree.js +2 -2
  75. package/dist/esm/src/smt/sparse-merkle-tree.js.map +1 -1
  76. package/dist/esm/src/state-index/state-index-level.js.map +1 -1
  77. package/dist/esm/src/store/index-level-compound.js +10 -10
  78. package/dist/esm/src/store/index-level-compound.js.map +1 -1
  79. package/dist/esm/src/store/index-level.js +3 -3
  80. package/dist/esm/src/store/index-level.js.map +1 -1
  81. package/dist/esm/src/store/level-wrapper.js +1 -1
  82. package/dist/esm/src/store/level-wrapper.js.map +1 -1
  83. package/dist/esm/src/store/storage-controller.js +23 -10
  84. package/dist/esm/src/store/storage-controller.js.map +1 -1
  85. package/dist/esm/src/types/permission-types.js.map +1 -1
  86. package/dist/esm/src/utils/memory-cache.js.map +1 -1
  87. package/dist/esm/src/utils/messages.js +2 -2
  88. package/dist/esm/src/utils/messages.js.map +1 -1
  89. package/dist/esm/src/utils/private-key-signer.js.map +1 -1
  90. package/dist/esm/src/utils/records.js +1 -1
  91. package/dist/esm/src/utils/records.js.map +1 -1
  92. package/dist/esm/src/utils/time.js +5 -9
  93. package/dist/esm/src/utils/time.js.map +1 -1
  94. package/dist/esm/tests/core/grant-authorization.spec.js +38 -0
  95. package/dist/esm/tests/core/grant-authorization.spec.js.map +1 -0
  96. package/dist/esm/tests/features/permissions.spec.js +1 -1
  97. package/dist/esm/tests/features/permissions.spec.js.map +1 -1
  98. package/dist/esm/tests/features/records-prune-cross-protocol.spec.js +422 -0
  99. package/dist/esm/tests/features/records-prune-cross-protocol.spec.js.map +1 -0
  100. package/dist/esm/tests/fuzz/object.fuzz.spec.js +1 -1
  101. package/dist/esm/tests/fuzz/object.fuzz.spec.js.map +1 -1
  102. package/dist/esm/tests/handlers/messages-subscribe.spec.js +3 -26
  103. package/dist/esm/tests/handlers/messages-subscribe.spec.js.map +1 -1
  104. package/dist/esm/tests/handlers/messages-sync.spec.js +3 -26
  105. package/dist/esm/tests/handlers/messages-sync.spec.js.map +1 -1
  106. package/dist/esm/tests/handlers/protocols-query.spec.js +4 -3
  107. package/dist/esm/tests/handlers/protocols-query.spec.js.map +1 -1
  108. package/dist/esm/tests/handlers/records-subscribe.spec.js +2 -1
  109. package/dist/esm/tests/handlers/records-subscribe.spec.js.map +1 -1
  110. package/dist/esm/tests/jose/jws/general.spec.js +115 -0
  111. package/dist/esm/tests/jose/jws/general.spec.js.map +1 -1
  112. package/dist/esm/tests/test-suite.js +2 -0
  113. package/dist/esm/tests/test-suite.js.map +1 -1
  114. package/dist/esm/tests/utils/poller.js +2 -2
  115. package/dist/esm/tests/utils/poller.js.map +1 -1
  116. package/dist/esm/tests/utils/test-data-generator.js +1 -1
  117. package/dist/esm/tests/utils/test-data-generator.js.map +1 -1
  118. package/dist/types/generated/precompiled-validators.d.ts.map +1 -1
  119. package/dist/types/src/core/abstract-message.d.ts +4 -4
  120. package/dist/types/src/core/abstract-message.d.ts.map +1 -1
  121. package/dist/types/src/core/grant-authorization.d.ts.map +1 -1
  122. package/dist/types/src/core/resumable-task-manager.d.ts +2 -2
  123. package/dist/types/src/core/resumable-task-manager.d.ts.map +1 -1
  124. package/dist/types/src/dwn.d.ts +12 -12
  125. package/dist/types/src/dwn.d.ts.map +1 -1
  126. package/dist/types/src/event-stream/event-emitter-event-log.d.ts +5 -5
  127. package/dist/types/src/event-stream/event-emitter-event-log.d.ts.map +1 -1
  128. package/dist/types/src/handlers/messages-read.d.ts +1 -1
  129. package/dist/types/src/handlers/messages-read.d.ts.map +1 -1
  130. package/dist/types/src/handlers/messages-subscribe.d.ts +1 -1
  131. package/dist/types/src/handlers/messages-subscribe.d.ts.map +1 -1
  132. package/dist/types/src/handlers/messages-sync.d.ts +1 -1
  133. package/dist/types/src/handlers/messages-sync.d.ts.map +1 -1
  134. package/dist/types/src/handlers/protocols-configure.d.ts +1 -1
  135. package/dist/types/src/handlers/protocols-configure.d.ts.map +1 -1
  136. package/dist/types/src/handlers/protocols-query.d.ts +1 -1
  137. package/dist/types/src/handlers/protocols-query.d.ts.map +1 -1
  138. package/dist/types/src/handlers/records-count.d.ts +1 -1
  139. package/dist/types/src/handlers/records-count.d.ts.map +1 -1
  140. package/dist/types/src/handlers/records-delete.d.ts +1 -1
  141. package/dist/types/src/handlers/records-delete.d.ts.map +1 -1
  142. package/dist/types/src/handlers/records-query.d.ts +1 -1
  143. package/dist/types/src/handlers/records-query.d.ts.map +1 -1
  144. package/dist/types/src/handlers/records-read.d.ts +1 -1
  145. package/dist/types/src/handlers/records-read.d.ts.map +1 -1
  146. package/dist/types/src/handlers/records-subscribe.d.ts +1 -1
  147. package/dist/types/src/handlers/records-subscribe.d.ts.map +1 -1
  148. package/dist/types/src/handlers/records-write.d.ts +1 -1
  149. package/dist/types/src/handlers/records-write.d.ts.map +1 -1
  150. package/dist/types/src/index.d.ts +5 -5
  151. package/dist/types/src/index.d.ts.map +1 -1
  152. package/dist/types/src/interfaces/records-write.d.ts +2 -2
  153. package/dist/types/src/interfaces/records-write.d.ts.map +1 -1
  154. package/dist/types/src/jose/jws/general/builder.d.ts +1 -1
  155. package/dist/types/src/jose/jws/general/builder.d.ts.map +1 -1
  156. package/dist/types/src/jose/jws/general/verifier.d.ts +13 -0
  157. package/dist/types/src/jose/jws/general/verifier.d.ts.map +1 -1
  158. package/dist/types/src/smt/smt-store-level.d.ts +1 -1
  159. package/dist/types/src/smt/smt-store-level.d.ts.map +1 -1
  160. package/dist/types/src/smt/smt-store-memory.d.ts +1 -1
  161. package/dist/types/src/smt/smt-store-memory.d.ts.map +1 -1
  162. package/dist/types/src/smt/sparse-merkle-tree.d.ts +1 -1
  163. package/dist/types/src/smt/sparse-merkle-tree.d.ts.map +1 -1
  164. package/dist/types/src/state-index/state-index-level.d.ts +3 -3
  165. package/dist/types/src/state-index/state-index-level.d.ts.map +1 -1
  166. package/dist/types/src/store/index-level.d.ts +2 -2
  167. package/dist/types/src/store/index-level.d.ts.map +1 -1
  168. package/dist/types/src/store/storage-controller.d.ts +19 -5
  169. package/dist/types/src/store/storage-controller.d.ts.map +1 -1
  170. package/dist/types/src/types/permission-types.d.ts +3 -4
  171. package/dist/types/src/types/permission-types.d.ts.map +1 -1
  172. package/dist/types/src/utils/memory-cache.d.ts +2 -2
  173. package/dist/types/src/utils/memory-cache.d.ts.map +1 -1
  174. package/dist/types/src/utils/private-key-signer.d.ts +2 -2
  175. package/dist/types/src/utils/private-key-signer.d.ts.map +1 -1
  176. package/dist/types/src/utils/time.d.ts +3 -6
  177. package/dist/types/src/utils/time.d.ts.map +1 -1
  178. package/dist/types/tests/core/grant-authorization.spec.d.ts +2 -0
  179. package/dist/types/tests/core/grant-authorization.spec.d.ts.map +1 -0
  180. package/dist/types/tests/features/records-prune-cross-protocol.spec.d.ts +29 -0
  181. package/dist/types/tests/features/records-prune-cross-protocol.spec.d.ts.map +1 -0
  182. package/dist/types/tests/handlers/messages-subscribe.spec.d.ts.map +1 -1
  183. package/dist/types/tests/handlers/messages-sync.spec.d.ts.map +1 -1
  184. package/dist/types/tests/handlers/protocols-query.spec.d.ts.map +1 -1
  185. package/dist/types/tests/handlers/records-subscribe.spec.d.ts.map +1 -1
  186. package/dist/types/tests/test-suite.d.ts.map +1 -1
  187. package/package.json +4 -3
  188. package/src/core/abstract-message.ts +8 -8
  189. package/src/core/grant-authorization.ts +9 -2
  190. package/src/core/message.ts +4 -4
  191. package/src/core/protocol-authorization-action.ts +3 -3
  192. package/src/core/protocol-authorization-validation.ts +9 -9
  193. package/src/core/protocol-authorization.ts +24 -24
  194. package/src/core/records-grant-authorization.ts +1 -1
  195. package/src/core/resumable-task-manager.ts +2 -2
  196. package/src/dwn.ts +34 -17
  197. package/src/event-stream/event-emitter-event-log.ts +15 -15
  198. package/src/handlers/messages-read.ts +7 -7
  199. package/src/handlers/messages-subscribe.ts +2 -2
  200. package/src/handlers/messages-sync.ts +19 -19
  201. package/src/handlers/protocols-configure.ts +2 -2
  202. package/src/handlers/protocols-query.ts +2 -2
  203. package/src/handlers/records-count.ts +1 -1
  204. package/src/handlers/records-delete.ts +1 -1
  205. package/src/handlers/records-query.ts +1 -1
  206. package/src/handlers/records-read.ts +6 -6
  207. package/src/handlers/records-subscribe.ts +2 -2
  208. package/src/handlers/records-write.ts +18 -18
  209. package/src/index.ts +5 -5
  210. package/src/interfaces/messages-subscribe.ts +1 -1
  211. package/src/interfaces/messages-sync.ts +1 -1
  212. package/src/interfaces/protocols-configure.ts +12 -12
  213. package/src/interfaces/protocols-query.ts +1 -1
  214. package/src/interfaces/records-count.ts +1 -1
  215. package/src/interfaces/records-delete.ts +2 -2
  216. package/src/interfaces/records-query.ts +1 -1
  217. package/src/interfaces/records-read.ts +1 -1
  218. package/src/interfaces/records-subscribe.ts +1 -1
  219. package/src/interfaces/records-write-signing.ts +1 -1
  220. package/src/interfaces/records-write.ts +13 -13
  221. package/src/jose/jws/general/builder.ts +1 -1
  222. package/src/jose/jws/general/verifier.ts +44 -3
  223. package/src/protocols/permissions.ts +1 -1
  224. package/src/smt/smt-store-level.ts +1 -1
  225. package/src/smt/smt-store-memory.ts +1 -1
  226. package/src/smt/sparse-merkle-tree.ts +10 -10
  227. package/src/state-index/state-index-level.ts +3 -3
  228. package/src/store/index-level-compound.ts +11 -11
  229. package/src/store/index-level.ts +5 -5
  230. package/src/store/level-wrapper.ts +1 -1
  231. package/src/store/storage-controller.ts +31 -16
  232. package/src/types/permission-types.ts +3 -4
  233. package/src/utils/memory-cache.ts +2 -2
  234. package/src/utils/messages.ts +3 -3
  235. package/src/utils/private-key-signer.ts +2 -2
  236. package/src/utils/records.ts +2 -2
  237. package/src/utils/time.ts +5 -10
  238. package/dist/esm/src/utils/object.js +0 -40
  239. package/dist/esm/src/utils/object.js.map +0 -1
  240. package/dist/esm/tests/utils/object.spec.js +0 -36
  241. package/dist/esm/tests/utils/object.spec.js.map +0 -1
  242. package/dist/types/src/utils/object.d.ts +0 -13
  243. package/dist/types/src/utils/object.d.ts.map +0 -1
  244. package/dist/types/tests/utils/object.spec.d.ts +0 -2
  245. package/dist/types/tests/utils/object.spec.d.ts.map +0 -1
  246. package/src/utils/object.ts +0 -43
@@ -16,10 +16,10 @@ export type ResumableRecordsSquashData = {
16
16
  * A class that provides an abstraction for the usage of MessageStore, DataStore, and StateIndex.
17
17
  */
18
18
  export declare class StorageController {
19
- private messageStore;
20
- private dataStore;
21
- private stateIndex;
22
- private eventLog?;
19
+ private readonly messageStore;
20
+ private readonly dataStore;
21
+ private readonly stateIndex;
22
+ private readonly eventLog?;
23
23
  constructor({ messageStore, dataStore, stateIndex, eventLog }: {
24
24
  messageStore: MessageStore;
25
25
  dataStore: DataStore;
@@ -43,7 +43,21 @@ export declare class StorageController {
43
43
  */
44
44
  private static deleteFromDataStoreIfNeeded;
45
45
  /**
46
- * Purges (permanent hard-delete) all descendant's data of the given `recordId`.
46
+ * Purges (permanent hard-delete) all descendants of the given `recordId`, recursively.
47
+ *
48
+ * The cascade is intentionally protocol-agnostic: `parentContextId` is a structural link,
49
+ * so pruning a parent removes every record hanging off it regardless of which protocol a
50
+ * descendant lives in. Cross-protocol composing children (records in a different protocol
51
+ * that reference the parent via `$ref` / `uses`) are included in the cascade.
52
+ *
53
+ * Rationale (closes #298 as working-as-intended):
54
+ * - A DWN is tenant-owned storage. The tenant's prune authority extends across the whole
55
+ * subtree they rooted, regardless of which protocol a descendant declares itself under.
56
+ * - Preserving cross-protocol orphans creates a half-alive state (readable but not
57
+ * updatable, since `validateReferentialIntegrity` requires the pruned parent) that is
58
+ * worse for callers than simply cascading.
59
+ * - Same-protocol cascade is already protocol-agnostic at every hop via `parentId`,
60
+ * so treating cross-protocol boundaries differently was inconsistent.
47
61
  */
48
62
  static purgeRecordDescendants(tenant: string, recordId: string, messageStore: MessageStore, dataStore: DataStore, stateIndex: StateIndex): Promise<void>;
49
63
  /**
@@ -1 +1 @@
1
- {"version":3,"file":"storage-controller.d.ts","sourceRoot":"","sources":["../../../../src/store/storage-controller.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,wBAAwB,CAAC;AACxD,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,2BAA2B,CAAC;AAE1D,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,2BAA2B,CAAC;AAChE,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,2BAA2B,CAAC;AAC9D,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,yBAAyB,CAAC;AAC1D,OAAO,KAAK,EAAE,oBAAoB,EAA0B,mBAAmB,EAAE,MAAM,2BAA2B,CAAC;AAWnH,MAAM,MAAM,0BAA0B,GAAG;IACvC,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,oBAAoB,CAAC;CAC/B,CAAC;AAEF,MAAM,MAAM,0BAA0B,GAAG;IACvC,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,mBAAmB,CAAC;CAC9B,CAAC;AAEF;;GAEG;AACH,qBAAa,iBAAiB;IAE5B,OAAO,CAAC,YAAY,CAAe;IACnC,OAAO,CAAC,SAAS,CAAY;IAC7B,OAAO,CAAC,UAAU,CAAa;IAC/B,OAAO,CAAC,QAAQ,CAAC,CAAW;gBAET,EAAE,YAAY,EAAE,SAAS,EAAE,UAAU,EAAE,QAAQ,EAAE,EAAE;QACpE,YAAY,EAAG,YAAY,CAAC;QAC5B,SAAS,EAAG,SAAS,CAAC;QACtB,UAAU,EAAG,UAAU,CAAC;QACxB,QAAQ,CAAC,EAAG,QAAQ,CAAA;KAAC;IAQV,oBAAoB,CAAC,EAAE,MAAM,EAAE,OAAO,EAAE,EAAE,0BAA0B,GAAG,OAAO,CAAC,IAAI,CAAC;IA0CjG;;;;;;;;OAQG;IACU,oBAAoB,CAAC,EAAE,MAAM,EAAE,OAAO,EAAE,EAAE,0BAA0B,GAAG,OAAO,CAAC,IAAI,CAAC;IA6DjG;;;OAGG;mBACkB,2BAA2B;IA2BhD;;OAEG;WACiB,sBAAsB,CACxC,MAAM,EAAE,MAAM,EACd,QAAQ,EAAE,MAAM,EAChB,YAAY,EAAE,YAAY,EAC1B,SAAS,EAAE,SAAS,EACpB,UAAU,EAAE,UAAU,GACrB,OAAO,CAAC,IAAI,CAAC;IAsChB;;;OAGG;WACiB,mBAAmB,CACrC,MAAM,EAAE,MAAM,EACd,cAAc,EAAE,cAAc,EAAE,EAChC,YAAY,EAAE,YAAY,EAC1B,SAAS,EAAE,SAAS,EACpB,UAAU,EAAE,UAAU,GACrB,OAAO,CAAC,IAAI,CAAC;IAqBhB;;;OAGG;WACiB,yCAAyC,CAC3D,MAAM,EAAE,MAAM,EACd,gBAAgB,EAAE,cAAc,EAAE,EAClC,aAAa,EAAE,cAAc,EAC7B,YAAY,EAAE,YAAY,EAC1B,SAAS,EAAE,SAAS,EACpB,UAAU,EAAE,UAAU,GACrB,OAAO,CAAC,IAAI,CAAC;CAqCjB"}
1
+ {"version":3,"file":"storage-controller.d.ts","sourceRoot":"","sources":["../../../../src/store/storage-controller.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,wBAAwB,CAAC;AACxD,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,2BAA2B,CAAC;AAE1D,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,2BAA2B,CAAC;AAChE,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,2BAA2B,CAAC;AAC9D,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,yBAAyB,CAAC;AAC1D,OAAO,KAAK,EAAE,oBAAoB,EAA0B,mBAAmB,EAAE,MAAM,2BAA2B,CAAC;AAWnH,MAAM,MAAM,0BAA0B,GAAG;IACvC,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,oBAAoB,CAAC;CAC/B,CAAC;AAEF,MAAM,MAAM,0BAA0B,GAAG;IACvC,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,mBAAmB,CAAC;CAC9B,CAAC;AAEF;;GAEG;AACH,qBAAa,iBAAiB;IAE5B,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAe;IAC5C,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAY;IACtC,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAa;IACxC,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAW;gBAElB,EAAE,YAAY,EAAE,SAAS,EAAE,UAAU,EAAE,QAAQ,EAAE,EAAE;QACpE,YAAY,EAAG,YAAY,CAAC;QAC5B,SAAS,EAAG,SAAS,CAAC;QACtB,UAAU,EAAG,UAAU,CAAC;QACxB,QAAQ,CAAC,EAAG,QAAQ,CAAA;KAAC;IAQV,oBAAoB,CAAC,EAAE,MAAM,EAAE,OAAO,EAAE,EAAE,0BAA0B,GAAG,OAAO,CAAC,IAAI,CAAC;IA+CjG;;;;;;;;OAQG;IACU,oBAAoB,CAAC,EAAE,MAAM,EAAE,OAAO,EAAE,EAAE,0BAA0B,GAAG,OAAO,CAAC,IAAI,CAAC;IA6DjG;;;OAGG;mBACkB,2BAA2B;IA2BhD;;;;;;;;;;;;;;;;OAgBG;WACiB,sBAAsB,CACxC,MAAM,EAAE,MAAM,EACd,QAAQ,EAAE,MAAM,EAChB,YAAY,EAAE,YAAY,EAC1B,SAAS,EAAE,SAAS,EACpB,UAAU,EAAE,UAAU,GACrB,OAAO,CAAC,IAAI,CAAC;IAkChB;;;OAGG;WACiB,mBAAmB,CACrC,MAAM,EAAE,MAAM,EACd,cAAc,EAAE,cAAc,EAAE,EAChC,YAAY,EAAE,YAAY,EAC1B,SAAS,EAAE,SAAS,EACpB,UAAU,EAAE,UAAU,GACrB,OAAO,CAAC,IAAI,CAAC;IAqBhB;;;OAGG;WACiB,yCAAyC,CAC3D,MAAM,EAAE,MAAM,EACd,gBAAgB,EAAE,cAAc,EAAE,EAClC,aAAa,EAAE,cAAc,EAC7B,YAAY,EAAE,YAAY,EAC1B,SAAS,EAAE,SAAS,EACpB,UAAU,EAAE,UAAU,GACrB,OAAO,CAAC,IAAI,CAAC;CAqCjB"}
@@ -73,13 +73,12 @@ export type ProtocolPermissionScope = {
73
73
  /**
74
74
  * Permission scope for the Messages interface.
75
75
  *
76
- * A `Read` scope is a unified scope that authorizes `MessagesRead`, `MessagesSubscribe`, and `MessagesSync` operations.
77
- * The `Subscribe` and `Sync` method values are retained for backward compatibility with existing grants but are
78
- * functionally equivalent to `Read` — new grants SHOULD use `Read` exclusively.
76
+ * `Read` is the only valid method and acts as a unified scope that authorizes
77
+ * `MessagesRead`, `MessagesSubscribe`, and `MessagesSync` operations.
79
78
  */
80
79
  export type MessagesPermissionScope = {
81
80
  interface: DwnInterfaceName.Messages;
82
- method: DwnMethodName.Read | DwnMethodName.Subscribe | DwnMethodName.Sync;
81
+ method: DwnMethodName.Read;
83
82
  protocol?: string;
84
83
  };
85
84
  /**
@@ -1 +1 @@
1
- {"version":3,"file":"permission-types.d.ts","sourceRoot":"","sources":["../../../../src/types/permission-types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,gBAAgB,EAAE,aAAa,EAAE,MAAM,kCAAkC,CAAC;AAExF;;GAEG;AACH,MAAM,MAAM,qBAAqB,GAAG;IAElC;;OAEG;IACH,SAAS,EAAE,OAAO,CAAC;IAEnB;;OAEG;IACH,WAAW,CAAC,EAAE,MAAM,CAAC;IAErB;;OAEG;IACH,KAAK,EAAE,eAAe,CAAC;IAEvB,UAAU,CAAC,EAAE,oBAAoB,CAAA;CAClC,CAAC;AAEF;;GAEG;AACH,MAAM,MAAM,mBAAmB,GAAG;IAChC;;OAEG;IACH,WAAW,CAAC,EAAE,MAAM,CAAC;IAErB;;SAEK;IACL,SAAS,CAAC,EAAE,MAAM,CAAC;IAEnB;;OAEG;IACH,WAAW,EAAE,MAAM,CAAC;IAEpB;;OAEG;IACH,SAAS,CAAC,EAAE,OAAO,CAAC;IAEpB;;OAEG;IACH,KAAK,EAAE,eAAe,CAAC;IAEvB,UAAU,CAAC,EAAE,oBAAoB,CAAC;IAElC;;;;OAIG;IACH,mBAAmB,CAAC,EAAE;QACpB,SAAS,EAAE,MAAM,CAAC;QAClB,YAAY,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;KACnC,CAAC;CACH,CAAC;AAEF;;GAEG;AACH,MAAM,MAAM,wBAAwB,GAAG;IACrC;;OAEG;IACH,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB,CAAC;AAEF;;GAEG;AACH,MAAM,MAAM,eAAe,GAAG,uBAAuB,GAAG,uBAAuB,GAAG,sBAAsB,CAAC;AAEzG,MAAM,MAAM,uBAAuB,GAAG;IACpC,SAAS,EAAE,gBAAgB,CAAC,SAAS,CAAC;IACtC,MAAM,EAAE,aAAa,CAAC,SAAS,GAAG,aAAa,CAAC,KAAK,CAAC;IACtD,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB,CAAC;AAEF;;;;;;GAMG;AACH,MAAM,MAAM,uBAAuB,GAAG;IACpC,SAAS,EAAE,gBAAgB,CAAC,QAAQ,CAAC;IACrC,MAAM,EAAE,aAAa,CAAC,IAAI,GAAG,aAAa,CAAC,SAAS,GAAG,aAAa,CAAC,IAAI,CAAC;IAC1E,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB,CAAC;AAEF;;GAEG;AACH,MAAM,MAAM,sBAAsB,GAAG;IACnC,SAAS,EAAE,gBAAgB,CAAC,OAAO,CAAC;IACpC,MAAM,EAAE,aAAa,CAAC,KAAK,GAAG,aAAa,CAAC,IAAI,GAAG,aAAa,CAAC,KAAK,GAAG,aAAa,CAAC,KAAK,GAAG,aAAa,CAAC,SAAS,GAAG,aAAa,CAAC,MAAM,CAAC;IAC9I,QAAQ,EAAE,MAAM,CAAC;IACjB,qFAAqF;IACrF,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,kFAAkF;IAClF,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB,CAAC;AAEF,oBAAY,8BAA8B;IACxC,QAAQ,aAAa;IACrB,UAAU,eAAe;CAC1B;AAED,MAAM,MAAM,oBAAoB,GAAG;IACjC;;;;OAIG;IACH,WAAW,CAAC,EAAE,8BAA8B,CAAC;CAC9C,CAAC"}
1
+ {"version":3,"file":"permission-types.d.ts","sourceRoot":"","sources":["../../../../src/types/permission-types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,gBAAgB,EAAE,aAAa,EAAE,MAAM,kCAAkC,CAAC;AAExF;;GAEG;AACH,MAAM,MAAM,qBAAqB,GAAG;IAElC;;OAEG;IACH,SAAS,EAAE,OAAO,CAAC;IAEnB;;OAEG;IACH,WAAW,CAAC,EAAE,MAAM,CAAC;IAErB;;OAEG;IACH,KAAK,EAAE,eAAe,CAAC;IAEvB,UAAU,CAAC,EAAE,oBAAoB,CAAA;CAClC,CAAC;AAEF;;GAEG;AACH,MAAM,MAAM,mBAAmB,GAAG;IAChC;;OAEG;IACH,WAAW,CAAC,EAAE,MAAM,CAAC;IAErB;;SAEK;IACL,SAAS,CAAC,EAAE,MAAM,CAAC;IAEnB;;OAEG;IACH,WAAW,EAAE,MAAM,CAAC;IAEpB;;OAEG;IACH,SAAS,CAAC,EAAE,OAAO,CAAC;IAEpB;;OAEG;IACH,KAAK,EAAE,eAAe,CAAC;IAEvB,UAAU,CAAC,EAAE,oBAAoB,CAAC;IAElC;;;;OAIG;IACH,mBAAmB,CAAC,EAAE;QACpB,SAAS,EAAE,MAAM,CAAC;QAClB,YAAY,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;KACnC,CAAC;CACH,CAAC;AAEF;;GAEG;AACH,MAAM,MAAM,wBAAwB,GAAG;IACrC;;OAEG;IACH,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB,CAAC;AAEF;;GAEG;AACH,MAAM,MAAM,eAAe,GAAG,uBAAuB,GAAG,uBAAuB,GAAG,sBAAsB,CAAC;AAEzG,MAAM,MAAM,uBAAuB,GAAG;IACpC,SAAS,EAAE,gBAAgB,CAAC,SAAS,CAAC;IACtC,MAAM,EAAE,aAAa,CAAC,SAAS,GAAG,aAAa,CAAC,KAAK,CAAC;IACtD,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB,CAAC;AAEF;;;;;GAKG;AACH,MAAM,MAAM,uBAAuB,GAAG;IACpC,SAAS,EAAE,gBAAgB,CAAC,QAAQ,CAAC;IACrC,MAAM,EAAE,aAAa,CAAC,IAAI,CAAC;IAC3B,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB,CAAC;AAEF;;GAEG;AACH,MAAM,MAAM,sBAAsB,GAAG;IACnC,SAAS,EAAE,gBAAgB,CAAC,OAAO,CAAC;IACpC,MAAM,EAAE,aAAa,CAAC,KAAK,GAAG,aAAa,CAAC,IAAI,GAAG,aAAa,CAAC,KAAK,GAAG,aAAa,CAAC,KAAK,GAAG,aAAa,CAAC,SAAS,GAAG,aAAa,CAAC,MAAM,CAAC;IAC9I,QAAQ,EAAE,MAAM,CAAC;IACjB,qFAAqF;IACrF,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,kFAAkF;IAClF,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB,CAAC;AAEF,oBAAY,8BAA8B;IACxC,QAAQ,aAAa;IACrB,UAAU,eAAe;CAC1B;AAED,MAAM,MAAM,oBAAoB,GAAG;IACjC;;;;OAIG;IACH,WAAW,CAAC,EAAE,8BAA8B,CAAC;CAC9C,CAAC"}
@@ -3,8 +3,8 @@ import type { Cache } from '../types/cache.js';
3
3
  * A cache using local memory.
4
4
  */
5
5
  export declare class MemoryCache implements Cache {
6
- private timeToLiveInSeconds;
7
- private cache;
6
+ private readonly timeToLiveInSeconds;
7
+ private readonly cache;
8
8
  /**
9
9
  * @param timeToLiveInSeconds time-to-live for every key-value pair set in the cache
10
10
  */
@@ -1 +1 @@
1
- {"version":3,"file":"memory-cache.d.ts","sourceRoot":"","sources":["../../../../src/utils/memory-cache.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,mBAAmB,CAAC;AAG/C;;GAEG;AACH,qBAAa,WAAY,YAAW,KAAK;IAMnB,OAAO,CAAC,mBAAmB;IAL/C,OAAO,CAAC,KAAK,CAAwB;IAErC;;OAEG;gBACyB,mBAAmB,EAAE,MAAM;IAOjD,GAAG,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,GAAG,GAAG,OAAO,CAAC,IAAI,CAAC;IAQ3C,GAAG,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,GAAG,GAAG,SAAS,CAAC;CAGjD"}
1
+ {"version":3,"file":"memory-cache.d.ts","sourceRoot":"","sources":["../../../../src/utils/memory-cache.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,mBAAmB,CAAC;AAG/C;;GAEG;AACH,qBAAa,WAAY,YAAW,KAAK;IAMnB,OAAO,CAAC,QAAQ,CAAC,mBAAmB;IALxD,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAwB;IAE9C;;OAEG;gBACkC,mBAAmB,EAAE,MAAM;IAO1D,GAAG,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,GAAG,GAAG,OAAO,CAAC,IAAI,CAAC;IAQ3C,GAAG,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,GAAG,GAAG,SAAS,CAAC;CAGjD"}
@@ -23,8 +23,8 @@ export type PrivateKeySignerOptions = {
23
23
  export declare class PrivateKeySigner implements MessageSigner {
24
24
  keyId: string;
25
25
  algorithm: string;
26
- private privateJwk;
27
- private signatureAlgorithm;
26
+ private readonly privateJwk;
27
+ private readonly signatureAlgorithm;
28
28
  constructor(options: PrivateKeySignerOptions);
29
29
  /**
30
30
  * Signs the given content and returns the signature as bytes.
@@ -1 +1 @@
1
- {"version":3,"file":"private-key-signer.d.ts","sourceRoot":"","sources":["../../../../src/utils/private-key-signer.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AACxD,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,wBAAwB,CAAC;AAK5D;;GAEG;AACH,MAAM,MAAM,uBAAuB,GAAG;IACpC;;OAEG;IACH,UAAU,EAAE,aAAa,CAAC;IAE1B;;OAEG;IACH,KAAK,CAAC,EAAE,MAAM,CAAC;IAEf;;OAEG;IACH,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB,CAAC;AAEF;;GAEG;AACH,qBAAa,gBAAiB,YAAW,aAAa;IAC7C,KAAK,SAAC;IACN,SAAS,SAAC;IACjB,OAAO,CAAC,UAAU,CAAgB;IAClC,OAAO,CAAC,kBAAkB,CAAC;gBAER,OAAO,EAAE,uBAAuB;IA8BnD;;OAEG;IACU,IAAI,CAAE,OAAO,EAAE,UAAU,GAAG,OAAO,CAAC,UAAU,CAAC;CAI7D"}
1
+ {"version":3,"file":"private-key-signer.d.ts","sourceRoot":"","sources":["../../../../src/utils/private-key-signer.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AACxD,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,wBAAwB,CAAC;AAK5D;;GAEG;AACH,MAAM,MAAM,uBAAuB,GAAG;IACpC;;OAEG;IACH,UAAU,EAAE,aAAa,CAAC;IAE1B;;OAEG;IACH,KAAK,CAAC,EAAE,MAAM,CAAC;IAEf;;OAEG;IACH,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB,CAAC;AAEF;;GAEG;AACH,qBAAa,gBAAiB,YAAW,aAAa;IAC7C,KAAK,SAAC;IACN,SAAS,SAAC;IACjB,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAgB;IAC3C,OAAO,CAAC,QAAQ,CAAC,kBAAkB,CAAC;gBAEjB,OAAO,EAAE,uBAAuB;IA8BnD;;OAEG;IACU,IAAI,CAAE,OAAO,EAAE,UAAU,GAAG,OAAO,CAAC,UAAU,CAAC;CAI7D"}
@@ -2,15 +2,12 @@
2
2
  * Time related utilities.
3
3
  */
4
4
  export declare class Time {
5
- /**
6
- * sleeps for the desired duration
7
- * @param durationInMillisecond the desired amount of sleep time
8
- * @returns when the provided duration has passed
9
- */
10
- static sleep(durationInMillisecond: number): Promise<void>;
11
5
  /**
12
6
  * We must sleep for at least 2ms to avoid timestamp collisions during testing.
13
7
  * https://github.com/enboxorg/enbox/issues/481
8
+ *
9
+ * For arbitrary-duration sleeps, use `sleep` from `@enbox/common`
10
+ * directly — this class only retains the DWN-specific minimum.
14
11
  */
15
12
  static minimalSleep(): Promise<void>;
16
13
  /**
@@ -1 +1 @@
1
- {"version":3,"file":"time.d.ts","sourceRoot":"","sources":["../../../../src/utils/time.ts"],"names":[],"mappings":"AAGA;;GAEG;AACH,qBAAa,IAAI;IACf;;;;OAIG;WACiB,KAAK,CAAC,qBAAqB,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAIvE;;;OAGG;WACiB,YAAY,IAAI,OAAO,CAAC,IAAI,CAAC;IAIjD;;;OAGG;WACW,mBAAmB,IAAI,MAAM;IAI3C;;;;OAIG;WACW,eAAe,CAAC,OAAO,EAAE;QACrC,IAAI,CAAC,EAAE,MAAM,CAAC;QAAC,KAAK,CAAC,EAAE,MAAM,CAAC;QAAC,GAAG,CAAC,EAAE,MAAM,CAAC;QAAC,IAAI,CAAC,EAAE,MAAM,CAAC;QAAC,MAAM,CAAC,EAAE,MAAM,CAAC;QAAC,MAAM,CAAC,EAAE,MAAM,CAAC;QAAC,WAAW,CAAC,EAAE,MAAM,CAAC;QAAC,WAAW,CAAC,EAAE,MAAM,CAAA;KACzI,GAAG,MAAM;IAeV;;;OAGG;WACW,qBAAqB,CAAC,MAAM,EAAE;QAAE,OAAO,EAAE,MAAM,CAAA;KAAE,EAAE,SAAS,CAAC,EAAE,MAAM,GAAG,MAAM;IAO5F;;;;OAIG;WACW,iBAAiB,CAAC,SAAS,EAAE,MAAM,GAAG,IAAI;CAOzD"}
1
+ {"version":3,"file":"time.d.ts","sourceRoot":"","sources":["../../../../src/utils/time.ts"],"names":[],"mappings":"AAIA;;GAEG;AACH,qBAAa,IAAI;IACf;;;;;;OAMG;WACiB,YAAY,IAAI,OAAO,CAAC,IAAI,CAAC;IAIjD;;;OAGG;WACW,mBAAmB,IAAI,MAAM;IAI3C;;;;OAIG;WACW,eAAe,CAAC,OAAO,EAAE;QACrC,IAAI,CAAC,EAAE,MAAM,CAAC;QAAC,KAAK,CAAC,EAAE,MAAM,CAAC;QAAC,GAAG,CAAC,EAAE,MAAM,CAAC;QAAC,IAAI,CAAC,EAAE,MAAM,CAAC;QAAC,MAAM,CAAC,EAAE,MAAM,CAAC;QAAC,MAAM,CAAC,EAAE,MAAM,CAAC;QAAC,WAAW,CAAC,EAAE,MAAM,CAAC;QAAC,WAAW,CAAC,EAAE,MAAM,CAAA;KACzI,GAAG,MAAM;IAeV;;;OAGG;WACW,qBAAqB,CAAC,MAAM,EAAE;QAAE,OAAO,EAAE,MAAM,CAAA;KAAE,EAAE,SAAS,CAAC,EAAE,MAAM,GAAG,MAAM;IAO5F;;;;OAIG;WACW,iBAAiB,CAAC,SAAS,EAAE,MAAM,GAAG,IAAI;CAOzD"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=grant-authorization.spec.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"grant-authorization.spec.d.ts","sourceRoot":"","sources":["../../../../tests/core/grant-authorization.spec.ts"],"names":[],"mappings":""}
@@ -0,0 +1,29 @@
1
+ /**
2
+ * Regression tests for cross-protocol prune cascade — closes #298.
3
+ *
4
+ * Semantics (decision under #298):
5
+ * A `RecordsDelete` with `prune: true` cascades to every descendant of the
6
+ * pruned record, regardless of which protocol a descendant declares itself
7
+ * under. `parentContextId` is a structural link — pruning a parent removes
8
+ * the entire subtree it rooted. Cross-protocol composing children (records
9
+ * in a different protocol that reference the parent via `$ref` / `uses`)
10
+ * participate in the cascade on equal footing with same-protocol children.
11
+ *
12
+ * Rationale:
13
+ * - A DWN is tenant-owned storage. The tenant's prune authority extends
14
+ * across the whole subtree they rooted, so walking the `parentId` chain
15
+ * unconditionally is the correct semantic.
16
+ * - Preserving cross-protocol orphans creates a half-alive state — readable
17
+ * but not updatable, since `validateReferentialIntegrity` in the
18
+ * `RecordsWrite` handler rejects any write whose parent is missing —
19
+ * which is worse for callers than cascading.
20
+ * - Same-protocol descendants at arbitrary depth already cascade via
21
+ * `parentId` with no protocol filter; treating a cross-protocol hop
22
+ * specially was inconsistent.
23
+ *
24
+ * These tests install multiple protocols linked via `uses` + `$ref`, write
25
+ * records across protocol boundaries, and assert that the entire subtree —
26
+ * same protocol or cross protocol, at any depth — is fully purged on prune.
27
+ */
28
+ export declare function testRecordsPruneCrossProtocol(): void;
29
+ //# sourceMappingURL=records-prune-cross-protocol.spec.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"records-prune-cross-protocol.spec.d.ts","sourceRoot":"","sources":["../../../../tests/features/records-prune-cross-protocol.spec.ts"],"names":[],"mappings":"AA8BA;;;;;;;;;;;;;;;;;;;;;;;;;;GA0BG;AACH,wBAAgB,6BAA6B,IAAI,IAAI,CAyfpD"}
@@ -1 +1 @@
1
- {"version":3,"file":"messages-subscribe.spec.d.ts","sourceRoot":"","sources":["../../../../tests/handlers/messages-subscribe.spec.ts"],"names":[],"mappings":"AAsBA,wBAAgB,4BAA4B,IAAI,IAAI,CAi8BnD"}
1
+ {"version":3,"file":"messages-subscribe.spec.d.ts","sourceRoot":"","sources":["../../../../tests/handlers/messages-subscribe.spec.ts"],"names":[],"mappings":"AAsBA,wBAAgB,4BAA4B,IAAI,IAAI,CAu6BnD"}
@@ -1 +1 @@
1
- {"version":3,"file":"messages-sync.spec.d.ts","sourceRoot":"","sources":["../../../../tests/handlers/messages-sync.spec.ts"],"names":[],"mappings":"AAwBA,wBAAgB,uBAAuB,IAAI,IAAI,CAy1B9C"}
1
+ {"version":3,"file":"messages-sync.spec.d.ts","sourceRoot":"","sources":["../../../../tests/handlers/messages-sync.spec.ts"],"names":[],"mappings":"AAwBA,wBAAgB,uBAAuB,IAAI,IAAI,CA8zB9C"}
@@ -1 +1 @@
1
- {"version":3,"file":"protocols-query.spec.d.ts","sourceRoot":"","sources":["../../../../tests/handlers/protocols-query.spec.ts"],"names":[],"mappings":"AAwBA,wBAAgB,yBAAyB,IAAI,IAAI,CA8gBhD"}
1
+ {"version":3,"file":"protocols-query.spec.d.ts","sourceRoot":"","sources":["../../../../tests/handlers/protocols-query.spec.ts"],"names":[],"mappings":"AAwBA,wBAAgB,yBAAyB,IAAI,IAAI,CA+gBhD"}
@@ -1 +1 @@
1
- {"version":3,"file":"records-subscribe.spec.d.ts","sourceRoot":"","sources":["../../../../tests/handlers/records-subscribe.spec.ts"],"names":[],"mappings":"AAwBA,wBAAgB,2BAA2B,IAAI,IAAI,CAwuClD"}
1
+ {"version":3,"file":"records-subscribe.spec.d.ts","sourceRoot":"","sources":["../../../../tests/handlers/records-subscribe.spec.ts"],"names":[],"mappings":"AAyBA,wBAAgB,2BAA2B,IAAI,IAAI,CAwuClD"}
@@ -1 +1 @@
1
- {"version":3,"file":"test-suite.d.ts","sourceRoot":"","sources":["../../../tests/test-suite.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,QAAQ,EAAE,YAAY,EAAE,kBAAkB,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAuCzG;;GAEG;AACH,qBAAa,SAAS;IAEpB;;;OAGG;WACW,2BAA2B,CAAC,SAAS,CAAC,EAAE;QACpD,YAAY,CAAC,EAAE,YAAY,CAAC;QAC5B,SAAS,CAAC,EAAE,SAAS,CAAC;QACtB,UAAU,CAAC,EAAE,UAAU,CAAC;QACxB,QAAQ,CAAC,EAAE,QAAQ,CAAC;QACpB,kBAAkB,CAAC,EAAE,kBAAkB,CAAC;KACzC,GAAG,IAAI;CA8CT"}
1
+ {"version":3,"file":"test-suite.d.ts","sourceRoot":"","sources":["../../../tests/test-suite.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,QAAQ,EAAE,YAAY,EAAE,kBAAkB,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAwCzG;;GAEG;AACH,qBAAa,SAAS;IAEpB;;;OAGG;WACW,2BAA2B,CAAC,SAAS,CAAC,EAAE;QACpD,YAAY,CAAC,EAAE,YAAY,CAAC;QAC5B,SAAS,CAAC,EAAE,SAAS,CAAC;QACtB,UAAU,CAAC,EAAE,UAAU,CAAC;QACxB,QAAQ,CAAC,EAAE,QAAQ,CAAC;QACpB,kBAAkB,CAAC,EAAE,kBAAkB,CAAC;KACzC,GAAG,IAAI;CA+CT"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@enbox/dwn-sdk-js",
3
- "version": "0.3.4",
3
+ "version": "0.3.6",
4
4
  "description": "A reference implementation of https://identity.foundation/decentralized-web-node/spec/",
5
5
  "repository": {
6
6
  "type": "git",
@@ -64,8 +64,9 @@
64
64
  },
65
65
  "react-native": "./dist/esm/src/index.js",
66
66
  "dependencies": {
67
- "@enbox/crypto": "0.1.0",
68
- "@enbox/dids": "0.1.0",
67
+ "@enbox/common": "0.1.1",
68
+ "@enbox/crypto": "0.1.1",
69
+ "@enbox/dids": "0.1.1",
69
70
  "@ipld/dag-cbor": "9.0.5",
70
71
  "@js-temporal/polyfill": "0.4.4",
71
72
  "@noble/ciphers": "0.5.3",
@@ -8,22 +8,22 @@ import { Message } from './message.js';
8
8
  * An abstract implementation of the `MessageInterface` interface.
9
9
  */
10
10
  export abstract class AbstractMessage<M extends GenericMessage> implements MessageInterface<M> {
11
- private _message: M;
11
+ private readonly _message: M;
12
12
  public get message(): M {
13
- return this._message as M;
13
+ return this._message;
14
14
  }
15
15
 
16
- private _signer: string | undefined;
16
+ private readonly _signer: string | undefined;
17
17
  public get signer(): string | undefined {
18
18
  return this._signer;
19
19
  }
20
20
 
21
- private _author: string | undefined;
21
+ private readonly _author: string | undefined;
22
22
  public get author(): string | undefined {
23
23
  return this._author;
24
24
  }
25
25
 
26
- private _signaturePayload: GenericSignaturePayload | undefined;
26
+ private readonly _signaturePayload: GenericSignaturePayload | undefined;
27
27
  public get signaturePayload(): GenericSignaturePayload | undefined {
28
28
  return this._signaturePayload;
29
29
  }
@@ -43,10 +43,10 @@ export abstract class AbstractMessage<M extends GenericMessage> implements Messa
43
43
 
44
44
  // if the message authorization contains author delegated grant, the author would be the grantor of the grant
45
45
  // else the author would be the signer of the message
46
- if (message.authorization.authorDelegatedGrant !== undefined) {
47
- this._author = Message.getSigner(message.authorization.authorDelegatedGrant);
48
- } else {
46
+ if (message.authorization.authorDelegatedGrant === undefined) {
49
47
  this._author = this._signer;
48
+ } else {
49
+ this._author = Message.getSigner(message.authorization.authorDelegatedGrant);
50
50
  }
51
51
 
52
52
  this._signaturePayload = Jws.decodePlainObjectPayload(message.authorization.signature);
@@ -146,8 +146,15 @@ export class GrantAuthorization {
146
146
  );
147
147
  }
148
148
 
149
- // For the Messages interface, a `Read` scope is a unified scope that also covers `Subscribe` and `Sync`.
150
- if (dwnInterface === DwnInterfaceName.Messages && permissionGrant.scope.method === DwnMethodName.Read) {
149
+ // Messages.Read is the only valid Messages scope and covers Read, Subscribe, and Sync operations.
150
+ // Reject any Messages grant with method !== Read (malformed or legacy stored data).
151
+ if (dwnInterface === DwnInterfaceName.Messages) {
152
+ if (permissionGrant.scope.method !== DwnMethodName.Read) {
153
+ throw new DwnError(
154
+ DwnErrorCode.GrantAuthorizationMethodMismatch,
155
+ `messages permission grant must have method 'Read', got '${permissionGrant.scope.method}' for grant ${permissionGrant.id}`
156
+ );
157
+ }
151
158
  const allowedMethods = [DwnMethodName.Read, DwnMethodName.Subscribe, DwnMethodName.Sync];
152
159
  if (!allowedMethods.includes(dwnMethod as DwnMethodName)) {
153
160
  throw new DwnError(
@@ -8,7 +8,7 @@ import { Encoder } from '../utils/encoder.js';
8
8
  import { GeneralJwsBuilder } from '../jose/jws/general/builder.js';
9
9
  import { Jws } from '../utils/jws.js';
10
10
  import { lexicographicalCompare } from '../utils/string.js';
11
- import { removeUndefinedProperties } from '../utils/object.js';
11
+ import { removeUndefinedProperties } from '@enbox/common';
12
12
  import { validateJsonSchema } from '../schema-validator.js';
13
13
  import { DwnError, DwnErrorCode } from './dwn-error.js';
14
14
 
@@ -26,10 +26,10 @@ export class Message {
26
26
  }
27
27
 
28
28
  let author;
29
- if (message.authorization.authorDelegatedGrant !== undefined) {
30
- author = Message.getSigner(message.authorization.authorDelegatedGrant);
31
- } else {
29
+ if (message.authorization.authorDelegatedGrant === undefined) {
32
30
  author = Message.getSigner(message);
31
+ } else {
32
+ author = Message.getSigner(message.authorization.authorDelegatedGrant);
33
33
  }
34
34
 
35
35
  return author;
@@ -53,7 +53,7 @@ export async function verifyInvokedRole(
53
53
  );
54
54
  }
55
55
 
56
- if (protocolDefinition.uses === undefined || protocolDefinition.uses[parsed.alias] === undefined) {
56
+ if (protocolDefinition.uses?.[parsed.alias] === undefined) {
57
57
  throw new DwnError(
58
58
  DwnErrorCode.ProtocolAuthorizationNotARole,
59
59
  `Cross-protocol role alias '${parsed.alias}' in '${protocolRole}' does not exist in the protocol's 'uses' map.`
@@ -68,7 +68,7 @@ export async function verifyInvokedRole(
68
68
  tenant, roleProtocolUri, messageStore, governingTimestamp
69
69
  );
70
70
  const roleRuleSet = getRuleSetAtPath(roleProtocolPath, refDefinition.structure);
71
- if (roleRuleSet === undefined || !roleRuleSet.$role) {
71
+ if (!roleRuleSet?.$role) {
72
72
  throw new DwnError(
73
73
  DwnErrorCode.ProtocolAuthorizationNotARole,
74
74
  `Cross-protocol role path ${protocolRole} does not match role record type.`
@@ -77,7 +77,7 @@ export async function verifyInvokedRole(
77
77
  } else {
78
78
  // Local role: validate in the composing protocol's definition
79
79
  const roleRuleSet = getRuleSetAtPath(protocolRole, protocolDefinition.structure);
80
- if (roleRuleSet === undefined || !roleRuleSet.$role) {
80
+ if (!roleRuleSet?.$role) {
81
81
  throw new DwnError(
82
82
  DwnErrorCode.ProtocolAuthorizationNotARole,
83
83
  `Protocol path ${protocolRole} does not match role record type.`
@@ -28,7 +28,7 @@ export async function verifyProtocolPathAndContextId(
28
28
  fetchProtocolDefinition: FetchProtocolDefinitionFn,
29
29
  governingTimestamp?: string,
30
30
  ): Promise<void> {
31
- const declaredProtocolPath = inboundMessage.message.descriptor.protocolPath!;
31
+ const declaredProtocolPath = inboundMessage.message.descriptor.protocolPath;
32
32
  const declaredTypeName = getTypeName(declaredProtocolPath);
33
33
 
34
34
  const parentId = inboundMessage.message.descriptor.parentId;
@@ -47,7 +47,7 @@ export async function verifyProtocolPathAndContextId(
47
47
 
48
48
  // Determine the protocol URI for the parent query.
49
49
  // If the parent path segment has a `$ref` in the composing protocol, the parent lives in a different protocol.
50
- const childProtocol = inboundMessage.message.descriptor.protocol!;
50
+ const childProtocol = inboundMessage.message.descriptor.protocol;
51
51
  const parentProtocolUri = await resolveParentProtocolUri(
52
52
  tenant, childProtocol, declaredProtocolPath, messageStore, fetchProtocolDefinition, governingTimestamp
53
53
  );
@@ -174,7 +174,7 @@ export async function verifyTypeWithComposition(
174
174
  fetchProtocolDefinition: FetchProtocolDefinitionFn,
175
175
  governingTimestamp?: string,
176
176
  ): Promise<void> {
177
- const declaredProtocolPath = inboundMessage.descriptor.protocolPath!;
177
+ const declaredProtocolPath = inboundMessage.descriptor.protocolPath;
178
178
  const declaredTypeName = getTypeName(declaredProtocolPath);
179
179
 
180
180
  // Resolve which protocol types map to use.
@@ -231,7 +231,7 @@ export function verifyType(
231
231
  protocolTypes: ProtocolTypes,
232
232
  typeName?: string,
233
233
  ): void {
234
- const declaredTypeName = typeName ?? getTypeName(inboundMessage.descriptor.protocolPath!);
234
+ const declaredTypeName = typeName ?? getTypeName(inboundMessage.descriptor.protocolPath);
235
235
  const typeNames = Object.keys(protocolTypes);
236
236
 
237
237
  if (!typeNames.includes(declaredTypeName)) {
@@ -361,12 +361,12 @@ export async function verifyAsRoleRecordIfNeeded(
361
361
  );
362
362
  }
363
363
 
364
- const protocolPath = incomingRecordsWrite.message.descriptor.protocolPath!;
364
+ const protocolPath = incomingRecordsWrite.message.descriptor.protocolPath;
365
365
  const filter: Filter = {
366
366
  interface : DwnInterfaceName.Records,
367
367
  method : DwnMethodName.Write,
368
368
  isLatestBaseState : true,
369
- protocol : incomingRecordsWrite.message.descriptor.protocol!,
369
+ protocol : incomingRecordsWrite.message.descriptor.protocol,
370
370
  protocolPath,
371
371
  recipient,
372
372
  };
@@ -422,12 +422,12 @@ export async function verifyRecordLimit(
422
422
  const { max, strategy } = ruleSet.$recordLimit;
423
423
 
424
424
  // Build a filter to count existing records at the same protocol path and parent context.
425
- const protocolPath = incomingMessage.message.descriptor.protocolPath!;
425
+ const protocolPath = incomingMessage.message.descriptor.protocolPath;
426
426
  const filter: Filter = {
427
427
  interface : DwnInterfaceName.Records,
428
428
  method : DwnMethodName.Write,
429
429
  isLatestBaseState : true,
430
- protocol : incomingMessage.message.descriptor.protocol!,
430
+ protocol : incomingMessage.message.descriptor.protocol,
431
431
  protocolPath,
432
432
  };
433
433
 
@@ -445,7 +445,7 @@ export async function verifyRecordLimit(
445
445
  throw new DwnError(
446
446
  DwnErrorCode.ProtocolAuthorizationRecordLimitExceeded,
447
447
  `record limit of ${max} reached at protocol path '${protocolPath}'` +
448
- `${parentContextId !== '' ? ` under parent context '${parentContextId}'` : ''}` +
448
+ `${parentContextId === '' ? '' : ` under parent context '${parentContextId}'`}` +
449
449
  `: new records are rejected until existing records are deleted.`
450
450
  );
451
451
  }
@@ -61,7 +61,7 @@ export class ProtocolAuthorization {
61
61
  // fetch the protocol definition that was active at the governing timestamp
62
62
  const protocolDefinition = await ProtocolAuthorization.fetchProtocolDefinition(
63
63
  tenant,
64
- incomingMessage.message.descriptor.protocol!,
64
+ incomingMessage.message.descriptor.protocol,
65
65
  messageStore,
66
66
  governingTimestamp,
67
67
  coreProtocols,
@@ -85,7 +85,7 @@ export class ProtocolAuthorization {
85
85
 
86
86
  // get the rule set for the inbound message
87
87
  const ruleSet = ProtocolAuthorization.getRuleSet(
88
- incomingMessage.message.descriptor.protocolPath!,
88
+ incomingMessage.message.descriptor.protocolPath,
89
89
  protocolDefinition,
90
90
  );
91
91
 
@@ -143,7 +143,7 @@ export class ProtocolAuthorization {
143
143
  // fetch the protocol definition that was active at the governing timestamp
144
144
  const protocolDefinition = await ProtocolAuthorization.fetchProtocolDefinition(
145
145
  tenant,
146
- incomingMessage.message.descriptor.protocol!,
146
+ incomingMessage.message.descriptor.protocol,
147
147
  messageStore,
148
148
  governingTimestamp,
149
149
  coreProtocols,
@@ -151,7 +151,7 @@ export class ProtocolAuthorization {
151
151
 
152
152
  // get the rule set for the inbound message
153
153
  const ruleSet = ProtocolAuthorization.getRuleSet(
154
- incomingMessage.message.descriptor.protocolPath!,
154
+ incomingMessage.message.descriptor.protocolPath,
155
155
  protocolDefinition,
156
156
  );
157
157
 
@@ -161,8 +161,8 @@ export class ProtocolAuthorization {
161
161
  await verifyInvokedRole(
162
162
  tenant,
163
163
  incomingMessage,
164
- incomingMessage.message.descriptor.protocol!,
165
- incomingMessage.message.contextId!,
164
+ incomingMessage.message.descriptor.protocol,
165
+ incomingMessage.message.contextId,
166
166
  protocolDefinition,
167
167
  messageStore,
168
168
  boundFetchDefinition,
@@ -201,14 +201,14 @@ export class ProtocolAuthorization {
201
201
  const initialWrite = await fetchInitialWrite(
202
202
  tenant, newestRecordsWrite.message.recordId, messageStore
203
203
  );
204
- const governingTimestamp = initialWrite !== undefined
205
- ? initialWrite.descriptor.messageTimestamp
206
- : newestRecordsWrite.message.descriptor.messageTimestamp;
204
+ const governingTimestamp = initialWrite === undefined
205
+ ? newestRecordsWrite.message.descriptor.messageTimestamp
206
+ : initialWrite.descriptor.messageTimestamp;
207
207
 
208
208
  // fetch the protocol definition that was active when the record was created
209
209
  const protocolDefinition = await ProtocolAuthorization.fetchProtocolDefinition(
210
210
  tenant,
211
- newestRecordsWrite.message.descriptor.protocol!,
211
+ newestRecordsWrite.message.descriptor.protocol,
212
212
  messageStore,
213
213
  governingTimestamp,
214
214
  coreProtocols,
@@ -216,7 +216,7 @@ export class ProtocolAuthorization {
216
216
 
217
217
  // get the rule set for the inbound message
218
218
  const ruleSet = ProtocolAuthorization.getRuleSet(
219
- newestRecordsWrite.message.descriptor.protocolPath!,
219
+ newestRecordsWrite.message.descriptor.protocolPath,
220
220
  protocolDefinition,
221
221
  );
222
222
 
@@ -226,8 +226,8 @@ export class ProtocolAuthorization {
226
226
  await verifyInvokedRole(
227
227
  tenant,
228
228
  incomingMessage,
229
- newestRecordsWrite.message.descriptor.protocol!,
230
- newestRecordsWrite.message.contextId!,
229
+ newestRecordsWrite.message.descriptor.protocol,
230
+ newestRecordsWrite.message.contextId,
231
231
  protocolDefinition,
232
232
  messageStore,
233
233
  boundFetchDefinition,
@@ -312,14 +312,14 @@ export class ProtocolAuthorization {
312
312
  const initialWrite = await fetchInitialWrite(
313
313
  tenant, incomingMessage.message.descriptor.recordId, messageStore
314
314
  );
315
- const governingTimestamp = initialWrite !== undefined
316
- ? initialWrite.descriptor.messageTimestamp
317
- : recordsWrite.message.descriptor.messageTimestamp;
315
+ const governingTimestamp = initialWrite === undefined
316
+ ? recordsWrite.message.descriptor.messageTimestamp
317
+ : initialWrite.descriptor.messageTimestamp;
318
318
 
319
319
  // fetch the protocol definition that was active when the record was created
320
320
  const protocolDefinition = await ProtocolAuthorization.fetchProtocolDefinition(
321
321
  tenant,
322
- recordsWrite.message.descriptor.protocol!,
322
+ recordsWrite.message.descriptor.protocol,
323
323
  messageStore,
324
324
  governingTimestamp,
325
325
  coreProtocols,
@@ -327,7 +327,7 @@ export class ProtocolAuthorization {
327
327
 
328
328
  // get the rule set for the inbound message
329
329
  const ruleSet = ProtocolAuthorization.getRuleSet(
330
- recordsWrite.message.descriptor.protocolPath!,
330
+ recordsWrite.message.descriptor.protocolPath,
331
331
  protocolDefinition,
332
332
  );
333
333
 
@@ -337,8 +337,8 @@ export class ProtocolAuthorization {
337
337
  await verifyInvokedRole(
338
338
  tenant,
339
339
  incomingMessage,
340
- recordsWrite.message.descriptor.protocol!,
341
- recordsWrite.message.contextId!,
340
+ recordsWrite.message.descriptor.protocol,
341
+ recordsWrite.message.contextId,
342
342
  protocolDefinition,
343
343
  messageStore,
344
344
  boundFetchDefinition,
@@ -389,12 +389,12 @@ export class ProtocolAuthorization {
389
389
  protocol : protocolUri,
390
390
  };
391
391
 
392
- if (messageTimestamp !== undefined) {
393
- // temporal lookup: find the protocol definition active at the given timestamp
394
- query.messageTimestamp = { lte: messageTimestamp };
395
- } else {
392
+ if (messageTimestamp === undefined) {
396
393
  // default: return only the latest protocol definition
397
394
  query.isLatestBaseState = true;
395
+ } else {
396
+ // temporal lookup: find the protocol definition active at the given timestamp
397
+ query.messageTimestamp = { lte: messageTimestamp };
398
398
  }
399
399
 
400
400
  const { messages: protocols } = await messageStore.query(
@@ -153,7 +153,7 @@ export class RecordsGrantAuthorization {
153
153
 
154
154
  // If grant specifies a contextId, check that record falls under that contextId
155
155
  if (grantScope.contextId !== undefined) {
156
- if (recordsWriteMessage.contextId === undefined || !recordsWriteMessage.contextId.startsWith(grantScope.contextId)) {
156
+ if (!recordsWriteMessage.contextId?.startsWith(grantScope.contextId)) {
157
157
  throw new DwnError(
158
158
  DwnErrorCode.RecordsGrantAuthorizationScopeContextIdMismatch,
159
159
  `Grant scope specifies different contextId than what appears in the record`
@@ -20,9 +20,9 @@ export class ResumableTaskManager {
20
20
  public static readonly timeoutExtensionFrequencyInSeconds = 30;
21
21
 
22
22
  private resumableTaskBatchSize = 100;
23
- private resumableTaskHandlers: { [key:string]: (taskData: any) => Promise<void> };
23
+ private readonly resumableTaskHandlers: { [key:string]: (taskData: any) => Promise<void> };
24
24
 
25
- public constructor(private resumableTaskStore: ResumableTaskStore, storageController: StorageController) {
25
+ public constructor(private readonly resumableTaskStore: ResumableTaskStore, storageController: StorageController) {
26
26
  // assign resumable task handlers
27
27
  this.resumableTaskHandlers = {
28
28
  // NOTE: The arrow function is IMPORTANT here, else the `this` context will be lost within the invoked method.