@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
package/src/dwn.ts CHANGED
@@ -33,21 +33,33 @@ import { StorageController } from './store/storage-controller.js';
33
33
  import { DidDht, DidJwk, DidKey, DidResolverCacheMemory, DidWeb, UniversalResolver } from '@enbox/dids';
34
34
  import { DwnInterfaceName, DwnMethodName } from './enums/dwn-interface-method.js';
35
35
 
36
+ /**
37
+ * Structural shape for `DidResolver` implementations that expose
38
+ * optional lifecycle hooks (e.g. cache-backed resolvers that need to
39
+ * open/close a store). The base `DidResolver` interface in
40
+ * `@enbox/dids` doesn't declare these methods, so `Dwn.open()` /
41
+ * `Dwn.close()` probe via this narrowly-typed cast (no `any`).
42
+ */
43
+ type LifecycleResolver = {
44
+ open: () => Promise<void>;
45
+ close: () => Promise<void>;
46
+ };
47
+
36
48
  export class Dwn {
37
- private methodHandlers: { [key:string]: MethodHandler };
38
- private didResolver: DidResolver;
39
- private messageStore: MessageStore;
40
- private dataStore: DataStore;
41
- private resumableTaskStore: ResumableTaskStore;
42
- private stateIndex: StateIndex;
43
- private tenantGate: TenantGate;
44
- private eventLog?: EventLog;
45
- private storageController: StorageController;
46
- private resumableTaskManager: ResumableTaskManager;
47
- private _coreProtocols: CoreProtocolRegistry;
49
+ private readonly methodHandlers: { [key:string]: MethodHandler };
50
+ private readonly didResolver: DidResolver;
51
+ private readonly messageStore: MessageStore;
52
+ private readonly dataStore: DataStore;
53
+ private readonly resumableTaskStore: ResumableTaskStore;
54
+ private readonly stateIndex: StateIndex;
55
+ private readonly tenantGate: TenantGate;
56
+ private readonly eventLog?: EventLog;
57
+ private readonly storageController: StorageController;
58
+ private readonly resumableTaskManager: ResumableTaskManager;
59
+ private readonly _coreProtocols: CoreProtocolRegistry;
48
60
 
49
61
  /** Whether the DWN owns the resolver's lifecycle (i.e., created it via defaults). */
50
- private ownsResolver: boolean;
62
+ private readonly ownsResolver: boolean;
51
63
 
52
64
  private constructor(config: DwnConfig) {
53
65
  this.didResolver = config.didResolver!;
@@ -125,8 +137,12 @@ export class Dwn {
125
137
  */
126
138
  public async open(): Promise<void> {
127
139
  // Open the resolver's cache if the DWN owns it (created via defaults).
128
- if (this.ownsResolver && typeof (this.didResolver as any).open === 'function') {
129
- await (this.didResolver as any).open();
140
+ // The base `DidResolver` interface in `@enbox/dids` doesn't declare
141
+ // optional lifecycle hooks; cache-backed implementations expose them
142
+ // structurally. Narrowly-typed probe (no `any`).
143
+ const lifecycleResolver = this.didResolver as Partial<LifecycleResolver>;
144
+ if (this.ownsResolver && typeof lifecycleResolver.open === 'function') {
145
+ await lifecycleResolver.open();
130
146
  }
131
147
 
132
148
  await this.messageStore.open();
@@ -146,8 +162,9 @@ export class Dwn {
146
162
  await this.stateIndex.close();
147
163
 
148
164
  // Close the resolver's cache if the DWN owns it.
149
- if (this.ownsResolver && typeof (this.didResolver as any).close === 'function') {
150
- await (this.didResolver as any).close();
165
+ const lifecycleResolver = this.didResolver as Partial<LifecycleResolver>;
166
+ if (this.ownsResolver && typeof lifecycleResolver.close === 'function') {
167
+ await lifecycleResolver.close();
151
168
  }
152
169
  }
153
170
 
@@ -204,7 +221,7 @@ export class Dwn {
204
221
  const handlerKey = rawMessage.descriptor.interface + rawMessage.descriptor.method;
205
222
  const methodHandlerReply = await this.methodHandlers[handlerKey].handle({
206
223
  tenant,
207
- message: rawMessage as GenericMessage,
224
+ message: rawMessage,
208
225
  dataStream,
209
226
  subscriptionHandler
210
227
  });
@@ -65,21 +65,21 @@ export interface EventEmitterEventLogConfig {
65
65
  * For multi-node deployments, use a distributed implementation (NATS, Redis, etc.).
66
66
  */
67
67
  export class EventEmitterEventLog implements EventLog {
68
- private emitter = mitt<EmitterEvents>();
68
+ private readonly emitter = mitt<EmitterEvents>();
69
69
  private isOpen: boolean = false;
70
- private errorHandler: (error: any) => void = (error): void => { console.error('event log error', error); };
71
- private maxEventsPerTenant: number;
70
+ private readonly errorHandler: (error: any) => void = (error): void => { console.error('event log error', error); };
71
+ private readonly maxEventsPerTenant: number;
72
72
 
73
73
  /**
74
74
  * Per-tenant ordered event storage.
75
75
  * Key: tenant DID → Map of seq → StoredEntry.
76
76
  */
77
- private tenantLogs: Map<string, Map<number, StoredEntry>> = new Map();
77
+ private readonly tenantLogs: Map<string, Map<number, StoredEntry>> = new Map();
78
78
 
79
79
  /**
80
80
  * Per-tenant monotonic sequence counter.
81
81
  */
82
- private tenantSeqs: Map<string, number> = new Map();
82
+ private readonly tenantSeqs: Map<string, number> = new Map();
83
83
 
84
84
  /**
85
85
  * Epoch for this EventLog instance. Generated once at construction as a
@@ -131,9 +131,7 @@ export class EventEmitterEventLog implements EventLog {
131
131
  let reason: ProgressGapReason;
132
132
  if (cursor.streamId !== expectedStreamId) {
133
133
  reason = 'stream_mismatch';
134
- } else if (cursor.epoch !== this.epoch) {
135
- reason = 'epoch_mismatch';
136
- } else {
134
+ } else if (cursor.epoch === this.epoch) {
137
135
  // Check if position is still within replay bounds.
138
136
  const log = this.tenantLogs.get(tenant);
139
137
  if (log !== undefined && log.size > 0) {
@@ -148,6 +146,8 @@ export class EventEmitterEventLog implements EventLog {
148
146
  } else {
149
147
  return; // No events for tenant — cursor is vacuously valid (will get empty catch-up + EOSE).
150
148
  }
149
+ } else {
150
+ reason = 'epoch_mismatch';
151
151
  }
152
152
 
153
153
  // Build gap metadata.
@@ -226,7 +226,7 @@ export class EventEmitterEventLog implements EventLog {
226
226
  await this.validateCursor(tenant, cursor);
227
227
  }
228
228
 
229
- const cursorSeq = cursor !== undefined ? EventEmitterEventLog.parsePosition(cursor.position) : undefined;
229
+ const cursorSeq = cursor === undefined ? undefined : EventEmitterEventLog.parsePosition(cursor.position);
230
230
  const log = this.tenantLogs.get(tenant);
231
231
 
232
232
  if (log === undefined || log.size === 0) {
@@ -319,12 +319,12 @@ export class EventEmitterEventLog implements EventLog {
319
319
  if (filters !== undefined && filters.length > 0) {
320
320
  if (!FilterUtility.matchAnyFilter(payload.indexes, filters)) { return; }
321
321
  }
322
- if (!catchUpComplete) {
323
- pendingLiveEvents.push({ event: payload.event, seq: payload.seq, messageCid: payload.messageCid });
324
- } else {
322
+ if (catchUpComplete) {
325
323
  void tokenFromPayload(payload).then((token) => {
326
324
  listener({ type: 'event', cursor: token, event: payload.event });
327
325
  });
326
+ } else {
327
+ pendingLiveEvents.push({ event: payload.event, seq: payload.seq, messageCid: payload.messageCid });
328
328
  }
329
329
  };
330
330
 
@@ -334,9 +334,9 @@ export class EventEmitterEventLog implements EventLog {
334
334
  const readResult = await this.read(tenant, { cursor, filters });
335
335
  // The read cursor is the token of the last read event, or the input cursor if nothing new.
336
336
  const eoseCursor = readResult.cursor ?? cursor;
337
- const lastCatchUpSeq = readResult.cursor !== undefined
338
- ? EventEmitterEventLog.parsePosition(readResult.cursor.position)
339
- : cursorSeq;
337
+ const lastCatchUpSeq = readResult.cursor === undefined
338
+ ? cursorSeq
339
+ : EventEmitterEventLog.parsePosition(readResult.cursor.position);
340
340
 
341
341
  // Use the messageCid captured by read() during its synchronous iteration.
342
342
  // This eliminates re-lookup races: read() populates entry.messageCid before
@@ -18,7 +18,7 @@ type HandleArgs = { tenant: string, message: MessagesReadMessage };
18
18
 
19
19
  export class MessagesReadHandler implements MethodHandler {
20
20
 
21
- constructor(private deps: HandlerDependencies) {}
21
+ constructor(private readonly deps: HandlerDependencies) {}
22
22
 
23
23
  public async handle({ tenant, message }: HandleArgs): Promise<MessagesReadReply> {
24
24
  let messagesRead: MessagesRead;
@@ -52,16 +52,16 @@ export class MessagesReadHandler implements MethodHandler {
52
52
  const recordsWrite = entry.message as RecordsQueryReplyEntry;
53
53
  // RecordsWrite specific handling, if MessageStore has embedded `encodedData` return it with the entry.
54
54
  // we store `encodedData` along with the message if the data is below a certain threshold.
55
- if (recordsWrite.encodedData !== undefined) {
56
- const dataBytes = Encoder.base64UrlToBytes(recordsWrite.encodedData);
57
- entry.data = DataStream.fromBytes(dataBytes);
58
- delete recordsWrite.encodedData;
59
- } else {
60
- // otherwise check the data store for the associated data
55
+ if (recordsWrite.encodedData === undefined) {
56
+ // check the data store for the associated data
61
57
  const result = await this.deps.dataStore!.get(tenant, recordsWrite.recordId, recordsWrite.descriptor.dataCid);
62
58
  if (result?.dataStream !== undefined) {
63
59
  entry.data = result.dataStream;
64
60
  }
61
+ } else {
62
+ const dataBytes = Encoder.base64UrlToBytes(recordsWrite.encodedData);
63
+ entry.data = DataStream.fromBytes(dataBytes);
64
+ delete recordsWrite.encodedData;
65
65
  }
66
66
  }
67
67
 
@@ -14,7 +14,7 @@ import { DwnError, DwnErrorCode } from '../core/dwn-error.js';
14
14
 
15
15
  export class MessagesSubscribeHandler implements MethodHandler {
16
16
 
17
- constructor(private deps: HandlerDependencies) {}
17
+ constructor(private readonly deps: HandlerDependencies) {}
18
18
 
19
19
  public async handle({
20
20
  tenant,
@@ -65,7 +65,7 @@ export class MessagesSubscribeHandler implements MethodHandler {
65
65
  const gapInfo = (error as any).gapInfo as ProgressGapInfo | undefined;
66
66
  return {
67
67
  status : { code: 410, detail: 'Progress token gap' },
68
- error : gapInfo !== undefined ? { code: 'ProgressGap' as const, ...gapInfo } : undefined,
68
+ error : gapInfo === undefined ? undefined : { code: 'ProgressGap' as const, ...gapInfo },
69
69
  };
70
70
  }
71
71
  return messageReplyFromError(error, 500);
@@ -25,7 +25,7 @@ const DEFAULT_MAX_INLINE_DATA_SIZE = DwnConstant.maxDataSizeAllowedToBeEncoded;
25
25
 
26
26
  export class MessagesSyncHandler implements MethodHandler {
27
27
 
28
- constructor(private deps: HandlerDependencies) { }
28
+ constructor(private readonly deps: HandlerDependencies) { }
29
29
 
30
30
  public async handle({
31
31
  tenant,
@@ -51,9 +51,9 @@ export class MessagesSyncHandler implements MethodHandler {
51
51
  try {
52
52
  switch (action) {
53
53
  case 'root': {
54
- const rootHash = protocol !== undefined
55
- ? await this.deps.stateIndex!.getProtocolRoot(tenant, protocol)
56
- : await this.deps.stateIndex!.getRoot(tenant);
54
+ const rootHash = protocol === undefined
55
+ ? await this.deps.stateIndex!.getRoot(tenant)
56
+ : await this.deps.stateIndex!.getProtocolRoot(tenant, protocol);
57
57
  return {
58
58
  status : { code: 200, detail: 'OK' },
59
59
  root : hashToHex(rootHash),
@@ -62,9 +62,9 @@ export class MessagesSyncHandler implements MethodHandler {
62
62
 
63
63
  case 'subtree': {
64
64
  const bitPath = MessagesSyncHandler.parseBitPrefix(prefix!);
65
- const hash = protocol !== undefined
66
- ? await this.deps.stateIndex!.getProtocolSubtreeHash(tenant, protocol, bitPath)
67
- : await this.deps.stateIndex!.getSubtreeHash(tenant, bitPath);
65
+ const hash = protocol === undefined
66
+ ? await this.deps.stateIndex!.getSubtreeHash(tenant, bitPath)
67
+ : await this.deps.stateIndex!.getProtocolSubtreeHash(tenant, protocol, bitPath);
68
68
  return {
69
69
  status : { code: 200, detail: 'OK' },
70
70
  hash : hashToHex(hash),
@@ -73,9 +73,9 @@ export class MessagesSyncHandler implements MethodHandler {
73
73
 
74
74
  case 'leaves': {
75
75
  const bitPath = MessagesSyncHandler.parseBitPrefix(prefix!);
76
- const leaves = protocol !== undefined
77
- ? await this.deps.stateIndex!.getProtocolLeaves(tenant, protocol, bitPath)
78
- : await this.deps.stateIndex!.getLeaves(tenant, bitPath);
76
+ const leaves = protocol === undefined
77
+ ? await this.deps.stateIndex!.getLeaves(tenant, bitPath)
78
+ : await this.deps.stateIndex!.getProtocolLeaves(tenant, protocol, bitPath);
79
79
  return {
80
80
  status : { code: 200, detail: 'OK' },
81
81
  entries : leaves,
@@ -165,18 +165,18 @@ export class MessagesSyncHandler implements MethodHandler {
165
165
  if (clientHash === undefined) {
166
166
  // Server has entries the client doesn't — enumerate server leaves.
167
167
  const bitPath = MessagesSyncHandler.parseBitPrefix(pfx);
168
- const leaves = protocol !== undefined
169
- ? await stateIndex.getProtocolLeaves(tenant, protocol, bitPath)
170
- : await stateIndex.getLeaves(tenant, bitPath);
168
+ const leaves = protocol === undefined
169
+ ? await stateIndex.getLeaves(tenant, bitPath)
170
+ : await stateIndex.getProtocolLeaves(tenant, protocol, bitPath);
171
171
  onlyRemoteCids.push(...leaves);
172
172
  continue;
173
173
  }
174
174
 
175
175
  // Both sides have entries but they differ — enumerate both and set-diff.
176
176
  const bitPath = MessagesSyncHandler.parseBitPrefix(pfx);
177
- const serverLeaves = protocol !== undefined
178
- ? await stateIndex.getProtocolLeaves(tenant, protocol, bitPath)
179
- : await stateIndex.getLeaves(tenant, bitPath);
177
+ const serverLeaves = protocol === undefined
178
+ ? await stateIndex.getLeaves(tenant, bitPath)
179
+ : await stateIndex.getProtocolLeaves(tenant, protocol, bitPath);
180
180
 
181
181
  // We don't have the client's leaves, so we report all server leaves
182
182
  // as onlyRemote (the client will de-duplicate locally). We also
@@ -210,9 +210,9 @@ export class MessagesSyncHandler implements MethodHandler {
210
210
 
211
211
  const walk = async (prefix: string, currentDepth: number): Promise<void> => {
212
212
  const bitPath = MessagesSyncHandler.parseBitPrefix(prefix);
213
- const hash = protocol !== undefined
214
- ? await stateIndex.getProtocolSubtreeHash(tenant, protocol, bitPath)
215
- : await stateIndex.getSubtreeHash(tenant, bitPath);
213
+ const hash = protocol === undefined
214
+ ? await stateIndex.getSubtreeHash(tenant, bitPath)
215
+ : await stateIndex.getProtocolSubtreeHash(tenant, protocol, bitPath);
216
216
  const hexHash = hashToHex(hash);
217
217
 
218
218
  if (hexHash === defaultHashHex) {
@@ -15,7 +15,7 @@ import { getRuleSetAtPath, parseCrossProtocolRef } from '../utils/protocols.js';
15
15
 
16
16
  export class ProtocolsConfigureHandler implements MethodHandler {
17
17
 
18
- constructor(private deps: HandlerDependencies) { }
18
+ constructor(private readonly deps: HandlerDependencies) { }
19
19
 
20
20
  public async handle({
21
21
  tenant,
@@ -298,7 +298,7 @@ export class ProtocolsConfigureHandler implements MethodHandler {
298
298
 
299
299
  // Check that the role path exists and is marked $role: true in the referenced protocol
300
300
  const roleRuleSet = getRuleSetAtPath(parsed.protocolPath, refDefinition.structure);
301
- if (roleRuleSet === undefined || !roleRuleSet.$role) {
301
+ if (!roleRuleSet?.$role) {
302
302
  throw new DwnError(
303
303
  DwnErrorCode.ProtocolsConfigureInvalidCrossProtocolRole,
304
304
  `cross-protocol role '${actionRule.role}' at protocol path '${childProtocolPath}' ` +
@@ -5,13 +5,13 @@ import { authenticate } from '../core/auth.js';
5
5
  import { DwnErrorCode } from '../core/dwn-error.js';
6
6
  import { messageReplyFromError } from '../core/message-reply.js';
7
7
  import { ProtocolsQuery } from '../interfaces/protocols-query.js';
8
- import { removeUndefinedProperties } from '../utils/object.js';
8
+ import { removeUndefinedProperties } from '@enbox/common';
9
9
 
10
10
  import { DwnInterfaceName, DwnMethodName } from '../enums/dwn-interface-method.js';
11
11
 
12
12
  export class ProtocolsQueryHandler implements MethodHandler {
13
13
 
14
- constructor(private deps: HandlerDependencies) { }
14
+ constructor(private readonly deps: HandlerDependencies) { }
15
15
 
16
16
  public async handle({
17
17
  tenant,
@@ -14,7 +14,7 @@ import { DwnInterfaceName, DwnMethodName } from '../enums/dwn-interface-method.j
14
14
 
15
15
  export class RecordsCountHandler implements MethodHandler {
16
16
 
17
- constructor(private deps: HandlerDependencies) { }
17
+ constructor(private readonly deps: HandlerDependencies) { }
18
18
 
19
19
  public async handle({
20
20
  tenant,
@@ -18,7 +18,7 @@ import { ResumableTaskName } from '../core/resumable-task-manager.js';
18
18
 
19
19
  export class RecordsDeleteHandler implements MethodHandler {
20
20
 
21
- constructor(private deps: HandlerDependencies) { }
21
+ constructor(private readonly deps: HandlerDependencies) { }
22
22
 
23
23
  public async handle({
24
24
  tenant,
@@ -18,7 +18,7 @@ import { DwnInterfaceName, DwnMethodName } from '../enums/dwn-interface-method.j
18
18
 
19
19
  export class RecordsQueryHandler implements MethodHandler {
20
20
 
21
- constructor(private deps: HandlerDependencies) { }
21
+ constructor(private readonly deps: HandlerDependencies) { }
22
22
 
23
23
  public async handle({
24
24
  tenant,
@@ -20,7 +20,7 @@ import { DwnInterfaceName, DwnMethodName } from '../enums/dwn-interface-method.j
20
20
 
21
21
  export class RecordsReadHandler implements MethodHandler {
22
22
 
23
- constructor(private deps: HandlerDependencies) { }
23
+ constructor(private readonly deps: HandlerDependencies) { }
24
24
 
25
25
  public async handle({
26
26
  tenant,
@@ -115,11 +115,7 @@ export class RecordsReadHandler implements MethodHandler {
115
115
  }
116
116
 
117
117
  let data;
118
- if (matchedRecordsWrite.encodedData !== undefined) {
119
- const dataBytes = Encoder.base64UrlToBytes(matchedRecordsWrite.encodedData);
120
- data = DataStream.fromBytes(dataBytes);
121
- delete matchedRecordsWrite.encodedData;
122
- } else {
118
+ if (matchedRecordsWrite.encodedData === undefined) {
123
119
  const result = await this.deps.dataStore!.get(tenant, matchedRecordsWrite.recordId, matchedRecordsWrite.descriptor.dataCid);
124
120
  if (result?.dataStream === undefined) {
125
121
  // The message envelope exists but the record data is unavailable (e.g., evicted
@@ -131,6 +127,10 @@ export class RecordsReadHandler implements MethodHandler {
131
127
  };
132
128
  }
133
129
  data = result.dataStream;
130
+ } else {
131
+ const dataBytes = Encoder.base64UrlToBytes(matchedRecordsWrite.encodedData);
132
+ data = DataStream.fromBytes(dataBytes);
133
+ delete matchedRecordsWrite.encodedData;
134
134
  }
135
135
 
136
136
  const recordsReadReply: RecordsReadReply = {
@@ -20,7 +20,7 @@ import { DwnInterfaceName, DwnMethodName } from '../enums/dwn-interface-method.j
20
20
 
21
21
  export class RecordsSubscribeHandler implements MethodHandler {
22
22
 
23
- constructor(private deps: HandlerDependencies) { }
23
+ constructor(private readonly deps: HandlerDependencies) { }
24
24
 
25
25
  public async handle({
26
26
  tenant,
@@ -97,7 +97,7 @@ export class RecordsSubscribeHandler implements MethodHandler {
97
97
  const gapInfo = (error as any).gapInfo as ProgressGapInfo | undefined;
98
98
  return {
99
99
  status : { code: 410, detail: 'Progress token gap' },
100
- error : gapInfo !== undefined ? { code: 'ProgressGap' as const, ...gapInfo } : undefined,
100
+ error : gapInfo === undefined ? undefined : { code: 'ProgressGap' as const, ...gapInfo },
101
101
  };
102
102
  }
103
103
  return messageReplyFromError(error, 500);
@@ -27,7 +27,7 @@ type HandlerArgs = { tenant: string, message: RecordsWriteMessage, dataStream?:
27
27
 
28
28
  export class RecordsWriteHandler implements MethodHandler {
29
29
 
30
- constructor(private deps: HandlerDependencies) { }
30
+ constructor(private readonly deps: HandlerDependencies) { }
31
31
 
32
32
  public async handle({
33
33
  tenant,
@@ -106,7 +106,7 @@ export class RecordsWriteHandler implements MethodHandler {
106
106
  if (isInitial) {
107
107
  const hasInlineData = !!(newestExistingMessage as any).encodedData;
108
108
  const hasStoredData = this.deps.dataStore
109
- ? !!(await this.deps.dataStore.get(tenant, recordsWrite.message.recordId, message.descriptor.dataCid!))
109
+ ? !!(await this.deps.dataStore.get(tenant, recordsWrite.message.recordId, message.descriptor.dataCid))
110
110
  : false;
111
111
  existingLacksData = !hasInlineData && !hasStoredData;
112
112
  }
@@ -121,9 +121,9 @@ export class RecordsWriteHandler implements MethodHandler {
121
121
 
122
122
  // Look up the core protocol (if any) for the incoming message so that lifecycle hooks
123
123
  // can be dispatched generically rather than checking for specific protocol URIs.
124
- const coreProtocol = message.descriptor.protocol !== undefined
125
- ? this.deps.coreProtocols?.get(message.descriptor.protocol)
126
- : undefined;
124
+ const coreProtocol = message.descriptor.protocol === undefined
125
+ ? undefined
126
+ : this.deps.coreProtocols?.get(message.descriptor.protocol);
127
127
 
128
128
  try {
129
129
  if (newestExistingMessage?.descriptor.method === DwnMethodName.Delete) {
@@ -148,11 +148,8 @@ export class RecordsWriteHandler implements MethodHandler {
148
148
  let isLatestBaseState = false;
149
149
  let messageWithOptionalEncodedData = message as RecordsQueryReplyEntry;
150
150
 
151
- if (dataStream !== undefined) {
152
- messageWithOptionalEncodedData = await this.processMessageWithDataStream(tenant, message, dataStream);
153
- isLatestBaseState = true;
154
- } else {
155
- // else data stream is NOT provided
151
+ if (dataStream === undefined) {
152
+ // data stream is NOT provided
156
153
 
157
154
  // if the incoming message is not an initial write, and no dataStream is provided, we would allow it provided it passes validation
158
155
  // processMessageWithoutDataStream() abstracts that logic
@@ -161,6 +158,9 @@ export class RecordsWriteHandler implements MethodHandler {
161
158
  messageWithOptionalEncodedData = await this.processMessageWithoutDataStream(tenant, message, newestExistingWrite );
162
159
  isLatestBaseState = true;
163
160
  }
161
+ } else {
162
+ messageWithOptionalEncodedData = await this.processMessageWithDataStream(tenant, message, dataStream);
163
+ isLatestBaseState = true;
164
164
  }
165
165
 
166
166
  const indexes = await recordsWrite.constructIndexes(isLatestBaseState);
@@ -252,14 +252,14 @@ export class RecordsWriteHandler implements MethodHandler {
252
252
  // if data is below the threshold, we store it within MessageStore
253
253
  if (message.descriptor.dataSize <= DwnConstant.maxDataSizeAllowedToBeEncoded) {
254
254
  // validate data integrity before setting.
255
- const dataBytes = await DataStream.toBytes(dataStream!);
255
+ const dataBytes = await DataStream.toBytes(dataStream);
256
256
  const dataCid = await Cid.computeDagPbCidFromBytes(dataBytes);
257
257
  RecordsWriteHandler.validateDataIntegrity(message.descriptor.dataCid, message.descriptor.dataSize, dataCid, dataBytes.length);
258
258
 
259
259
  // Dispatch schema validation to the core protocol, if applicable.
260
- const coreProtocol = message.descriptor.protocol !== undefined
261
- ? this.deps.coreProtocols?.get(message.descriptor.protocol)
262
- : undefined;
260
+ const coreProtocol = message.descriptor.protocol === undefined
261
+ ? undefined
262
+ : this.deps.coreProtocols?.get(message.descriptor.protocol);
263
263
  if (coreProtocol?.validateRecord !== undefined) {
264
264
  coreProtocol.validateRecord(message, dataBytes);
265
265
  }
@@ -304,13 +304,13 @@ export class RecordsWriteHandler implements MethodHandler {
304
304
 
305
305
  if (dataSize <= DwnConstant.maxDataSizeAllowedToBeEncoded) {
306
306
  // we encode the data from the original write if it is smaller than the data-store threshold
307
- if (newestExistingWrite.encodedData !== undefined) {
308
- messageWithOptionalEncodedData.encodedData = newestExistingWrite.encodedData;
309
- } else {
307
+ if (newestExistingWrite.encodedData === undefined) {
310
308
  throw new DwnError(
311
309
  DwnErrorCode.RecordsWriteMissingEncodedDataInPrevious,
312
310
  `No dataStream was provided and unable to get data from previous message`
313
311
  );
312
+ } else {
313
+ messageWithOptionalEncodedData.encodedData = newestExistingWrite.encodedData;
314
314
  }
315
315
  } else {
316
316
  // else just make sure the data is in the data store
@@ -396,7 +396,7 @@ export class RecordsWriteHandler implements MethodHandler {
396
396
  ruleSet = ruleSet[pathSegments[i]] as typeof ruleSet;
397
397
  }
398
398
 
399
- if (ruleSet === undefined || ruleSet.$squash !== true) {
399
+ if (ruleSet?.$squash !== true) {
400
400
  return;
401
401
  }
402
402
 
package/src/index.ts CHANGED
@@ -2,7 +2,7 @@
2
2
  export type { DwnConfig } from './dwn.js';
3
3
  export type { EventListener, EventLog, EventLogEntry, EventLogReadOptions, EventLogReadResult, EventLogSubscribeOptions, EventSubscription, MessageEvent, ProgressGapInfo, ProgressGapReason, ProgressToken, SubscriptionEose, SubscriptionEvent, SubscriptionListener, SubscriptionMessage, SubscriptionReply } from './types/subscriptions.js';
4
4
  export type { AuthorizationModel, Descriptor, DelegatedGrantRecordsWriteMessage, GenericMessage, GenericMessageReply, GenericSignaturePayload, MessageSort, MessageSubscription, Pagination, QueryResultEntry, Status } from './types/message-types.js';
5
- export type { MessagesFilter, MessagesReadMessage as MessagesReadMessage, MessagesReadReply as MessagesReadReply, MessagesReadReplyEntry as MessagesReadReplyEntry, MessagesReadDescriptor, MessagesSubscribeDescriptor, MessagesSubscribeMessage, MessagesSubscribeReply, MessagesSubscribeMessageOptions, MessagesSyncAction, MessagesSyncDescriptor, MessagesSyncDiffEntry, MessagesSyncMessage, MessagesSyncReply } from './types/messages-types.js';
5
+ export type { MessagesFilter, MessagesReadMessage, MessagesReadReply, MessagesReadReplyEntry, MessagesReadDescriptor, MessagesSubscribeDescriptor, MessagesSubscribeMessage, MessagesSubscribeReply, MessagesSubscribeMessageOptions, MessagesSyncAction, MessagesSyncDescriptor, MessagesSyncDiffEntry, MessagesSyncMessage, MessagesSyncReply } from './types/messages-types.js';
6
6
  export type { GT, LT, Filter, FilterValue, KeyValues, EqualFilter, OneOfFilter, RangeFilter, RangeCriterion, PaginationCursor, QueryOptions, RangeValue, StartsWithFilter } from './types/query-types.js';
7
7
  export type { ProtocolsConfigureDescriptor, ProtocolDefinition, ProtocolTypes, ProtocolRuleSet, ProtocolsQueryFilter, ProtocolsConfigureMessage, ProtocolsQueryMessage, ProtocolsQueryReply, ProtocolActionRule, ProtocolDeliveryStrategy, ProtocolPathEncryption, ProtocolsQueryDescriptor, ProtocolRecordLimitDefinition, ProtocolSizeDefinition, ProtocolTagsDefinition, ProtocolTagSchema, ProtocolType, ProtocolUses } from './types/protocols-types.js';
8
8
  export { ProtocolRecordLimitStrategy } from './types/protocols-types.js';
@@ -30,8 +30,8 @@ export { DwnConstant } from './core/dwn-constant.js';
30
30
  export { DwnError, DwnErrorCode } from './core/dwn-error.js';
31
31
  export { DwnInterfaceName, DwnMethodName } from './enums/dwn-interface-method.js';
32
32
  export { Encoder } from './utils/encoder.js';
33
- export { MessagesSubscribe as MessagesSubscribe } from './interfaces/messages-subscribe.js';
34
- export type { MessagesSubscribeOptions as MessagesSubscribeOptions } from './interfaces/messages-subscribe.js';
33
+ export { MessagesSubscribe } from './interfaces/messages-subscribe.js';
34
+ export type { MessagesSubscribeOptions } from './interfaces/messages-subscribe.js';
35
35
  export { Encryption, ContentEncryptionAlgorithm, KeyAgreementAlgorithm } from './utils/encryption.js';
36
36
  export type { JweEncryption, JweRecipient, JweRecipientHeader, JweProtectedHeader, JweKeyUnwrapPayload } from './utils/encryption.js';
37
37
  export { RecordsWrite } from './interfaces/records-write.js';
@@ -40,8 +40,8 @@ export { executeUnlessAborted } from './utils/abort.js';
40
40
  export { Jws } from './utils/jws.js';
41
41
  export type { KeyMaterial, PrivateKeyJwk, PublicKeyJwk, Jwk } from './types/jose-types.js';
42
42
  export { Message } from './core/message.js';
43
- export { MessagesRead as MessagesRead } from './interfaces/messages-read.js';
44
- export type { MessagesReadOptions as MessagesReadOptions } from './interfaces/messages-read.js';
43
+ export { MessagesRead } from './interfaces/messages-read.js';
44
+ export type { MessagesReadOptions } from './interfaces/messages-read.js';
45
45
  export { MessagesSync } from './interfaces/messages-sync.js';
46
46
  export type { MessagesSyncOptions } from './interfaces/messages-sync.js';
47
47
  export type { UnionMessageReply } from './core/message-reply.js';
@@ -5,7 +5,7 @@ import type { MessagesSubscribeDescriptor, MessagesSubscribeMessage } from '../t
5
5
 
6
6
  import { AbstractMessage } from '../core/abstract-message.js';
7
7
  import { Message } from '../core/message.js';
8
- import { removeUndefinedProperties } from '../utils/object.js';
8
+ import { removeUndefinedProperties } from '@enbox/common';
9
9
  import { Time } from '../utils/time.js';
10
10
  import { validateProtocolUrlNormalized } from '../utils/url.js';
11
11
  import { DwnInterfaceName, DwnMethodName } from '../enums/dwn-interface-method.js';
@@ -3,7 +3,7 @@ import type { MessagesSyncAction, MessagesSyncDescriptor, MessagesSyncMessage }
3
3
 
4
4
  import { AbstractMessage } from '../core/abstract-message.js';
5
5
  import { Message } from '../core/message.js';
6
- import { removeUndefinedProperties } from '../utils/object.js';
6
+ import { removeUndefinedProperties } from '@enbox/common';
7
7
  import { Time } from '../utils/time.js';
8
8
  import { validateProtocolUrlNormalized } from '../utils/url.js';
9
9
  import { DwnInterfaceName, DwnMethodName } from '../enums/dwn-interface-method.js';
@@ -377,16 +377,8 @@ export class ProtocolsConfigure extends AbstractMessage<ProtocolsConfigureMessag
377
377
  for (let j = i + 1; j < actionRules.length; j++) {
378
378
  const otherActionRule = actionRules[j];
379
379
 
380
- if (actionRule.who !== undefined) {
381
- if (actionRule.who === otherActionRule.who && actionRule.of === otherActionRule.of) {
382
- throw new DwnError(
383
- DwnErrorCode.ProtocolsConfigureDuplicateActorInRuleSet,
384
- `More than one action rule per actor ${actionRule.who} of ${actionRule.of} ` +
385
- `not allowed within a rule set: ${JSON.stringify(actionRule)}`
386
- );
387
- }
388
- } else {
389
- // else implicitly a role-based action rule
380
+ if (actionRule.who === undefined) {
381
+ // implicitly a role-based action rule
390
382
 
391
383
  if (actionRule.role === otherActionRule.role) {
392
384
  throw new DwnError(
@@ -394,6 +386,14 @@ export class ProtocolsConfigure extends AbstractMessage<ProtocolsConfigureMessag
394
386
  `More than one action rule per role ${actionRule.role} not allowed within a rule set: ${JSON.stringify(actionRule)}`
395
387
  );
396
388
  }
389
+ } else {
390
+ if (actionRule.who === otherActionRule.who && actionRule.of === otherActionRule.of) {
391
+ throw new DwnError(
392
+ DwnErrorCode.ProtocolsConfigureDuplicateActorInRuleSet,
393
+ `More than one action rule per actor ${actionRule.who} of ${actionRule.of} ` +
394
+ `not allowed within a rule set: ${JSON.stringify(actionRule)}`
395
+ );
396
+ }
397
397
  }
398
398
  }
399
399
  }
@@ -497,7 +497,7 @@ export class ProtocolsConfigure extends AbstractMessage<ProtocolsConfigureMessag
497
497
  }
498
498
 
499
499
  // validate alias exists in `uses`
500
- if (uses === undefined || uses[parsed.alias] === undefined) {
500
+ if (uses?.[parsed.alias] === undefined) {
501
501
  throw new DwnError(
502
502
  DwnErrorCode.ProtocolsConfigureInvalidRefAlias,
503
503
  `'$ref' alias '${parsed.alias}' at protocol path '${ruleSetProtocolPath}' does not exist in the 'uses' map.`
@@ -543,7 +543,7 @@ export class ProtocolsConfigure extends AbstractMessage<ProtocolsConfigureMessag
543
543
  );
544
544
  }
545
545
 
546
- if (uses === undefined || uses[parsed.alias] === undefined) {
546
+ if (uses?.[parsed.alias] === undefined) {
547
547
  const errorCode = fieldName === 'role'
548
548
  ? DwnErrorCode.ProtocolsConfigureInvalidCrossProtocolRole
549
549
  : DwnErrorCode.ProtocolsConfigureInvalidCrossProtocolOf;
@@ -7,7 +7,7 @@ import { AbstractMessage } from '../core/abstract-message.js';
7
7
  import { Message } from '../core/message.js';
8
8
  import { PermissionsProtocol } from '../protocols/permissions.js';
9
9
  import { ProtocolsGrantAuthorization } from '../core/protocols-grant-authorization.js';
10
- import { removeUndefinedProperties } from '../utils/object.js';
10
+ import { removeUndefinedProperties } from '@enbox/common';
11
11
  import { Time } from '../utils/time.js';
12
12
  import { DwnError, DwnErrorCode } from '../core/dwn-error.js';
13
13
  import { DwnInterfaceName, DwnMethodName } from '../enums/dwn-interface-method.js';
@@ -7,7 +7,7 @@ import { Message } from '../core/message.js';
7
7
  import { PermissionGrant } from '../protocols/permission-grant.js';
8
8
  import { Records } from '../utils/records.js';
9
9
  import { RecordsGrantAuthorization } from '../core/records-grant-authorization.js';
10
- import { removeUndefinedProperties } from '../utils/object.js';
10
+ import { removeUndefinedProperties } from '@enbox/common';
11
11
  import { Time } from '../utils/time.js';
12
12
  import { DwnError, DwnErrorCode } from '../core/dwn-error.js';
13
13
  import { DwnInterfaceName, DwnMethodName } from '../enums/dwn-interface-method.js';