@dxos/echo-pipeline 0.8.3 → 0.8.4-main.05e74ebcff

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 (244) hide show
  1. package/LICENSE +102 -5
  2. package/README.md +1 -1
  3. package/dist/lib/neutral/chunk-46DCRDA7.mjs +271 -0
  4. package/dist/lib/neutral/chunk-46DCRDA7.mjs.map +7 -0
  5. package/dist/lib/{browser/chunk-35I6ERLG.mjs → neutral/chunk-LR7UFVQX.mjs} +313 -709
  6. package/dist/lib/neutral/chunk-LR7UFVQX.mjs.map +7 -0
  7. package/dist/lib/{browser → neutral}/filter/index.mjs +3 -2
  8. package/dist/lib/neutral/index.mjs +7332 -0
  9. package/dist/lib/neutral/index.mjs.map +7 -0
  10. package/dist/lib/neutral/meta.json +1 -0
  11. package/dist/lib/{browser → neutral}/testing/index.mjs +90 -311
  12. package/dist/lib/neutral/testing/index.mjs.map +7 -0
  13. package/dist/types/src/automerge/automerge-host-subduction.test.d.ts +2 -0
  14. package/dist/types/src/automerge/automerge-host-subduction.test.d.ts.map +1 -0
  15. package/dist/types/src/automerge/automerge-host.d.ts +119 -54
  16. package/dist/types/src/automerge/automerge-host.d.ts.map +1 -1
  17. package/dist/types/src/automerge/automerge-repo-subduction.test.d.ts +2 -0
  18. package/dist/types/src/automerge/automerge-repo-subduction.test.d.ts.map +1 -0
  19. package/dist/types/src/automerge/automerge-repo.test.d.ts +1 -1
  20. package/dist/types/src/automerge/automerge-repo.test.d.ts.map +1 -1
  21. package/dist/types/src/automerge/automerge-subduction.test.d.ts +2 -0
  22. package/dist/types/src/automerge/automerge-subduction.test.d.ts.map +1 -0
  23. package/dist/types/src/automerge/collection-synchronizer.d.ts +25 -4
  24. package/dist/types/src/automerge/collection-synchronizer.d.ts.map +1 -1
  25. package/dist/types/src/automerge/echo-data-monitor.d.ts.map +1 -1
  26. package/dist/types/src/automerge/echo-network-adapter.d.ts +23 -10
  27. package/dist/types/src/automerge/echo-network-adapter.d.ts.map +1 -1
  28. package/dist/types/src/automerge/echo-replicator.d.ts +46 -15
  29. package/dist/types/src/automerge/echo-replicator.d.ts.map +1 -1
  30. package/dist/types/src/automerge/errors.d.ts +35 -0
  31. package/dist/types/src/automerge/errors.d.ts.map +1 -0
  32. package/dist/types/src/automerge/handle-state.d.ts +52 -0
  33. package/dist/types/src/automerge/handle-state.d.ts.map +1 -0
  34. package/dist/types/src/automerge/heads-store.d.ts +9 -2
  35. package/dist/types/src/automerge/heads-store.d.ts.map +1 -1
  36. package/dist/types/src/automerge/index.d.ts +3 -1
  37. package/dist/types/src/automerge/index.d.ts.map +1 -1
  38. package/dist/types/src/automerge/leveldb-storage-adapter.d.ts +11 -5
  39. package/dist/types/src/automerge/leveldb-storage-adapter.d.ts.map +1 -1
  40. package/dist/types/src/automerge/mesh-echo-replicator-connection.d.ts +9 -8
  41. package/dist/types/src/automerge/mesh-echo-replicator-connection.d.ts.map +1 -1
  42. package/dist/types/src/automerge/mesh-echo-replicator.d.ts +6 -5
  43. package/dist/types/src/automerge/mesh-echo-replicator.d.ts.map +1 -1
  44. package/dist/types/src/automerge/network-protocol.d.ts.map +1 -1
  45. package/dist/types/src/automerge/space-collection.d.ts.map +1 -1
  46. package/dist/types/src/common/codec.d.ts +1 -1
  47. package/dist/types/src/common/codec.d.ts.map +1 -1
  48. package/dist/types/src/common/feeds.d.ts.map +1 -1
  49. package/dist/types/src/common/space-id.d.ts.map +1 -1
  50. package/dist/types/src/db-host/automerge-data-source.d.ts +35 -0
  51. package/dist/types/src/db-host/automerge-data-source.d.ts.map +1 -0
  52. package/dist/types/src/db-host/automerge-data-source.test.d.ts +2 -0
  53. package/dist/types/src/db-host/automerge-data-source.test.d.ts.map +1 -0
  54. package/dist/types/src/db-host/automerge-metrics.d.ts.map +1 -1
  55. package/dist/types/src/db-host/data-service.d.ts +13 -7
  56. package/dist/types/src/db-host/data-service.d.ts.map +1 -1
  57. package/dist/types/src/db-host/database-root.d.ts +9 -3
  58. package/dist/types/src/db-host/database-root.d.ts.map +1 -1
  59. package/dist/types/src/db-host/documents-synchronizer.d.ts +30 -8
  60. package/dist/types/src/db-host/documents-synchronizer.d.ts.map +1 -1
  61. package/dist/types/src/db-host/echo-host.d.ts +74 -28
  62. package/dist/types/src/db-host/echo-host.d.ts.map +1 -1
  63. package/dist/types/src/db-host/index.d.ts +2 -0
  64. package/dist/types/src/db-host/index.d.ts.map +1 -1
  65. package/dist/types/src/db-host/invalidation-hint.d.ts +19 -0
  66. package/dist/types/src/db-host/invalidation-hint.d.ts.map +1 -0
  67. package/dist/types/src/db-host/local-queue-service.d.ts +19 -0
  68. package/dist/types/src/db-host/local-queue-service.d.ts.map +1 -0
  69. package/dist/types/src/db-host/query-invalidation.test.d.ts +2 -0
  70. package/dist/types/src/db-host/query-invalidation.test.d.ts.map +1 -0
  71. package/dist/types/src/db-host/query-service.d.ts +19 -11
  72. package/dist/types/src/db-host/query-service.d.ts.map +1 -1
  73. package/dist/types/src/db-host/queue-data-source.d.ts +38 -0
  74. package/dist/types/src/db-host/queue-data-source.d.ts.map +1 -0
  75. package/dist/types/src/db-host/queue-service.test.d.ts +2 -0
  76. package/dist/types/src/db-host/queue-service.test.d.ts.map +1 -0
  77. package/dist/types/src/db-host/space-state-manager.d.ts +4 -3
  78. package/dist/types/src/db-host/space-state-manager.d.ts.map +1 -1
  79. package/dist/types/src/db-host/stub.d.ts +11 -0
  80. package/dist/types/src/db-host/stub.d.ts.map +1 -0
  81. package/dist/types/src/edge/echo-edge-replicator.d.ts +10 -7
  82. package/dist/types/src/edge/echo-edge-replicator.d.ts.map +1 -1
  83. package/dist/types/src/edge/echo-edge-subduction-replicator.d.ts +39 -0
  84. package/dist/types/src/edge/echo-edge-subduction-replicator.d.ts.map +1 -0
  85. package/dist/types/src/edge/echo-edge-subduction-replicator.test.d.ts +2 -0
  86. package/dist/types/src/edge/echo-edge-subduction-replicator.test.d.ts.map +1 -0
  87. package/dist/types/src/edge/index.d.ts +1 -0
  88. package/dist/types/src/edge/index.d.ts.map +1 -1
  89. package/dist/types/src/edge/inflight-request-limiter.d.ts.map +1 -1
  90. package/dist/types/src/filter/filter-match.d.ts +4 -1
  91. package/dist/types/src/filter/filter-match.d.ts.map +1 -1
  92. package/dist/types/src/metadata/metadata-store.d.ts +1 -1
  93. package/dist/types/src/metadata/metadata-store.d.ts.map +1 -1
  94. package/dist/types/src/pipeline/message-selector.d.ts.map +1 -1
  95. package/dist/types/src/pipeline/pipeline.d.ts +3 -3
  96. package/dist/types/src/pipeline/pipeline.d.ts.map +1 -1
  97. package/dist/types/src/pipeline/timeframe-clock.d.ts.map +1 -1
  98. package/dist/types/src/query/errors.d.ts +22 -10
  99. package/dist/types/src/query/errors.d.ts.map +1 -1
  100. package/dist/types/src/query/plan.d.ts +66 -8
  101. package/dist/types/src/query/plan.d.ts.map +1 -1
  102. package/dist/types/src/query/query-executor.d.ts +66 -11
  103. package/dist/types/src/query/query-executor.d.ts.map +1 -1
  104. package/dist/types/src/query/query-planner.d.ts +12 -1
  105. package/dist/types/src/query/query-planner.d.ts.map +1 -1
  106. package/dist/types/src/space/admission-discovery-extension.d.ts.map +1 -1
  107. package/dist/types/src/space/auth.d.ts +3 -3
  108. package/dist/types/src/space/auth.d.ts.map +1 -1
  109. package/dist/types/src/space/control-pipeline.d.ts +5 -4
  110. package/dist/types/src/space/control-pipeline.d.ts.map +1 -1
  111. package/dist/types/src/space/space-manager.d.ts +8 -8
  112. package/dist/types/src/space/space-manager.d.ts.map +1 -1
  113. package/dist/types/src/space/space-protocol.d.ts +10 -9
  114. package/dist/types/src/space/space-protocol.d.ts.map +1 -1
  115. package/dist/types/src/space/space.d.ts +6 -6
  116. package/dist/types/src/space/space.d.ts.map +1 -1
  117. package/dist/types/src/testing/change-metadata.d.ts.map +1 -1
  118. package/dist/types/src/testing/index.d.ts +0 -2
  119. package/dist/types/src/testing/index.d.ts.map +1 -1
  120. package/dist/types/src/testing/test-agent-builder.d.ts +2 -2
  121. package/dist/types/src/testing/test-agent-builder.d.ts.map +1 -1
  122. package/dist/types/src/testing/test-feed-builder.d.ts.map +1 -1
  123. package/dist/types/src/testing/test-network-adapter.d.ts +1 -1
  124. package/dist/types/src/testing/test-network-adapter.d.ts.map +1 -1
  125. package/dist/types/src/testing/test-replicator.d.ts +14 -13
  126. package/dist/types/src/testing/test-replicator.d.ts.map +1 -1
  127. package/dist/types/src/util.d.ts +1 -1
  128. package/dist/types/src/util.d.ts.map +1 -1
  129. package/dist/types/tsconfig.tsbuildinfo +1 -1
  130. package/package.json +59 -55
  131. package/src/automerge/automerge-host-subduction.test.ts +263 -0
  132. package/src/automerge/automerge-host.test.ts +162 -39
  133. package/src/automerge/automerge-host.ts +679 -201
  134. package/src/automerge/automerge-repo-subduction.test.ts +1054 -0
  135. package/src/automerge/automerge-repo.test.ts +349 -91
  136. package/src/automerge/automerge-subduction.test.ts +330 -0
  137. package/src/automerge/collection-synchronizer.test.ts +98 -17
  138. package/src/automerge/collection-synchronizer.ts +141 -37
  139. package/src/automerge/echo-data-monitor.ts +1 -1
  140. package/src/automerge/echo-network-adapter.test.ts +5 -4
  141. package/src/automerge/echo-network-adapter.ts +76 -31
  142. package/src/automerge/echo-replicator.ts +50 -15
  143. package/src/automerge/errors.ts +10 -0
  144. package/src/automerge/handle-state.ts +62 -0
  145. package/src/automerge/heads-store.ts +42 -3
  146. package/src/automerge/index.ts +3 -1
  147. package/src/automerge/leveldb-storage-adapter.ts +77 -11
  148. package/src/automerge/mesh-echo-replicator-connection.ts +12 -8
  149. package/src/automerge/mesh-echo-replicator.ts +15 -11
  150. package/src/automerge/storage-adapter.test.ts +1 -1
  151. package/src/common/space-id.ts +1 -1
  152. package/src/db-host/automerge-data-source.test.ts +299 -0
  153. package/src/db-host/automerge-data-source.ts +187 -0
  154. package/src/db-host/data-service.ts +35 -26
  155. package/src/db-host/database-root.ts +20 -8
  156. package/src/db-host/documents-synchronizer.test.ts +145 -14
  157. package/src/db-host/documents-synchronizer.ts +163 -51
  158. package/src/db-host/echo-host.ts +384 -99
  159. package/src/db-host/index.ts +2 -0
  160. package/src/db-host/invalidation-hint.ts +50 -0
  161. package/src/db-host/local-queue-service.ts +127 -0
  162. package/src/db-host/query-invalidation.test.ts +270 -0
  163. package/src/db-host/query-service.ts +111 -106
  164. package/src/db-host/queue-data-source.ts +160 -0
  165. package/src/db-host/queue-service.test.ts +145 -0
  166. package/src/db-host/space-state-manager.ts +12 -10
  167. package/src/db-host/stub.ts +33 -0
  168. package/src/edge/echo-edge-replicator.test.ts +12 -10
  169. package/src/edge/echo-edge-replicator.ts +144 -58
  170. package/src/edge/echo-edge-subduction-replicator.test.ts +158 -0
  171. package/src/edge/echo-edge-subduction-replicator.ts +377 -0
  172. package/src/edge/index.ts +1 -0
  173. package/src/filter/filter-match.test.ts +68 -32
  174. package/src/filter/filter-match.ts +230 -21
  175. package/src/metadata/metadata-store.ts +11 -8
  176. package/src/pipeline/pipeline-stress.test.ts +1 -1
  177. package/src/pipeline/pipeline.test.ts +2 -2
  178. package/src/pipeline/pipeline.ts +9 -7
  179. package/src/query/errors.ts +3 -1
  180. package/src/query/plan.ts +84 -9
  181. package/src/query/query-executor.ts +1197 -165
  182. package/src/query/query-planner.test.ts +993 -81
  183. package/src/query/query-planner.ts +503 -27
  184. package/src/space/admission-discovery-extension.ts +3 -3
  185. package/src/space/auth.ts +6 -6
  186. package/src/space/control-pipeline.test.ts +5 -4
  187. package/src/space/control-pipeline.ts +16 -13
  188. package/src/space/space-manager.browser.test.ts +1 -1
  189. package/src/space/space-manager.ts +16 -20
  190. package/src/space/space-protocol.browser.test.ts +15 -14
  191. package/src/space/space-protocol.test.ts +15 -14
  192. package/src/space/space-protocol.ts +22 -18
  193. package/src/space/space.test.ts +3 -3
  194. package/src/space/space.ts +11 -11
  195. package/src/testing/index.ts +0 -2
  196. package/src/testing/test-agent-builder.ts +3 -3
  197. package/src/testing/test-network-adapter.ts +24 -3
  198. package/src/testing/test-replicator.ts +19 -20
  199. package/src/util.ts +7 -3
  200. package/dist/lib/browser/chunk-35I6ERLG.mjs.map +0 -7
  201. package/dist/lib/browser/chunk-CGS2ULMK.mjs +0 -11
  202. package/dist/lib/browser/chunk-CGS2ULMK.mjs.map +0 -7
  203. package/dist/lib/browser/chunk-TQJTKNMS.mjs +0 -126
  204. package/dist/lib/browser/chunk-TQJTKNMS.mjs.map +0 -7
  205. package/dist/lib/browser/index.mjs +0 -4743
  206. package/dist/lib/browser/index.mjs.map +0 -7
  207. package/dist/lib/browser/meta.json +0 -1
  208. package/dist/lib/browser/testing/index.mjs.map +0 -7
  209. package/dist/lib/node/chunk-HOPOFWAL.cjs +0 -147
  210. package/dist/lib/node/chunk-HOPOFWAL.cjs.map +0 -7
  211. package/dist/lib/node/chunk-JXX6LF5U.cjs +0 -2084
  212. package/dist/lib/node/chunk-JXX6LF5U.cjs.map +0 -7
  213. package/dist/lib/node/chunk-Q7SFCCGT.cjs +0 -33
  214. package/dist/lib/node/chunk-Q7SFCCGT.cjs.map +0 -7
  215. package/dist/lib/node/filter/index.cjs +0 -32
  216. package/dist/lib/node/filter/index.cjs.map +0 -7
  217. package/dist/lib/node/index.cjs +0 -4699
  218. package/dist/lib/node/index.cjs.map +0 -7
  219. package/dist/lib/node/meta.json +0 -1
  220. package/dist/lib/node/testing/index.cjs +0 -753
  221. package/dist/lib/node/testing/index.cjs.map +0 -7
  222. package/dist/lib/node-esm/chunk-5BHLPT24.mjs +0 -2067
  223. package/dist/lib/node-esm/chunk-5BHLPT24.mjs.map +0 -7
  224. package/dist/lib/node-esm/chunk-HSLMI22Q.mjs +0 -11
  225. package/dist/lib/node-esm/chunk-HSLMI22Q.mjs.map +0 -7
  226. package/dist/lib/node-esm/chunk-RVK35BS7.mjs +0 -126
  227. package/dist/lib/node-esm/chunk-RVK35BS7.mjs.map +0 -7
  228. package/dist/lib/node-esm/filter/index.mjs +0 -11
  229. package/dist/lib/node-esm/filter/index.mjs.map +0 -7
  230. package/dist/lib/node-esm/index.mjs +0 -4743
  231. package/dist/lib/node-esm/index.mjs.map +0 -7
  232. package/dist/lib/node-esm/meta.json +0 -1
  233. package/dist/lib/node-esm/testing/index.mjs +0 -742
  234. package/dist/lib/node-esm/testing/index.mjs.map +0 -7
  235. package/dist/types/src/db-host/documents-iterator.d.ts +0 -7
  236. package/dist/types/src/db-host/documents-iterator.d.ts.map +0 -1
  237. package/dist/types/src/testing/test-data.d.ts +0 -18
  238. package/dist/types/src/testing/test-data.d.ts.map +0 -1
  239. package/dist/types/src/testing/test-schema.d.ts +0 -37
  240. package/dist/types/src/testing/test-schema.d.ts.map +0 -1
  241. package/src/db-host/documents-iterator.ts +0 -74
  242. package/src/testing/test-data.ts +0 -127
  243. package/src/testing/test-schema.ts +0 -53
  244. /package/dist/lib/{browser → neutral}/filter/index.mjs.map +0 -0
@@ -2,15 +2,15 @@
2
2
  // Copyright 2024 DXOS.org
3
3
  //
4
4
 
5
- import { scheduleTask, type Trigger } from '@dxos/async';
5
+ import { type Trigger, scheduleTask } from '@dxos/async';
6
6
  import { Context } from '@dxos/context';
7
7
  import { ProtocolError } from '@dxos/protocols';
8
8
  import { schema } from '@dxos/protocols/proto';
9
9
  import { type Credential } from '@dxos/protocols/proto/dxos/halo/credentials';
10
10
  import {
11
11
  type AdmissionDiscoveryService,
12
- type GetAdmissionCredentialResponse,
13
12
  type GetAdmissionCredentialRequest,
13
+ type GetAdmissionCredentialResponse,
14
14
  } from '@dxos/protocols/proto/dxos/mesh/teleport';
15
15
  import { type ExtensionContext, RpcExtension } from '@dxos/teleport';
16
16
 
@@ -81,7 +81,7 @@ export class CredentialServerExtension extends RpcExtension<
81
81
  ): Promise<GetAdmissionCredentialResponse> => {
82
82
  const memberInfo = this._space.spaceState.members.get(request.memberKey);
83
83
  if (!memberInfo?.credential) {
84
- throw new ProtocolError('Space member not found.', request);
84
+ throw new ProtocolError({ message: 'Space member not found.', context: { ...request } });
85
85
  }
86
86
  return { admissionCredential: memberInfo.credential };
87
87
  },
package/src/space/auth.ts CHANGED
@@ -15,7 +15,7 @@ export type AuthProvider = (nonce: Uint8Array) => Promise<Uint8Array | undefined
15
15
 
16
16
  export type AuthVerifier = (nonce: Uint8Array, credential: Uint8Array) => Promise<boolean>;
17
17
 
18
- export type AuthExtensionParams = {
18
+ export type AuthExtensionProps = {
19
19
  provider: AuthProvider;
20
20
  verifier: AuthVerifier;
21
21
  onAuthSuccess: () => void;
@@ -29,7 +29,7 @@ export class AuthExtension extends RpcExtension<Services, Services> {
29
29
  },
30
30
  });
31
31
 
32
- constructor(private readonly _authParams: AuthExtensionParams) {
32
+ constructor(private readonly _authProps: AuthExtensionProps) {
33
33
  super({
34
34
  requested: {
35
35
  AuthService: schema.getService('dxos.mesh.teleport.auth.AuthService'),
@@ -46,7 +46,7 @@ export class AuthExtension extends RpcExtension<Services, Services> {
46
46
  AuthService: {
47
47
  authenticate: async ({ challenge }) => {
48
48
  try {
49
- const credential = await this._authParams.provider(challenge);
49
+ const credential = await this._authProps.provider(challenge);
50
50
  if (!credential) {
51
51
  throw new Error('auth rejected');
52
52
  }
@@ -67,13 +67,13 @@ export class AuthExtension extends RpcExtension<Services, Services> {
67
67
  const challenge = randomBytes(32);
68
68
  const { credential } = await this.rpc.AuthService.authenticate({ challenge });
69
69
  invariant(credential?.length > 0, 'invalid credential');
70
- const success = await this._authParams.verifier(challenge, credential);
70
+ const success = await this._authProps.verifier(challenge, credential);
71
71
  invariant(success, 'credential not verified');
72
- runInContext(this._ctx, () => this._authParams.onAuthSuccess());
72
+ runInContext(this._ctx, () => this._authProps.onAuthSuccess());
73
73
  } catch (err) {
74
74
  log('auth failed', err);
75
75
  this.close();
76
- this._authParams.onAuthFailure();
76
+ this._authProps.onAuthFailure();
77
77
  }
78
78
  });
79
79
  }
@@ -2,8 +2,9 @@
2
2
  // Copyright 2022 DXOS.org
3
3
  //
4
4
 
5
- import { describe, expect, test, onTestFinished } from 'vitest';
5
+ import { describe, expect, onTestFinished, test } from 'vitest';
6
6
 
7
+ import { Context } from '@dxos/context';
7
8
  import { CredentialGenerator, createCredential } from '@dxos/credentials';
8
9
  import { FeedFactory, FeedStore } from '@dxos/feed-store';
9
10
  import { Keyring } from '@dxos/keyring';
@@ -11,12 +12,12 @@ import { type PublicKey } from '@dxos/keys';
11
12
  import { log } from '@dxos/log';
12
13
  import type { FeedMessage } from '@dxos/protocols/proto/dxos/echo/feed';
13
14
  import { AdmittedFeed } from '@dxos/protocols/proto/dxos/halo/credentials';
14
- import { createStorage, StorageType } from '@dxos/random-access-storage';
15
+ import { StorageType, createStorage } from '@dxos/random-access-storage';
15
16
  import { Timeframe } from '@dxos/timeframe';
16
17
 
17
- import { ControlPipeline } from './control-pipeline';
18
18
  import { valueEncoding } from '../common';
19
19
  import { MetadataStore } from '../metadata';
20
+ import { ControlPipeline } from './control-pipeline';
20
21
 
21
22
  describe('space/control-pipeline', () => {
22
23
  test('admits feeds', async () => {
@@ -59,7 +60,7 @@ describe('space/control-pipeline', () => {
59
60
  expect(admittedFeeds).toEqual([]);
60
61
 
61
62
  await controlPipeline.setWriteFeed(genesisFeed);
62
- await controlPipeline.start();
63
+ await controlPipeline.start(Context.default());
63
64
 
64
65
  onTestFinished(() => controlPipeline.stop());
65
66
 
@@ -2,14 +2,14 @@
2
2
  // Copyright 2022 DXOS.org
3
3
  //
4
4
 
5
- import { DeferredTask, sleepWithContext, trackLeaks } from '@dxos/async';
5
+ import { DeferredTask, scheduleMicroTask, sleepWithContext, trackLeaks } from '@dxos/async';
6
6
  import { Context } from '@dxos/context';
7
7
  import {
8
- SpaceStateMachine,
9
- type SpaceState,
10
- type MemberInfo,
11
- type FeedInfo,
12
8
  type DelegateInvitationCredential,
9
+ type FeedInfo,
10
+ type MemberInfo,
11
+ type SpaceState,
12
+ SpaceStateMachine,
13
13
  } from '@dxos/credentials';
14
14
  import { type FeedWrapper } from '@dxos/feed-store';
15
15
  import { PublicKey } from '@dxos/keys';
@@ -25,7 +25,7 @@ import { type AsyncCallback, Callback, tracer } from '@dxos/util';
25
25
  import { type MetadataStore } from '../metadata';
26
26
  import { Pipeline, type PipelineAccessor } from '../pipeline';
27
27
 
28
- export type ControlPipelineParams = {
28
+ export type ControlPipelineProps = {
29
29
  spaceKey: PublicKey;
30
30
  genesisFeed: FeedWrapper<FeedMessage>;
31
31
  feedProvider: (feedKey: PublicKey) => Promise<FeedWrapper<FeedMessage>>;
@@ -48,6 +48,7 @@ export class ControlPipeline {
48
48
  private readonly _pipeline: Pipeline;
49
49
  private readonly _spaceStateMachine: SpaceStateMachine;
50
50
 
51
+ @trace.info({ spanAttribute: true })
51
52
  private readonly _spaceKey: PublicKey;
52
53
  private readonly _metadata: MetadataStore;
53
54
  private _targetTimeframe?: Timeframe;
@@ -70,7 +71,7 @@ export class ControlPipeline {
70
71
  await this._saveSnapshot();
71
72
  });
72
73
 
73
- constructor({ spaceKey, genesisFeed, feedProvider, metadataStore }: ControlPipelineParams) {
74
+ constructor({ spaceKey, genesisFeed, feedProvider, metadataStore }: ControlPipelineProps) {
74
75
  this._spaceKey = spaceKey;
75
76
  this._metadata = metadataStore;
76
77
  this._pipeline = new Pipeline();
@@ -83,9 +84,12 @@ export class ControlPipeline {
83
84
 
84
85
  // TODO(burdon): Check not stopping.
85
86
  if (info.assertion.designation === AdmittedFeed.Designation.CONTROL && !info.key.equals(genesisFeed.key)) {
86
- queueMicrotask(async () => {
87
+ scheduleMicroTask(this._ctx, async () => {
87
88
  try {
88
89
  const feed = await feedProvider(info.key);
90
+ if (this._ctx.disposed) {
91
+ return;
92
+ }
89
93
  if (!this._pipeline.hasFeed(feed.key)) {
90
94
  await this._pipeline.addFeed(feed);
91
95
  }
@@ -117,8 +121,8 @@ export class ControlPipeline {
117
121
  this._pipeline.setWriteFeed(feed);
118
122
  }
119
123
 
120
- @trace.span({ showInBrowserTimeline: true })
121
- async start(): Promise<void> {
124
+ @trace.span({ showInBrowserTimeline: true, op: 'lifecycle' })
125
+ async start(ctx: Context): Promise<void> {
122
126
  const snapshot = this._metadata.getSpaceControlPipelineSnapshot(this._spaceKey);
123
127
  log('load snapshot', { key: this._spaceKey, present: !!snapshot, tf: snapshot?.timeframe });
124
128
  if (USE_SNAPSHOTS && snapshot) {
@@ -127,7 +131,7 @@ export class ControlPipeline {
127
131
 
128
132
  log('starting...');
129
133
  setTimeout(async () => {
130
- void this._consumePipeline(new Context());
134
+ void this._consumePipeline(ctx);
131
135
  });
132
136
 
133
137
  await this._pipeline.start();
@@ -164,7 +168,6 @@ export class ControlPipeline {
164
168
  await this._metadata.setSpaceControlPipelineSnapshot(this._spaceKey, snapshot);
165
169
  }
166
170
 
167
- @trace.span()
168
171
  private async _consumePipeline(ctx: Context): Promise<void> {
169
172
  for await (const msg of this._pipeline.consume()) {
170
173
  const span = this._usage.beginRecording();
@@ -180,7 +183,7 @@ export class ControlPipeline {
180
183
  }
181
184
  }
182
185
 
183
- @trace.span()
186
+ @trace.span({ showInBrowserTimeline: true, showInRemoteTracing: false })
184
187
  private async _processMessage(ctx: Context, msg: FeedMessageBlock): Promise<void> {
185
188
  log('processing', { key: msg.feedKey, seq: msg.seq });
186
189
  if (msg.data.payload.credential) {
@@ -2,7 +2,7 @@
2
2
  // Copyright 2022 DXOS.org
3
3
  //
4
4
 
5
- import { describe, test, onTestFinished } from 'vitest';
5
+ import { describe, onTestFinished, test } from 'vitest';
6
6
 
7
7
  import { createStorage } from '@dxos/random-access-storage';
8
8
 
@@ -4,14 +4,14 @@
4
4
 
5
5
  import { type AutomergeUrl, parseAutomergeUrl } from '@automerge/automerge-repo';
6
6
 
7
- import { synchronized, trackLeaks, Trigger } from '@dxos/async';
8
- import { getCredentialAssertion, type DelegateInvitationCredential, type MemberInfo } from '@dxos/credentials';
7
+ import { Trigger, synchronized, trackLeaks } from '@dxos/async';
8
+ import { Context } from '@dxos/context';
9
+ import { type DelegateInvitationCredential, type MemberInfo, getCredentialAssertion } from '@dxos/credentials';
9
10
  import { failUndefined } from '@dxos/debug';
10
11
  import { type FeedStore } from '@dxos/feed-store';
11
12
  import { PublicKey } from '@dxos/keys';
12
13
  import { log } from '@dxos/log';
13
14
  import { type SwarmNetworkManager } from '@dxos/network-manager';
14
- import { trace } from '@dxos/protocols';
15
15
  import type { FeedMessage } from '@dxos/protocols/proto/dxos/echo/feed';
16
16
  import { type SpaceMetadata } from '@dxos/protocols/proto/dxos/echo/metadata';
17
17
  import type { Credential } from '@dxos/protocols/proto/dxos/halo/credentials';
@@ -19,13 +19,13 @@ import { type Teleport } from '@dxos/teleport';
19
19
  import { type BlobStore } from '@dxos/teleport-extension-object-sync';
20
20
  import { ComplexMap } from '@dxos/util';
21
21
 
22
+ import { createIdFromSpaceKey } from '../common/space-id';
23
+ import { type MetadataStore } from '../metadata';
22
24
  import { CredentialRetrieverExtension } from './admission-discovery-extension';
23
25
  import { Space } from './space';
24
26
  import { SpaceProtocol, type SwarmIdentity } from './space-protocol';
25
- import { createIdFromSpaceKey } from '../common/space-id';
26
- import { type MetadataStore } from '../metadata';
27
27
 
28
- export type SpaceManagerParams = {
28
+ export type SpaceManagerProps = {
29
29
  feedStore: FeedStore<FeedMessage>;
30
30
  networkManager: SwarmNetworkManager;
31
31
  metadataStore: MetadataStore;
@@ -35,7 +35,7 @@ export type SpaceManagerParams = {
35
35
  disableP2pReplication?: boolean;
36
36
  };
37
37
 
38
- export type ConstructSpaceParams = {
38
+ export type ConstructSpaceProps = {
39
39
  metadata: SpaceMetadata;
40
40
  swarmIdentity: SwarmIdentity;
41
41
  memberKey: PublicKey;
@@ -48,7 +48,7 @@ export type ConstructSpaceParams = {
48
48
  onMemberRolesChanged: (member: MemberInfo[]) => Promise<void>;
49
49
  };
50
50
 
51
- export type RequestSpaceAdmissionCredentialParams = {
51
+ export type RequestSpaceAdmissionCredentialProps = {
52
52
  spaceKey: PublicKey;
53
53
  identityKey: PublicKey;
54
54
  swarmIdentity: SwarmIdentity;
@@ -65,10 +65,9 @@ export class SpaceManager {
65
65
  private readonly _networkManager: SwarmNetworkManager;
66
66
  private readonly _metadataStore: MetadataStore;
67
67
  private readonly _blobStore: BlobStore;
68
- private readonly _instanceId = PublicKey.random().toHex();
69
68
  private readonly _disableP2pReplication: boolean;
70
69
 
71
- constructor({ feedStore, networkManager, metadataStore, blobStore, disableP2pReplication }: SpaceManagerParams) {
70
+ constructor({ feedStore, networkManager, metadataStore, blobStore, disableP2pReplication }: SpaceManagerProps) {
72
71
  // TODO(burdon): Assert.
73
72
  this._feedStore = feedStore;
74
73
  this._networkManager = networkManager;
@@ -98,8 +97,7 @@ export class SpaceManager {
98
97
  onDelegatedInvitationStatusChange,
99
98
  onMemberRolesChanged,
100
99
  memberKey,
101
- }: ConstructSpaceParams): Promise<Space> {
102
- log.trace('dxos.echo.space-manager.construct-space', trace.begin({ id: this._instanceId }));
100
+ }: ConstructSpaceProps): Promise<Space> {
103
101
  log('constructing space...', { spaceKey: metadata.genesisFeedKey });
104
102
 
105
103
  // The genesis feed will be the same as the control feed if the space was created by the local agent.
@@ -130,13 +128,13 @@ export class SpaceManager {
130
128
  });
131
129
  this._spaces.set(space.key, space);
132
130
 
133
- log.trace('dxos.echo.space-manager.construct-space', trace.end({ id: this._instanceId }));
134
131
  return space;
135
132
  }
136
133
 
137
- public async requestSpaceAdmissionCredential(params: RequestSpaceAdmissionCredentialParams): Promise<Credential> {
138
- const traceKey = 'dxos.echo.space-manager.request-space-admission';
139
- log.trace(traceKey, trace.begin({ id: this._instanceId }));
134
+ public async requestSpaceAdmissionCredential(
135
+ ctx: Context,
136
+ params: RequestSpaceAdmissionCredentialProps,
137
+ ): Promise<Credential> {
140
138
  log('requesting space admission credential...', { spaceKey: params.spaceKey });
141
139
 
142
140
  const onCredentialResolved = new Trigger<Credential>();
@@ -159,15 +157,13 @@ export class SpaceManager {
159
157
  });
160
158
 
161
159
  try {
162
- await protocol.start();
160
+ await protocol.start(ctx);
163
161
  const credential = await onCredentialResolved.wait({ timeout: params.timeout });
164
- log.trace(traceKey, trace.end({ id: this._instanceId }));
165
162
  return credential;
166
163
  } catch (err: any) {
167
- log.trace(traceKey, trace.error({ id: this._instanceId, error: err }));
168
164
  throw err;
169
165
  } finally {
170
- await protocol.stop();
166
+ await protocol.stop(ctx);
171
167
  }
172
168
  }
173
169
 
@@ -2,14 +2,15 @@
2
2
  // Copyright 2022 DXOS.org
3
3
  //
4
4
 
5
- import { describe, expect, test, onTestFinished } from 'vitest';
5
+ import { describe, expect, onTestFinished, test } from 'vitest';
6
6
 
7
+ import { Context } from '@dxos/context';
7
8
  import { Keyring } from '@dxos/keyring';
8
9
  import { PublicKey } from '@dxos/keys';
9
10
  import { createStorage } from '@dxos/random-access-storage';
10
11
  import { Timeframe } from '@dxos/timeframe';
11
12
 
12
- import { TestFeedBuilder, TestAgentBuilder, WebsocketNetworkManagerProvider } from '../testing';
13
+ import { TestAgentBuilder, TestFeedBuilder, WebsocketNetworkManagerProvider } from '../testing';
13
14
 
14
15
  // TODO(burdon): Config.
15
16
  // Signal server will be started by the setup script.
@@ -35,11 +36,11 @@ describe('space/space-protocol', () => {
35
36
  const presence2 = peer2.createPresence(gossip2);
36
37
  const protocol2 = peer2.createSpaceProtocol(topic, gossip2);
37
38
 
38
- await protocol1.start();
39
- await protocol2.start();
39
+ await protocol1.start(Context.default());
40
+ await protocol2.start(Context.default());
40
41
 
41
- onTestFinished(() => protocol1.stop());
42
- onTestFinished(() => protocol2.stop());
42
+ onTestFinished(() => protocol1.stop(Context.default()));
43
+ onTestFinished(() => protocol2.stop(Context.default()));
43
44
 
44
45
  await expect
45
46
  .poll(() => presence1.getPeersOnline().some(({ identityKey }) => identityKey.equals(peer2.identityKey)))
@@ -62,11 +63,11 @@ describe('space/space-protocol', () => {
62
63
  const peer2 = await builder.createPeer();
63
64
  const protocol2 = peer2.createSpaceProtocol(topic);
64
65
 
65
- await protocol1.start();
66
- await protocol2.start();
66
+ await protocol1.start(Context.default());
67
+ await protocol2.start(Context.default());
67
68
 
68
- onTestFinished(() => protocol1.stop());
69
- onTestFinished(() => protocol2.stop());
69
+ onTestFinished(() => protocol1.stop(Context.default()));
70
+ onTestFinished(() => protocol2.stop(Context.default()));
70
71
 
71
72
  const builder1 = new TestFeedBuilder();
72
73
  const feedStore1 = builder1.createFeedStore();
@@ -109,11 +110,11 @@ describe('space/space-protocol', () => {
109
110
  const peer2 = await builder.createPeer();
110
111
  const protocol2 = peer2.createSpaceProtocol(topic);
111
112
 
112
- await protocol1.start();
113
- await protocol2.start();
113
+ await protocol1.start(Context.default());
114
+ await protocol2.start(Context.default());
114
115
 
115
- onTestFinished(() => protocol1.stop());
116
- onTestFinished(() => protocol2.stop());
116
+ onTestFinished(() => protocol1.stop(Context.default()));
117
+ onTestFinished(() => protocol2.stop(Context.default()));
117
118
 
118
119
  const feedKey = await peer1.keyring.createKey();
119
120
 
@@ -2,8 +2,9 @@
2
2
  // Copyright 2022 DXOS.org
3
3
  //
4
4
 
5
- import { describe, expect, test, onTestFinished } from 'vitest';
5
+ import { describe, expect, onTestFinished, test } from 'vitest';
6
6
 
7
+ import { Context } from '@dxos/context';
7
8
  import { PublicKey } from '@dxos/keys';
8
9
  import { MemorySignalManager, MemorySignalManagerContext } from '@dxos/messaging';
9
10
  import { MemoryTransportFactory, SwarmNetworkManager } from '@dxos/network-manager';
@@ -11,8 +12,8 @@ import { StorageType, createStorage } from '@dxos/random-access-storage';
11
12
  import { BlobStore } from '@dxos/teleport-extension-object-sync';
12
13
  import { Timeframe } from '@dxos/timeframe';
13
14
 
14
- import { AuthStatus, MOCK_AUTH_PROVIDER, MOCK_AUTH_VERIFIER, SpaceProtocol } from './space-protocol';
15
15
  import { TestAgentBuilder, TestFeedBuilder } from '../testing';
16
+ import { AuthStatus, MOCK_AUTH_PROVIDER, MOCK_AUTH_VERIFIER, SpaceProtocol } from './space-protocol';
16
17
 
17
18
  describe('space/space-protocol', () => {
18
19
  // Flaky.
@@ -35,11 +36,11 @@ describe('space/space-protocol', () => {
35
36
  await presence2.open();
36
37
  const protocol2 = peer2.createSpaceProtocol(topic, gossip2);
37
38
 
38
- await protocol1.start();
39
- onTestFinished(() => protocol1.stop());
39
+ await protocol1.start(Context.default());
40
+ onTestFinished(() => protocol1.stop(Context.default()));
40
41
 
41
- await protocol2.start();
42
- onTestFinished(() => protocol2.stop());
42
+ await protocol2.start(Context.default());
43
+ onTestFinished(() => protocol2.stop(Context.default()));
43
44
 
44
45
  await expect
45
46
  .poll(() => presence1.getPeersOnline().some(({ identityKey }) => identityKey.equals(peer2.identityKey)), {
@@ -95,11 +96,11 @@ describe('space/space-protocol', () => {
95
96
  }),
96
97
  });
97
98
 
98
- await protocol1.start();
99
- onTestFinished(() => protocol1.stop());
99
+ await protocol1.start(Context.default());
100
+ onTestFinished(() => protocol1.stop(Context.default()));
100
101
 
101
- await protocol2.start();
102
- onTestFinished(() => protocol2.stop());
102
+ await protocol2.start(Context.default());
103
+ onTestFinished(() => protocol2.stop(Context.default()));
103
104
 
104
105
  await expect.poll(() => protocol1.sessions.get(peerId2)?.authStatus).toEqual(AuthStatus.FAILURE);
105
106
  });
@@ -118,11 +119,11 @@ describe('space/space-protocol', () => {
118
119
  const peer2 = await builder.createPeer();
119
120
  const protocol2 = peer2.createSpaceProtocol(topic);
120
121
 
121
- await protocol1.start();
122
- await protocol2.start();
122
+ await protocol1.start(Context.default());
123
+ await protocol2.start(Context.default());
123
124
 
124
- onTestFinished(() => protocol1.stop());
125
- onTestFinished(() => protocol2.stop());
125
+ onTestFinished(() => protocol1.stop(Context.default()));
126
+ onTestFinished(() => protocol2.stop(Context.default()));
126
127
 
127
128
  //
128
129
  // Create feeds.
@@ -3,16 +3,17 @@
3
3
  //
4
4
 
5
5
  import { type Event } from '@dxos/async';
6
+ import { Context } from '@dxos/context';
6
7
  import { discoveryKey, subtleCrypto } from '@dxos/crypto';
7
8
  import { type FeedWrapper } from '@dxos/feed-store';
8
9
  import { PublicKey } from '@dxos/keys';
9
10
  import { log, logInfo } from '@dxos/log';
10
11
  import {
11
12
  MMSTTopology,
12
- type SwarmNetworkManager,
13
13
  type SwarmConnection,
14
+ type SwarmNetworkManager,
14
15
  type WireProtocol,
15
- type WireProtocolParams,
16
+ type WireProtocolProps,
16
17
  type WireProtocolProvider,
17
18
  } from '@dxos/network-manager';
18
19
  import type { FeedMessage } from '@dxos/protocols/proto/dxos/echo/feed';
@@ -20,7 +21,7 @@ import { type MuxerStats, Teleport } from '@dxos/teleport';
20
21
  import { type BlobStore, BlobSync } from '@dxos/teleport-extension-object-sync';
21
22
  import { ReplicatorExtension } from '@dxos/teleport-extension-replicator';
22
23
  import { trace } from '@dxos/tracing';
23
- import { CallbackCollection, ComplexMap, type AsyncCallback } from '@dxos/util';
24
+ import { type AsyncCallback, CallbackCollection, ComplexMap } from '@dxos/util';
24
25
 
25
26
  import { AuthExtension, type AuthProvider, type AuthVerifier } from './auth';
26
27
 
@@ -118,7 +119,10 @@ export class SpaceProtocol {
118
119
  this.blobSync = new BlobSync({ blobStore });
119
120
 
120
121
  // TODO(burdon): Async race condition? Move to start?
121
- this._topic = subtleCrypto.digest('SHA-256', topic.asBuffer()).then(discoveryKey).then(PublicKey.from);
122
+ this._topic = subtleCrypto
123
+ .digest('SHA-256', topic.asBuffer() as ArrayBufferView<ArrayBuffer>)
124
+ .then(discoveryKey)
125
+ .then(PublicKey.from);
122
126
 
123
127
  this._disableP2pReplication = disableP2pReplication ?? false;
124
128
  }
@@ -136,7 +140,7 @@ export class SpaceProtocol {
136
140
  }
137
141
 
138
142
  // TODO(burdon): Rename open? Common open/close interfaces for all services?
139
- async start(): Promise<void> {
143
+ async start(ctx: Context): Promise<void> {
140
144
  if (this._connection) {
141
145
  return;
142
146
  }
@@ -148,7 +152,7 @@ export class SpaceProtocol {
148
152
 
149
153
  log('starting...');
150
154
  const topic = await this._topic;
151
- this._connection = await this._networkManager.joinSwarm({
155
+ this._connection = await this._networkManager.joinSwarm(ctx, {
152
156
  protocolProvider: this._createProtocolProvider(credentials),
153
157
  topic,
154
158
  topology: this._topology,
@@ -162,27 +166,27 @@ export class SpaceProtocol {
162
166
  this._topology.forceUpdate();
163
167
  }
164
168
 
165
- async stop(): Promise<void> {
169
+ async stop(ctx: Context): Promise<void> {
166
170
  await this.blobSync.close();
167
171
 
168
172
  if (this._connection) {
169
173
  log('stopping...');
170
- await this._connection.close();
174
+ await this._connection.close(ctx);
171
175
  log('stopped');
172
176
  }
173
177
  }
174
178
 
175
179
  private _createProtocolProvider(credentials: Uint8Array | undefined): WireProtocolProvider {
176
- return (wireParams) => {
180
+ return (wireProps) => {
177
181
  const session = new SpaceProtocolSession({
178
- wireParams,
182
+ wireProps,
179
183
  swarmIdentity: this._swarmIdentity,
180
184
  onSessionAuth: this._onSessionAuth,
181
185
  onAuthFailure: this._onAuthFailure,
182
186
  blobSync: this.blobSync,
183
187
  disableP2pReplication: this._disableP2pReplication,
184
188
  });
185
- this._sessions.set(wireParams.remotePeerId, session);
189
+ this._sessions.set(wireProps.remotePeerId, session);
186
190
 
187
191
  for (const feed of this._feeds) {
188
192
  session.replicator.addFeed(feed);
@@ -193,8 +197,8 @@ export class SpaceProtocol {
193
197
  }
194
198
  }
195
199
 
196
- export type SpaceProtocolSessionParams = {
197
- wireParams: WireProtocolParams;
200
+ export type SpaceProtocolSessionProps = {
201
+ wireProps: WireProtocolProps;
198
202
  swarmIdentity: SwarmIdentity;
199
203
 
200
204
  blobSync: BlobSync;
@@ -222,7 +226,7 @@ export enum AuthStatus {
222
226
  */
223
227
  export class SpaceProtocolSession implements WireProtocol {
224
228
  @logInfo
225
- private readonly _wireParams: WireProtocolParams;
229
+ private readonly _wireProps: WireProtocolProps;
226
230
 
227
231
  private readonly _disableP2pReplication: boolean;
228
232
 
@@ -249,20 +253,20 @@ export class SpaceProtocolSession implements WireProtocol {
249
253
 
250
254
  // TODO(dmaretskyi): Allow to pass in extra extensions.
251
255
  constructor({
252
- wireParams,
256
+ wireProps,
253
257
  swarmIdentity,
254
258
  onSessionAuth,
255
259
  onAuthFailure,
256
260
  blobSync,
257
261
  disableP2pReplication,
258
- }: SpaceProtocolSessionParams) {
259
- this._wireParams = wireParams;
262
+ }: SpaceProtocolSessionProps) {
263
+ this._wireProps = wireProps;
260
264
  this._swarmIdentity = swarmIdentity;
261
265
  this._onSessionAuth = onSessionAuth;
262
266
  this._onAuthFailure = onAuthFailure;
263
267
  this._blobSync = blobSync;
264
268
 
265
- this._teleport = new Teleport(wireParams);
269
+ this._teleport = new Teleport(wireProps);
266
270
 
267
271
  this._disableP2pReplication = disableP2pReplication ?? false;
268
272
  }
@@ -2,7 +2,7 @@
2
2
  // Copyright 2022 DXOS.org
3
3
  //
4
4
 
5
- import { onTestFinished, describe, expect, test } from 'vitest';
5
+ import { describe, expect, onTestFinished, test } from 'vitest';
6
6
 
7
7
  import { Context } from '@dxos/context';
8
8
  import { CredentialGenerator } from '@dxos/credentials';
@@ -49,7 +49,7 @@ describe('space/space', () => {
49
49
  const space = await agent.createSpace(agent.identityKey);
50
50
 
51
51
  await space.open(Context.default());
52
- await space.startProtocol();
52
+ await space.startProtocol(Context.default());
53
53
  expect(space.isOpen).toBeTruthy();
54
54
  onTestFinished(async () => {
55
55
  await space.close();
@@ -71,7 +71,7 @@ describe('space/space', () => {
71
71
  const space = await agent.createSpace(agent.identityKey, space1.key, space1.genesisFeedKey, undefined, true);
72
72
 
73
73
  await space.open(Context.default());
74
- await space.startProtocol();
74
+ await space.startProtocol(Context.default());
75
75
  expect(space.isOpen).toBeTruthy();
76
76
  onTestFinished(async () => {
77
77
  await space.close();