@dxos/client-services 0.4.10-main.fd4f2a3 → 0.4.10-main.fd8ea31

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 (97) hide show
  1. package/dist/lib/browser/{chunk-V2ALN47T.mjs → chunk-WLE7E36I.mjs} +1402 -1074
  2. package/dist/lib/browser/chunk-WLE7E36I.mjs.map +7 -0
  3. package/dist/lib/browser/index.mjs +13 -3
  4. package/dist/lib/browser/index.mjs.map +1 -1
  5. package/dist/lib/browser/meta.json +1 -1
  6. package/dist/lib/browser/packlets/testing/index.mjs +133 -115
  7. package/dist/lib/browser/packlets/testing/index.mjs.map +3 -3
  8. package/dist/lib/node/{chunk-7WXQVUAE.cjs → chunk-YXZQQAQN.cjs} +1308 -1063
  9. package/dist/lib/node/chunk-YXZQQAQN.cjs.map +7 -0
  10. package/dist/lib/node/index.cjs +49 -39
  11. package/dist/lib/node/index.cjs.map +1 -1
  12. package/dist/lib/node/meta.json +1 -1
  13. package/dist/lib/node/packlets/testing/index.cjs +133 -118
  14. package/dist/lib/node/packlets/testing/index.cjs.map +3 -3
  15. package/dist/types/src/index.d.ts +1 -0
  16. package/dist/types/src/index.d.ts.map +1 -1
  17. package/dist/types/src/packlets/diagnostics/browser-diagnostics-broadcast.d.ts +5 -0
  18. package/dist/types/src/packlets/diagnostics/browser-diagnostics-broadcast.d.ts.map +1 -0
  19. package/dist/types/src/packlets/diagnostics/diagnostics-broadcast.d.ts +5 -0
  20. package/dist/types/src/packlets/diagnostics/diagnostics-broadcast.d.ts.map +1 -0
  21. package/dist/types/src/packlets/diagnostics/diagnostics-collector.d.ts +15 -0
  22. package/dist/types/src/packlets/diagnostics/diagnostics-collector.d.ts.map +1 -0
  23. package/dist/types/src/packlets/{services → diagnostics}/diagnostics.d.ts +1 -1
  24. package/dist/types/src/packlets/diagnostics/diagnostics.d.ts.map +1 -0
  25. package/dist/types/src/packlets/diagnostics/index.d.ts +4 -0
  26. package/dist/types/src/packlets/diagnostics/index.d.ts.map +1 -0
  27. package/dist/types/src/packlets/identity/identity-manager.d.ts.map +1 -1
  28. package/dist/types/src/packlets/indexing/util.d.ts +2 -6
  29. package/dist/types/src/packlets/indexing/util.d.ts.map +1 -1
  30. package/dist/types/src/packlets/invitations/device-invitation-protocol.d.ts +3 -1
  31. package/dist/types/src/packlets/invitations/device-invitation-protocol.d.ts.map +1 -1
  32. package/dist/types/src/packlets/invitations/index.d.ts +1 -0
  33. package/dist/types/src/packlets/invitations/index.d.ts.map +1 -1
  34. package/dist/types/src/packlets/invitations/invitation-extension.d.ts +1 -0
  35. package/dist/types/src/packlets/invitations/invitation-extension.d.ts.map +1 -1
  36. package/dist/types/src/packlets/invitations/invitation-protocol.d.ts +6 -1
  37. package/dist/types/src/packlets/invitations/invitation-protocol.d.ts.map +1 -1
  38. package/dist/types/src/packlets/invitations/invitations-handler.d.ts +8 -4
  39. package/dist/types/src/packlets/invitations/invitations-handler.d.ts.map +1 -1
  40. package/dist/types/src/packlets/invitations/invitations-manager.d.ts +44 -0
  41. package/dist/types/src/packlets/invitations/invitations-manager.d.ts.map +1 -0
  42. package/dist/types/src/packlets/invitations/invitations-service.d.ts +7 -23
  43. package/dist/types/src/packlets/invitations/invitations-service.d.ts.map +1 -1
  44. package/dist/types/src/packlets/invitations/space-invitation-protocol.d.ts +2 -1
  45. package/dist/types/src/packlets/invitations/space-invitation-protocol.d.ts.map +1 -1
  46. package/dist/types/src/packlets/services/index.d.ts +1 -1
  47. package/dist/types/src/packlets/services/index.d.ts.map +1 -1
  48. package/dist/types/src/packlets/services/service-context.d.ts +2 -0
  49. package/dist/types/src/packlets/services/service-context.d.ts.map +1 -1
  50. package/dist/types/src/packlets/services/service-host.d.ts +5 -1
  51. package/dist/types/src/packlets/services/service-host.d.ts.map +1 -1
  52. package/dist/types/src/packlets/services/util.d.ts +1 -0
  53. package/dist/types/src/packlets/services/util.d.ts.map +1 -1
  54. package/dist/types/src/packlets/spaces/data-space-manager.d.ts +5 -1
  55. package/dist/types/src/packlets/spaces/data-space-manager.d.ts.map +1 -1
  56. package/dist/types/src/packlets/spaces/data-space.d.ts.map +1 -1
  57. package/dist/types/src/packlets/system/system-service.d.ts +1 -1
  58. package/dist/types/src/packlets/system/system-service.d.ts.map +1 -1
  59. package/dist/types/src/packlets/testing/invitation-utils.d.ts.map +1 -1
  60. package/dist/types/src/packlets/testing/test-builder.d.ts +6 -1
  61. package/dist/types/src/packlets/testing/test-builder.d.ts.map +1 -1
  62. package/dist/types/src/version.d.ts +1 -1
  63. package/package.json +35 -34
  64. package/src/index.ts +1 -0
  65. package/src/packlets/diagnostics/browser-diagnostics-broadcast.ts +94 -0
  66. package/src/packlets/diagnostics/diagnostics-broadcast.ts +20 -0
  67. package/src/packlets/diagnostics/diagnostics-collector.ts +65 -0
  68. package/src/packlets/{services → diagnostics}/diagnostics.ts +2 -2
  69. package/src/packlets/diagnostics/index.ts +7 -0
  70. package/src/packlets/identity/identity-manager.ts +1 -0
  71. package/src/packlets/identity/identity.test.ts +3 -0
  72. package/src/packlets/indexing/util.ts +9 -66
  73. package/src/packlets/invitations/device-invitation-protocol.ts +6 -1
  74. package/src/packlets/invitations/index.ts +1 -0
  75. package/src/packlets/invitations/invitation-extension.ts +28 -1
  76. package/src/packlets/invitations/invitation-protocol.ts +7 -1
  77. package/src/packlets/invitations/invitations-handler.ts +75 -96
  78. package/src/packlets/invitations/invitations-manager.ts +271 -0
  79. package/src/packlets/invitations/invitations-service.ts +23 -168
  80. package/src/packlets/invitations/space-invitation-protocol.ts +45 -3
  81. package/src/packlets/services/automerge-host.test.ts +10 -4
  82. package/src/packlets/services/index.ts +1 -1
  83. package/src/packlets/services/service-context.test.ts +4 -1
  84. package/src/packlets/services/service-context.ts +19 -5
  85. package/src/packlets/services/service-host.ts +34 -19
  86. package/src/packlets/services/util.ts +2 -0
  87. package/src/packlets/spaces/data-space-manager.test.ts +4 -4
  88. package/src/packlets/spaces/data-space-manager.ts +48 -2
  89. package/src/packlets/spaces/data-space.ts +1 -1
  90. package/src/packlets/storage/level.ts +1 -1
  91. package/src/packlets/system/system-service.ts +1 -1
  92. package/src/packlets/testing/invitation-utils.ts +100 -97
  93. package/src/packlets/testing/test-builder.ts +39 -5
  94. package/src/version.ts +1 -1
  95. package/dist/lib/browser/chunk-V2ALN47T.mjs.map +0 -7
  96. package/dist/lib/node/chunk-7WXQVUAE.cjs.map +0 -7
  97. package/dist/types/src/packlets/services/diagnostics.d.ts.map +0 -1
@@ -26,19 +26,22 @@ var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__ge
26
26
  mod
27
27
  ));
28
28
  var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
29
- var chunk_7WXQVUAE_exports = {};
30
- __export(chunk_7WXQVUAE_exports, {
29
+ var chunk_YXZQQAQN_exports = {};
30
+ __export(chunk_YXZQQAQN_exports, {
31
31
  ClientRpcServer: () => ClientRpcServer,
32
32
  ClientServicesHost: () => ClientServicesHost,
33
+ ClientServicesProviderResource: () => ClientServicesProviderResource,
33
34
  DataSpace: () => DataSpace,
34
35
  DataSpaceManager: () => DataSpaceManager,
35
36
  DeviceInvitationProtocol: () => DeviceInvitationProtocol,
36
37
  DevtoolsHostEvents: () => DevtoolsHostEvents,
37
38
  DevtoolsServiceImpl: () => DevtoolsServiceImpl,
39
+ DiagnosticsCollector: () => DiagnosticsCollector,
38
40
  Identity: () => Identity,
39
41
  IdentityManager: () => IdentityManager,
40
42
  IdentityServiceImpl: () => IdentityServiceImpl,
41
43
  InvitationsHandler: () => InvitationsHandler,
44
+ InvitationsManager: () => InvitationsManager,
42
45
  InvitationsServiceImpl: () => InvitationsServiceImpl,
43
46
  Lock: () => Lock,
44
47
  ServiceContext: () => ServiceContext,
@@ -46,12 +49,14 @@ __export(chunk_7WXQVUAE_exports, {
46
49
  SpaceInvitationProtocol: () => SpaceInvitationProtocol,
47
50
  SpacesServiceImpl: () => SpacesServiceImpl,
48
51
  TrustedKeySetAuthVerifier: () => TrustedKeySetAuthVerifier,
52
+ createAdmissionKeypair: () => createAdmissionKeypair,
49
53
  createAuthProvider: () => createAuthProvider,
54
+ createCollectDiagnosticsBroadcastHandler: () => createCollectDiagnosticsBroadcastHandler,
55
+ createCollectDiagnosticsBroadcastSender: () => createCollectDiagnosticsBroadcastSender,
50
56
  createDiagnostics: () => createDiagnostics,
51
57
  createLevel: () => createLevel,
52
58
  createStorageObjects: () => createStorageObjects,
53
59
  getNetworkPeers: () => getNetworkPeers,
54
- invitationExpired: () => invitationExpired,
55
60
  isLocked: () => isLocked,
56
61
  subscribeToFeedBlocks: () => subscribeToFeedBlocks,
57
62
  subscribeToFeeds: () => subscribeToFeeds,
@@ -61,7 +66,7 @@ __export(chunk_7WXQVUAE_exports, {
61
66
  subscribeToSpaces: () => subscribeToSpaces,
62
67
  subscribeToSwarmInfo: () => subscribeToSwarmInfo
63
68
  });
64
- module.exports = __toCommonJS(chunk_7WXQVUAE_exports);
69
+ module.exports = __toCommonJS(chunk_YXZQQAQN_exports);
65
70
  var import_async = require("@dxos/async");
66
71
  var import_codec_protobuf = require("@dxos/codec-protobuf");
67
72
  var import_feed_store = require("@dxos/feed-store");
@@ -115,7 +120,7 @@ var import_services2 = require("@dxos/protocols/proto/dxos/client/services");
115
120
  var import_async7 = require("@dxos/async");
116
121
  var import_client_protocol2 = require("@dxos/client-protocol");
117
122
  var import_context4 = require("@dxos/context");
118
- var import_credentials7 = require("@dxos/credentials");
123
+ var import_crypto = require("@dxos/crypto");
119
124
  var import_invariant5 = require("@dxos/invariant");
120
125
  var import_keys5 = require("@dxos/keys");
121
126
  var import_log4 = require("@dxos/log");
@@ -125,6 +130,7 @@ var import_services3 = require("@dxos/protocols/proto/dxos/client/services");
125
130
  var import_invitations = require("@dxos/protocols/proto/dxos/halo/invitations");
126
131
  var import_async8 = require("@dxos/async");
127
132
  var import_context5 = require("@dxos/context");
133
+ var import_crypto2 = require("@dxos/crypto");
128
134
  var import_invariant6 = require("@dxos/invariant");
129
135
  var import_keys6 = require("@dxos/keys");
130
136
  var import_log5 = require("@dxos/log");
@@ -132,63 +138,62 @@ var import_protocols5 = require("@dxos/protocols");
132
138
  var import_services4 = require("@dxos/protocols/proto/dxos/client/services");
133
139
  var import_invitations2 = require("@dxos/protocols/proto/dxos/halo/invitations");
134
140
  var import_teleport = require("@dxos/teleport");
135
- var import_async9 = require("@dxos/async");
136
141
  var import_codec_protobuf8 = require("@dxos/codec-protobuf");
137
- var import_context6 = require("@dxos/context");
138
- var import_invariant7 = require("@dxos/invariant");
139
- var import_log6 = require("@dxos/log");
140
142
  var import_services5 = require("@dxos/protocols/proto/dxos/client/services");
141
- var import_credentials8 = require("@dxos/credentials");
143
+ var import_credentials7 = require("@dxos/credentials");
142
144
  var import_feed_store3 = require("@dxos/feed-store");
143
- var import_invariant8 = require("@dxos/invariant");
144
- var import_log7 = require("@dxos/log");
145
+ var import_invariant7 = require("@dxos/invariant");
146
+ var import_log6 = require("@dxos/log");
145
147
  var import_protocols6 = require("@dxos/protocols");
146
148
  var import_services6 = require("@dxos/protocols/proto/dxos/client/services");
149
+ var import_credentials8 = require("@dxos/protocols/proto/dxos/halo/credentials");
150
+ var import_async9 = require("@dxos/async");
151
+ var import_client_protocol3 = require("@dxos/client-protocol");
152
+ var import_context6 = require("@dxos/context");
153
+ var import_credentials9 = require("@dxos/credentials");
154
+ var import_echo_pipeline = require("@dxos/echo-pipeline");
155
+ var import_invariant8 = require("@dxos/invariant");
156
+ var import_keys7 = require("@dxos/keys");
157
+ var import_log7 = require("@dxos/log");
158
+ var import_services7 = require("@dxos/protocols/proto/dxos/client/services");
147
159
  var import_codec_protobuf9 = require("@dxos/codec-protobuf");
148
160
  var import_debug2 = require("@dxos/debug");
149
161
  var import_rpc = require("@dxos/rpc");
150
162
  var import_tracing3 = require("@dxos/tracing");
151
- var import_codec_protobuf10 = require("@dxos/codec-protobuf");
152
- var import_credentials9 = require("@dxos/credentials");
153
- var import_invariant9 = require("@dxos/invariant");
154
- var import_protocols7 = require("@dxos/protocols");
155
- var import_services7 = require("@dxos/protocols/proto/dxos/client/services");
156
- var import_tracing4 = require("@dxos/tracing");
157
- var import_services8 = require("@dxos/protocols/proto/dxos/client/services");
158
163
  var import_async10 = require("@dxos/async");
159
- var import_client_protocol3 = require("@dxos/client-protocol");
164
+ var import_client_protocol4 = require("@dxos/client-protocol");
160
165
  var import_context7 = require("@dxos/context");
161
166
  var import_debug3 = require("@dxos/debug");
162
- var import_echo_db = require("@dxos/echo-db");
163
- var import_echo_pipeline = require("@dxos/echo-pipeline");
164
167
  var import_echo_pipeline2 = require("@dxos/echo-pipeline");
165
- var import_invariant10 = require("@dxos/invariant");
166
- var import_keys7 = require("@dxos/keys");
168
+ var import_echo_pipeline3 = require("@dxos/echo-pipeline");
169
+ var import_echo_schema = require("@dxos/echo-schema");
170
+ var import_invariant9 = require("@dxos/invariant");
171
+ var import_keys8 = require("@dxos/keys");
167
172
  var import_log8 = require("@dxos/log");
168
- var import_protocols8 = require("@dxos/protocols");
169
- var import_services9 = require("@dxos/protocols/proto/dxos/client/services");
173
+ var import_protocols7 = require("@dxos/protocols");
174
+ var import_services8 = require("@dxos/protocols/proto/dxos/client/services");
170
175
  var import_credentials10 = require("@dxos/protocols/proto/dxos/halo/credentials");
171
176
  var import_timeframe2 = require("@dxos/timeframe");
172
- var import_tracing5 = require("@dxos/tracing");
177
+ var import_tracing4 = require("@dxos/tracing");
173
178
  var import_util4 = require("@dxos/util");
174
179
  var import_async11 = require("@dxos/async");
175
180
  var import_credentials11 = require("@dxos/credentials");
176
181
  var import_async12 = require("@dxos/async");
177
182
  var import_context8 = require("@dxos/context");
178
- var import_invariant11 = require("@dxos/invariant");
179
- var import_keys8 = require("@dxos/keys");
183
+ var import_invariant10 = require("@dxos/invariant");
184
+ var import_keys9 = require("@dxos/keys");
180
185
  var import_log9 = require("@dxos/log");
181
- var import_protocols9 = require("@dxos/protocols");
186
+ var import_protocols8 = require("@dxos/protocols");
182
187
  var import_teleport2 = require("@dxos/teleport");
183
188
  var import_util5 = require("@dxos/util");
184
189
  var import_async13 = require("@dxos/async");
185
190
  var import_context9 = require("@dxos/context");
186
191
  var import_credentials12 = require("@dxos/credentials");
187
- var import_invariant12 = require("@dxos/invariant");
188
- var import_keys9 = require("@dxos/keys");
192
+ var import_invariant11 = require("@dxos/invariant");
193
+ var import_keys10 = require("@dxos/keys");
189
194
  var import_log10 = require("@dxos/log");
190
- var import_protocols10 = require("@dxos/protocols");
191
- var import_services10 = require("@dxos/protocols/proto/dxos/client/services");
195
+ var import_protocols9 = require("@dxos/protocols");
196
+ var import_services9 = require("@dxos/protocols/proto/dxos/client/services");
192
197
  var import_teleport_extension_gossip2 = require("@dxos/teleport-extension-gossip");
193
198
  var import_util6 = require("@dxos/util");
194
199
  var import_credentials13 = require("@dxos/credentials");
@@ -196,73 +201,85 @@ var import_debug4 = require("@dxos/debug");
196
201
  var import_credentials14 = require("@dxos/protocols/proto/dxos/halo/credentials");
197
202
  var import_timeframe3 = require("@dxos/timeframe");
198
203
  var import_async14 = require("@dxos/async");
199
- var import_codec_protobuf11 = require("@dxos/codec-protobuf");
204
+ var import_codec_protobuf10 = require("@dxos/codec-protobuf");
200
205
  var import_debug5 = require("@dxos/debug");
201
- var import_invariant13 = require("@dxos/invariant");
206
+ var import_invariant12 = require("@dxos/invariant");
202
207
  var import_log11 = require("@dxos/log");
203
- var import_protocols11 = require("@dxos/protocols");
204
- var import_services11 = require("@dxos/protocols/proto/dxos/client/services");
208
+ var import_protocols10 = require("@dxos/protocols");
209
+ var import_services10 = require("@dxos/protocols/proto/dxos/client/services");
205
210
  var import_async15 = require("@dxos/async");
206
211
  var import_context10 = require("@dxos/context");
207
212
  var import_credentials15 = require("@dxos/credentials");
208
213
  var import_debug6 = require("@dxos/debug");
209
- var import_echo_pipeline3 = require("@dxos/echo-pipeline");
214
+ var import_echo_pipeline4 = require("@dxos/echo-pipeline");
210
215
  var import_feed_store4 = require("@dxos/feed-store");
211
216
  var import_indexing = require("@dxos/indexing");
212
- var import_invariant14 = require("@dxos/invariant");
217
+ var import_invariant13 = require("@dxos/invariant");
213
218
  var import_keyring = require("@dxos/keyring");
214
- var import_keys10 = require("@dxos/keys");
219
+ var import_keys11 = require("@dxos/keys");
215
220
  var import_log12 = require("@dxos/log");
216
- var import_protocols12 = require("@dxos/protocols");
217
- var import_services12 = require("@dxos/protocols/proto/dxos/client/services");
221
+ var import_protocols11 = require("@dxos/protocols");
222
+ var import_services11 = require("@dxos/protocols/proto/dxos/client/services");
218
223
  var import_teleport_extension_object_sync = require("@dxos/teleport-extension-object-sync");
219
- var import_tracing6 = require("@dxos/tracing");
224
+ var import_tracing5 = require("@dxos/tracing");
220
225
  var import_util7 = require("@dxos/util");
221
226
  var import_automerge = require("@dxos/automerge/automerge");
222
- var import_debug7 = require("@dxos/debug");
227
+ var import_protocols12 = require("@dxos/protocols");
228
+ var import_codec_protobuf11 = require("@dxos/codec-protobuf");
229
+ var import_credentials16 = require("@dxos/credentials");
230
+ var import_invariant14 = require("@dxos/invariant");
223
231
  var import_protocols13 = require("@dxos/protocols");
224
- var import_invariant15 = require("@dxos/invariant");
225
- var import_lock_file = require("@dxos/lock-file");
226
- var import_log13 = require("@dxos/log");
227
- var import_protocols14 = require("@dxos/protocols");
228
- var import_config = require("@dxos/protocols/proto/dxos/config");
229
- var import_random_access_storage = require("@dxos/random-access-storage");
230
- var import_client_protocol4 = require("@dxos/client-protocol");
231
- var import_config2 = require("@dxos/protocols/proto/dxos/config");
232
+ var import_services12 = require("@dxos/protocols/proto/dxos/client/services");
233
+ var import_tracing6 = require("@dxos/tracing");
234
+ var import_services13 = require("@dxos/protocols/proto/dxos/client/services");
235
+ var import_config = require("@dxos/config");
236
+ var import_services14 = require("@dxos/protocols/proto/dxos/client/services");
237
+ var import_tracing7 = require("@dxos/tracing");
232
238
  var import_util8 = require("@dxos/util");
233
- var import_level = require("level");
234
- var import_node_path = __toESM(require("node:path"));
235
- var import_keys11 = require("@dxos/keys");
236
239
  var import_async16 = require("@dxos/async");
237
240
  var import_client_protocol5 = require("@dxos/client-protocol");
238
241
  var import_context11 = require("@dxos/context");
239
- var import_echo_pipeline4 = require("@dxos/echo-pipeline");
240
- var E = __toESM(require("@dxos/echo-schema"));
242
+ var import_echo_pipeline5 = require("@dxos/echo-pipeline");
243
+ var import_echo_schema2 = require("@dxos/echo-schema");
241
244
  var import_indexing2 = require("@dxos/indexing");
242
- var import_invariant16 = require("@dxos/invariant");
245
+ var import_invariant15 = require("@dxos/invariant");
243
246
  var import_keys12 = require("@dxos/keys");
244
- var import_log14 = require("@dxos/log");
247
+ var import_log13 = require("@dxos/log");
245
248
  var import_messaging = require("@dxos/messaging");
246
249
  var import_network_manager2 = require("@dxos/network-manager");
247
- var import_protocols15 = require("@dxos/protocols");
248
- var import_services13 = require("@dxos/protocols/proto/dxos/client/services");
249
- var import_tracing7 = require("@dxos/tracing");
250
+ var import_protocols14 = require("@dxos/protocols");
251
+ var import_services15 = require("@dxos/protocols/proto/dxos/client/services");
252
+ var import_tracing8 = require("@dxos/tracing");
250
253
  var import_util9 = require("@dxos/util");
251
254
  var import_websocket_rpc = require("@dxos/websocket-rpc");
252
255
  var import_async17 = require("@dxos/async");
253
256
  var import_codec_protobuf12 = require("@dxos/codec-protobuf");
257
+ var import_invariant16 = require("@dxos/invariant");
258
+ var import_services16 = require("@dxos/protocols/proto/dxos/client/services");
254
259
  var import_invariant17 = require("@dxos/invariant");
255
- var import_services14 = require("@dxos/protocols/proto/dxos/client/services");
260
+ var import_lock_file = require("@dxos/lock-file");
261
+ var import_log14 = require("@dxos/log");
256
262
  var import_async18 = require("@dxos/async");
257
263
  var import_codec_protobuf13 = require("@dxos/codec-protobuf");
258
264
  var import_keys13 = require("@dxos/keys");
259
265
  var import_log15 = require("@dxos/log");
260
- var import_services15 = require("@dxos/protocols/proto/dxos/client/services");
266
+ var import_services17 = require("@dxos/protocols/proto/dxos/client/services");
261
267
  var import_util10 = require("@dxos/util");
262
268
  var import_codec_protobuf14 = require("@dxos/codec-protobuf");
263
- var import_codec_protobuf15 = require("@dxos/codec-protobuf");
264
- var import_services16 = require("@dxos/protocols/proto/dxos/client/services");
269
+ var import_protocols15 = require("@dxos/protocols");
270
+ var import_config2 = require("@dxos/protocols/proto/dxos/config");
271
+ var import_random_access_storage = require("@dxos/random-access-storage");
272
+ var import_client_protocol6 = require("@dxos/client-protocol");
273
+ var import_config3 = require("@dxos/protocols/proto/dxos/config");
265
274
  var import_util11 = require("@dxos/util");
275
+ var import_level = require("level");
276
+ var import_node_path = __toESM(require("node:path"));
277
+ var import_keys14 = require("@dxos/keys");
278
+ var import_codec_protobuf15 = require("@dxos/codec-protobuf");
279
+ var import_services18 = require("@dxos/protocols/proto/dxos/client/services");
280
+ var import_util12 = require("@dxos/util");
281
+ var import_keys15 = require("@dxos/keys");
282
+ var import_util13 = require("@dxos/util");
266
283
  var subscribeToFeeds = ({ feedStore }, { feedKeys }) => {
267
284
  return new import_codec_protobuf.Stream(({ next }) => {
268
285
  const subscriptions = new import_async.EventSubscriptions();
@@ -1280,7 +1297,9 @@ var IdentityManager = class {
1280
1297
  C: (f, a) => f(...a)
1281
1298
  });
1282
1299
  },
1283
- memberKey: identityKey
1300
+ memberKey: identityKey,
1301
+ onDelegatedInvitationStatusChange: async () => {
1302
+ }
1284
1303
  });
1285
1304
  }
1286
1305
  };
@@ -1377,10 +1396,13 @@ var DeviceInvitationProtocol = class {
1377
1396
  kind: import_services2.Invitation.Kind.DEVICE
1378
1397
  };
1379
1398
  }
1380
- async admit(request) {
1399
+ async delegate(invitation) {
1400
+ throw new Error("delegation not supported");
1401
+ }
1402
+ async admit(_, request) {
1381
1403
  (0, import_invariant4.invariant)(request.device, void 0, {
1382
1404
  F: __dxlog_file5,
1383
- L: 37,
1405
+ L: 42,
1384
1406
  S: this,
1385
1407
  A: [
1386
1408
  "request.device",
@@ -1426,7 +1448,7 @@ var DeviceInvitationProtocol = class {
1426
1448
  async accept(response, request) {
1427
1449
  (0, import_invariant4.invariant)(response.device, void 0, {
1428
1450
  F: __dxlog_file5,
1429
- L: 82,
1451
+ L: 87,
1430
1452
  S: this,
1431
1453
  A: [
1432
1454
  "response.device",
@@ -1436,7 +1458,7 @@ var DeviceInvitationProtocol = class {
1436
1458
  const { identityKey, haloSpaceKey, genesisFeedKey, controlTimeframe } = response.device;
1437
1459
  (0, import_invariant4.invariant)(request.device, void 0, {
1438
1460
  F: __dxlog_file5,
1439
- L: 85,
1461
+ L: 90,
1440
1462
  S: this,
1441
1463
  A: [
1442
1464
  "request.device",
@@ -1475,6 +1497,7 @@ var InvitationHostExtension = class extends import_teleport.RpcExtension {
1475
1497
  this._callbacks = _callbacks;
1476
1498
  this._ctx = new import_context5.Context();
1477
1499
  this._remoteOptionsTrigger = new import_async8.Trigger();
1500
+ this._challenge = void 0;
1478
1501
  this.invitation = void 0;
1479
1502
  this.guestProfile = void 0;
1480
1503
  this.authenticationPassed = false;
@@ -1489,7 +1512,7 @@ var InvitationHostExtension = class extends import_teleport.RpcExtension {
1489
1512
  options: async (options) => {
1490
1513
  (0, import_invariant6.invariant)(!this._remoteOptions, "Remote options already set.", {
1491
1514
  F: __dxlog_file6,
1492
- L: 87,
1515
+ L: 90,
1493
1516
  S: this,
1494
1517
  A: [
1495
1518
  "!this._remoteOptions",
@@ -1506,7 +1529,7 @@ var InvitationHostExtension = class extends import_teleport.RpcExtension {
1506
1529
  id: traceId
1507
1530
  }), {
1508
1531
  F: __dxlog_file6,
1509
- L: 96,
1532
+ L: 99,
1510
1533
  S: this,
1511
1534
  C: (f, a) => f(...a)
1512
1535
  });
@@ -1516,7 +1539,7 @@ var InvitationHostExtension = class extends import_teleport.RpcExtension {
1516
1539
  invitationId
1517
1540
  }, {
1518
1541
  F: __dxlog_file6,
1519
- L: 100,
1542
+ L: 103,
1520
1543
  S: this,
1521
1544
  C: (f, a) => f(...a)
1522
1545
  });
@@ -1530,7 +1553,7 @@ var InvitationHostExtension = class extends import_teleport.RpcExtension {
1530
1553
  guestProfile: profile
1531
1554
  }, {
1532
1555
  F: __dxlog_file6,
1533
- L: 109,
1556
+ L: 112,
1534
1557
  S: this,
1535
1558
  C: (f, a) => f(...a)
1536
1559
  });
@@ -1539,25 +1562,27 @@ var InvitationHostExtension = class extends import_teleport.RpcExtension {
1539
1562
  ...this.invitation,
1540
1563
  state: import_services4.Invitation.State.READY_FOR_AUTHENTICATION
1541
1564
  });
1565
+ this._challenge = this.invitation.authMethod === import_services4.Invitation.AuthMethod.KNOWN_PUBLIC_KEY ? (0, import_crypto2.randomBytes)(32) : void 0;
1542
1566
  import_log5.log.trace("dxos.sdk.invitation-handler.host.introduce", import_protocols5.trace.end({
1543
1567
  id: traceId
1544
1568
  }), {
1545
1569
  F: __dxlog_file6,
1546
- L: 116,
1570
+ L: 122,
1547
1571
  S: this,
1548
1572
  C: (f, a) => f(...a)
1549
1573
  });
1550
1574
  return {
1551
- authMethod: this.invitation.authMethod
1575
+ authMethod: this.invitation.authMethod,
1576
+ challenge: this._challenge
1552
1577
  };
1553
1578
  },
1554
- authenticate: async ({ authCode: code }) => {
1579
+ authenticate: async ({ authCode: code, signedChallenge }) => {
1555
1580
  const traceId = import_keys6.PublicKey.random().toHex();
1556
1581
  import_log5.log.trace("dxos.sdk.invitation-handler.host.authenticate", import_protocols5.trace.begin({
1557
1582
  id: traceId
1558
1583
  }), {
1559
1584
  F: __dxlog_file6,
1560
- L: 124,
1585
+ L: 131,
1561
1586
  S: this,
1562
1587
  C: (f, a) => f(...a)
1563
1588
  });
@@ -1565,14 +1590,14 @@ var InvitationHostExtension = class extends import_teleport.RpcExtension {
1565
1590
  authCode: code
1566
1591
  }, {
1567
1592
  F: __dxlog_file6,
1568
- L: 125,
1593
+ L: 132,
1569
1594
  S: this,
1570
1595
  C: (f, a) => f(...a)
1571
1596
  });
1572
1597
  let status = import_invitations2.AuthenticationResponse.Status.OK;
1573
1598
  (0, import_invariant6.invariant)(this.invitation, "Invitation is not set.", {
1574
1599
  F: __dxlog_file6,
1575
- L: 128,
1600
+ L: 135,
1576
1601
  S: this,
1577
1602
  A: [
1578
1603
  "this.invitation",
@@ -1583,7 +1608,7 @@ var InvitationHostExtension = class extends import_teleport.RpcExtension {
1583
1608
  case import_services4.Invitation.AuthMethod.NONE: {
1584
1609
  (0, import_log5.log)("authentication not required", void 0, {
1585
1610
  F: __dxlog_file6,
1586
- L: 131,
1611
+ L: 138,
1587
1612
  S: this,
1588
1613
  C: (f, a) => f(...a)
1589
1614
  });
@@ -1603,12 +1628,25 @@ var InvitationHostExtension = class extends import_teleport.RpcExtension {
1603
1628
  }
1604
1629
  break;
1605
1630
  }
1631
+ case import_services4.Invitation.AuthMethod.KNOWN_PUBLIC_KEY: {
1632
+ if (!this.invitation.guestKeypair) {
1633
+ status = import_invitations2.AuthenticationResponse.Status.INTERNAL_ERROR;
1634
+ break;
1635
+ }
1636
+ const isSignatureValid = this._challenge && (0, import_crypto2.verify)(this._challenge, Buffer.from(signedChallenge ?? []), this.invitation.guestKeypair.publicKey.asBuffer());
1637
+ if (isSignatureValid) {
1638
+ this.authenticationPassed = true;
1639
+ } else {
1640
+ status = import_invitations2.AuthenticationResponse.Status.INVALID_SIGNATURE;
1641
+ }
1642
+ break;
1643
+ }
1606
1644
  default: {
1607
1645
  import_log5.log.error("invalid authentication method", {
1608
1646
  authMethod: this.invitation.authMethod
1609
1647
  }, {
1610
1648
  F: __dxlog_file6,
1611
- L: 149,
1649
+ L: 176,
1612
1650
  S: this,
1613
1651
  C: (f, a) => f(...a)
1614
1652
  });
@@ -1623,7 +1661,7 @@ var InvitationHostExtension = class extends import_teleport.RpcExtension {
1623
1661
  }
1624
1662
  }), {
1625
1663
  F: __dxlog_file6,
1626
- L: 155,
1664
+ L: 182,
1627
1665
  S: this,
1628
1666
  C: (f, a) => f(...a)
1629
1667
  });
@@ -1637,14 +1675,14 @@ var InvitationHostExtension = class extends import_teleport.RpcExtension {
1637
1675
  id: traceId
1638
1676
  }), {
1639
1677
  F: __dxlog_file6,
1640
- L: 161,
1678
+ L: 188,
1641
1679
  S: this,
1642
1680
  C: (f, a) => f(...a)
1643
1681
  });
1644
1682
  try {
1645
1683
  (0, import_invariant6.invariant)(this.invitation, "Invitation is not set.", {
1646
1684
  F: __dxlog_file6,
1647
- L: 164,
1685
+ L: 191,
1648
1686
  S: this,
1649
1687
  A: [
1650
1688
  "this.invitation",
@@ -1659,7 +1697,7 @@ var InvitationHostExtension = class extends import_teleport.RpcExtension {
1659
1697
  id: traceId
1660
1698
  }), {
1661
1699
  F: __dxlog_file6,
1662
- L: 172,
1700
+ L: 199,
1663
1701
  S: this,
1664
1702
  C: (f, a) => f(...a)
1665
1703
  });
@@ -1716,7 +1754,7 @@ var InvitationGuestExtension = class extends import_teleport.RpcExtension {
1716
1754
  options: async (options) => {
1717
1755
  (0, import_invariant6.invariant)(!this._remoteOptions, "Remote options already set.", {
1718
1756
  F: __dxlog_file6,
1719
- L: 239,
1757
+ L: 266,
1720
1758
  S: this,
1721
1759
  A: [
1722
1760
  "!this._remoteOptions",
@@ -1743,7 +1781,7 @@ var InvitationGuestExtension = class extends import_teleport.RpcExtension {
1743
1781
  try {
1744
1782
  (0, import_log5.log)("begin options", void 0, {
1745
1783
  F: __dxlog_file6,
1746
- L: 260,
1784
+ L: 287,
1747
1785
  S: this,
1748
1786
  C: (f, a) => f(...a)
1749
1787
  });
@@ -1755,7 +1793,7 @@ var InvitationGuestExtension = class extends import_teleport.RpcExtension {
1755
1793
  }));
1756
1794
  (0, import_log5.log)("end options", void 0, {
1757
1795
  F: __dxlog_file6,
1758
- L: 263,
1796
+ L: 290,
1759
1797
  S: this,
1760
1798
  C: (f, a) => f(...a)
1761
1799
  });
@@ -1769,7 +1807,7 @@ var InvitationGuestExtension = class extends import_teleport.RpcExtension {
1769
1807
  } catch (err) {
1770
1808
  (0, import_log5.log)("openError", err, {
1771
1809
  F: __dxlog_file6,
1772
- L: 273,
1810
+ L: 300,
1773
1811
  S: this,
1774
1812
  C: (f, a) => f(...a)
1775
1813
  });
@@ -1779,7 +1817,7 @@ var InvitationGuestExtension = class extends import_teleport.RpcExtension {
1779
1817
  async onClose() {
1780
1818
  (0, import_log5.log)("onClose", void 0, {
1781
1819
  F: __dxlog_file6,
1782
- L: 279,
1820
+ L: 306,
1783
1821
  S: this,
1784
1822
  C: (f, a) => f(...a)
1785
1823
  });
@@ -1795,49 +1833,7 @@ var InvitationsHandler = class {
1795
1833
  constructor(_networkManager) {
1796
1834
  this._networkManager = _networkManager;
1797
1835
  }
1798
- createInvitation(protocol, options) {
1799
- const { invitationId = import_keys5.PublicKey.random().toHex(), type = import_services3.Invitation.Type.INTERACTIVE, authMethod = import_services3.Invitation.AuthMethod.SHARED_SECRET, state = import_services3.Invitation.State.INIT, timeout = import_client_protocol2.INVITATION_TIMEOUT, swarmKey = import_keys5.PublicKey.random(), persistent = true, created = /* @__PURE__ */ new Date(), lifetime = 86400 } = options ?? {};
1800
- const authCode = options?.authCode ?? (authMethod === import_services3.Invitation.AuthMethod.SHARED_SECRET ? (0, import_credentials7.generatePasscode)(import_client_protocol2.AUTHENTICATION_CODE_LENGTH) : void 0);
1801
- (0, import_invariant5.invariant)(protocol, void 0, {
1802
- F: __dxlog_file7,
1803
- L: 84,
1804
- S: this,
1805
- A: [
1806
- "protocol",
1807
- ""
1808
- ]
1809
- });
1810
- const invitation = {
1811
- invitationId,
1812
- type,
1813
- authMethod,
1814
- state,
1815
- swarmKey,
1816
- authCode,
1817
- timeout,
1818
- persistent,
1819
- created,
1820
- lifetime,
1821
- ...protocol.getInvitationContext()
1822
- };
1823
- const stream = new import_async7.PushStream();
1824
- const ctx = new import_context4.Context({
1825
- onError: (err) => {
1826
- stream.error(err);
1827
- void ctx.dispose();
1828
- }
1829
- });
1830
- ctx.onDispose(() => {
1831
- (0, import_log4.log)("complete", {
1832
- ...protocol.toJSON()
1833
- }, {
1834
- F: __dxlog_file7,
1835
- L: 109,
1836
- S: this,
1837
- C: (f, a) => f(...a)
1838
- });
1839
- stream.complete();
1840
- });
1836
+ handleInvitationFlow(ctx, stream, protocol, invitation) {
1841
1837
  const createExtension = () => {
1842
1838
  const extension = new InvitationHostExtension({
1843
1839
  onStateUpdate: (invitation2) => {
@@ -1846,8 +1842,8 @@ var InvitationsHandler = class {
1846
1842
  state: import_services3.Invitation.State.READY_FOR_AUTHENTICATION
1847
1843
  });
1848
1844
  },
1849
- resolveInvitation: async ({ invitationId: invitationId2 }) => {
1850
- if (invitationId2 && invitationId2 !== invitation.invitationId) {
1845
+ resolveInvitation: async ({ invitationId }) => {
1846
+ if (invitationId && invitationId !== invitation.invitationId) {
1851
1847
  return void 0;
1852
1848
  }
1853
1849
  return invitation;
@@ -1857,14 +1853,14 @@ var InvitationsHandler = class {
1857
1853
  const deviceKey = admissionRequest.device?.deviceKey ?? admissionRequest.space?.deviceKey;
1858
1854
  (0, import_invariant5.invariant)(deviceKey, void 0, {
1859
1855
  F: __dxlog_file7,
1860
- L: 130,
1856
+ L: 87,
1861
1857
  S: this,
1862
1858
  A: [
1863
1859
  "deviceKey",
1864
1860
  ""
1865
1861
  ]
1866
1862
  });
1867
- const admissionResponse = await protocol.admit(admissionRequest, extension.guestProfile);
1863
+ const admissionResponse = await protocol.admit(invitation, admissionRequest, extension.guestProfile);
1868
1864
  extension.completedTrigger.wake(deviceKey);
1869
1865
  return admissionResponse;
1870
1866
  } catch (err) {
@@ -1880,7 +1876,7 @@ var InvitationsHandler = class {
1880
1876
  id: traceId
1881
1877
  }), {
1882
1878
  F: __dxlog_file7,
1883
- L: 148,
1879
+ L: 105,
1884
1880
  S: this,
1885
1881
  C: (f, a) => f(...a)
1886
1882
  });
@@ -1888,7 +1884,7 @@ var InvitationsHandler = class {
1888
1884
  ...protocol.toJSON()
1889
1885
  }, {
1890
1886
  F: __dxlog_file7,
1891
- L: 149,
1887
+ L: 106,
1892
1888
  S: this,
1893
1889
  C: (f, a) => f(...a)
1894
1890
  });
@@ -1897,14 +1893,14 @@ var InvitationsHandler = class {
1897
1893
  state: import_services3.Invitation.State.CONNECTED
1898
1894
  });
1899
1895
  const deviceKey = await extension.completedTrigger.wait({
1900
- timeout
1896
+ timeout: invitation.timeout
1901
1897
  });
1902
1898
  (0, import_log4.log)("admitted guest", {
1903
1899
  guest: deviceKey,
1904
1900
  ...protocol.toJSON()
1905
1901
  }, {
1906
1902
  F: __dxlog_file7,
1907
- L: 152,
1903
+ L: 109,
1908
1904
  S: this,
1909
1905
  C: (f, a) => f(...a)
1910
1906
  });
@@ -1916,7 +1912,7 @@ var InvitationsHandler = class {
1916
1912
  id: traceId
1917
1913
  }), {
1918
1914
  F: __dxlog_file7,
1919
- L: 154,
1915
+ L: 111,
1920
1916
  S: this,
1921
1917
  C: (f, a) => f(...a)
1922
1918
  });
@@ -1926,7 +1922,7 @@ var InvitationsHandler = class {
1926
1922
  ...protocol.toJSON()
1927
1923
  }, {
1928
1924
  F: __dxlog_file7,
1929
- L: 157,
1925
+ L: 114,
1930
1926
  S: this,
1931
1927
  C: (f, a) => f(...a)
1932
1928
  });
@@ -1937,7 +1933,7 @@ var InvitationsHandler = class {
1937
1933
  } else {
1938
1934
  import_log4.log.error("failed", err, {
1939
1935
  F: __dxlog_file7,
1940
- L: 160,
1936
+ L: 117,
1941
1937
  S: this,
1942
1938
  C: (f, a) => f(...a)
1943
1939
  });
@@ -1948,12 +1944,12 @@ var InvitationsHandler = class {
1948
1944
  error: err
1949
1945
  }), {
1950
1946
  F: __dxlog_file7,
1951
- L: 163,
1947
+ L: 120,
1952
1948
  S: this,
1953
1949
  C: (f, a) => f(...a)
1954
1950
  });
1955
1951
  } finally {
1956
- if (type !== import_services3.Invitation.Type.MULTIUSE) {
1952
+ if (!invitation.multiUse) {
1957
1953
  await swarmConnection.close();
1958
1954
  await ctx.dispose();
1959
1955
  }
@@ -1969,7 +1965,7 @@ var InvitationsHandler = class {
1969
1965
  ...protocol.toJSON()
1970
1966
  }, {
1971
1967
  F: __dxlog_file7,
1972
- L: 178,
1968
+ L: 135,
1973
1969
  S: this,
1974
1970
  C: (f, a) => f(...a)
1975
1971
  });
@@ -1980,7 +1976,7 @@ var InvitationsHandler = class {
1980
1976
  } else {
1981
1977
  import_log4.log.error("failed", err, {
1982
1978
  F: __dxlog_file7,
1983
- L: 181,
1979
+ L: 138,
1984
1980
  S: this,
1985
1981
  C: (f, a) => f(...a)
1986
1982
  });
@@ -1990,11 +1986,11 @@ var InvitationsHandler = class {
1990
1986
  });
1991
1987
  return extension;
1992
1988
  };
1993
- if (invitation.lifetime && invitation.created && invitation.lifetime !== 0) {
1989
+ if (invitation.lifetime && invitation.created) {
1994
1990
  if (invitation.created.getTime() + invitation.lifetime * 1e3 < Date.now()) {
1995
1991
  import_log4.log.warn("invitation has already expired", void 0, {
1996
1992
  F: __dxlog_file7,
1997
- L: 192,
1993
+ L: 149,
1998
1994
  S: this,
1999
1995
  C: (f, a) => f(...a)
2000
1996
  });
@@ -2028,24 +2024,12 @@ var InvitationsHandler = class {
2028
2024
  state: import_services3.Invitation.State.CONNECTING
2029
2025
  });
2030
2026
  });
2031
- const observable = new import_client_protocol2.CancellableInvitation({
2032
- initialInvitation: invitation,
2033
- subscriber: stream.observable,
2034
- onCancel: async () => {
2035
- stream.next({
2036
- ...invitation,
2037
- state: import_services3.Invitation.State.CANCELLED
2038
- });
2039
- await ctx.dispose();
2040
- }
2041
- });
2042
- return observable;
2043
2027
  }
2044
2028
  acceptInvitation(protocol, invitation, deviceProfile) {
2045
2029
  const { timeout = import_client_protocol2.INVITATION_TIMEOUT } = invitation;
2046
2030
  (0, import_invariant5.invariant)(protocol, void 0, {
2047
2031
  F: __dxlog_file7,
2048
- L: 246,
2032
+ L: 191,
2049
2033
  S: this,
2050
2034
  A: [
2051
2035
  "protocol",
@@ -2055,7 +2039,7 @@ var InvitationsHandler = class {
2055
2039
  if (deviceProfile) {
2056
2040
  (0, import_invariant5.invariant)(invitation.kind === import_services3.Invitation.Kind.DEVICE, "deviceProfile provided for non-device invitation", {
2057
2041
  F: __dxlog_file7,
2058
- L: 250,
2042
+ L: 194,
2059
2043
  S: this,
2060
2044
  A: [
2061
2045
  "invitation.kind === Invitation.Kind.DEVICE",
@@ -2070,7 +2054,7 @@ var InvitationsHandler = class {
2070
2054
  const setState = (newData) => {
2071
2055
  (0, import_invariant5.invariant)(newData.state !== void 0, void 0, {
2072
2056
  F: __dxlog_file7,
2073
- L: 261,
2057
+ L: 205,
2074
2058
  S: this,
2075
2059
  A: [
2076
2060
  "newData.state !== undefined",
@@ -2090,7 +2074,7 @@ var InvitationsHandler = class {
2090
2074
  ...protocol.toJSON()
2091
2075
  }, {
2092
2076
  F: __dxlog_file7,
2093
- L: 269,
2077
+ L: 213,
2094
2078
  S: this,
2095
2079
  C: (f, a) => f(...a)
2096
2080
  });
@@ -2100,7 +2084,7 @@ var InvitationsHandler = class {
2100
2084
  } else {
2101
2085
  import_log4.log.warn("auth failed", err, {
2102
2086
  F: __dxlog_file7,
2103
- L: 272,
2087
+ L: 216,
2104
2088
  S: this,
2105
2089
  C: (f, a) => f(...a)
2106
2090
  });
@@ -2114,7 +2098,7 @@ var InvitationsHandler = class {
2114
2098
  ...protocol.toJSON()
2115
2099
  }, {
2116
2100
  F: __dxlog_file7,
2117
- L: 280,
2101
+ L: 224,
2118
2102
  S: this,
2119
2103
  C: (f, a) => f(...a)
2120
2104
  });
@@ -2129,7 +2113,7 @@ var InvitationsHandler = class {
2129
2113
  currentState
2130
2114
  }, {
2131
2115
  F: __dxlog_file7,
2132
- L: 290,
2116
+ L: 234,
2133
2117
  S: this,
2134
2118
  C: (f, a) => f(...a)
2135
2119
  });
@@ -2144,7 +2128,7 @@ var InvitationsHandler = class {
2144
2128
  id: traceId
2145
2129
  }), {
2146
2130
  F: __dxlog_file7,
2147
- L: 299,
2131
+ L: 243,
2148
2132
  S: this,
2149
2133
  C: (f, a) => f(...a)
2150
2134
  });
@@ -2156,7 +2140,7 @@ var InvitationsHandler = class {
2156
2140
  ...protocol.toJSON()
2157
2141
  }, {
2158
2142
  F: __dxlog_file7,
2159
- L: 307,
2143
+ L: 251,
2160
2144
  S: this,
2161
2145
  C: (f, a) => f(...a)
2162
2146
  });
@@ -2167,7 +2151,7 @@ var InvitationsHandler = class {
2167
2151
  ...protocol.toJSON()
2168
2152
  }, {
2169
2153
  F: __dxlog_file7,
2170
- L: 311,
2154
+ L: 255,
2171
2155
  S: this,
2172
2156
  C: (f, a) => f(...a)
2173
2157
  });
@@ -2177,62 +2161,28 @@ var InvitationsHandler = class {
2177
2161
  response: introductionResponse
2178
2162
  }, {
2179
2163
  F: __dxlog_file7,
2180
- L: 315,
2164
+ L: 259,
2181
2165
  S: this,
2182
2166
  C: (f, a) => f(...a)
2183
2167
  });
2184
2168
  invitation.authMethod = introductionResponse.authMethod;
2185
2169
  if (isAuthenticationRequired(invitation)) {
2186
- for (let attempt = 1; attempt <= MAX_OTP_ATTEMPTS; attempt++) {
2187
- (0, import_log4.log)("guest waiting for authentication code...", void 0, {
2188
- F: __dxlog_file7,
2189
- L: 321,
2190
- S: this,
2191
- C: (f, a) => f(...a)
2192
- });
2193
- setState({
2194
- state: import_services3.Invitation.State.READY_FOR_AUTHENTICATION
2195
- });
2196
- const authCode = await authenticated.wait({
2197
- timeout
2198
- });
2199
- (0, import_log4.log)("sending authentication request", void 0, {
2200
- F: __dxlog_file7,
2201
- L: 325,
2202
- S: this,
2203
- C: (f, a) => f(...a)
2204
- });
2205
- setState({
2206
- state: import_services3.Invitation.State.AUTHENTICATING
2207
- });
2208
- const response = await extension.rpc.InvitationHostService.authenticate({
2209
- authCode
2210
- });
2211
- if (response.status === void 0 || response.status === import_invitations.AuthenticationResponse.Status.OK) {
2170
+ switch (invitation.authMethod) {
2171
+ case import_services3.Invitation.AuthMethod.SHARED_SECRET:
2172
+ await this._handleGuestOtpAuth(extension, setState, authenticated, {
2173
+ timeout
2174
+ });
2175
+ break;
2176
+ case import_services3.Invitation.AuthMethod.KNOWN_PUBLIC_KEY:
2177
+ await this._handleGuestKpkAuth(extension, setState, invitation, introductionResponse);
2212
2178
  break;
2213
- }
2214
- if (response.status === import_invitations.AuthenticationResponse.Status.INVALID_OTP) {
2215
- if (attempt === MAX_OTP_ATTEMPTS) {
2216
- throw new Error(`Maximum retry attempts: ${MAX_OTP_ATTEMPTS}`);
2217
- } else {
2218
- (0, import_log4.log)("retrying invalid code", {
2219
- attempt
2220
- }, {
2221
- F: __dxlog_file7,
2222
- L: 336,
2223
- S: this,
2224
- C: (f, a) => f(...a)
2225
- });
2226
- authenticated.reset();
2227
- }
2228
- }
2229
2179
  }
2230
2180
  }
2231
2181
  (0, import_log4.log)("request admission", {
2232
2182
  ...protocol.toJSON()
2233
2183
  }, {
2234
2184
  F: __dxlog_file7,
2235
- L: 344,
2185
+ L: 275,
2236
2186
  S: this,
2237
2187
  C: (f, a) => f(...a)
2238
2188
  });
@@ -2244,7 +2194,7 @@ var InvitationsHandler = class {
2244
2194
  ...protocol.toJSON()
2245
2195
  }, {
2246
2196
  F: __dxlog_file7,
2247
- L: 355,
2197
+ L: 286,
2248
2198
  S: this,
2249
2199
  C: (f, a) => f(...a)
2250
2200
  });
@@ -2257,7 +2207,7 @@ var InvitationsHandler = class {
2257
2207
  id: traceId
2258
2208
  }), {
2259
2209
  F: __dxlog_file7,
2260
- L: 357,
2210
+ L: 288,
2261
2211
  S: this,
2262
2212
  C: (f, a) => f(...a)
2263
2213
  });
@@ -2267,7 +2217,7 @@ var InvitationsHandler = class {
2267
2217
  ...protocol.toJSON()
2268
2218
  }, {
2269
2219
  F: __dxlog_file7,
2270
- L: 360,
2220
+ L: 291,
2271
2221
  S: this,
2272
2222
  C: (f, a) => f(...a)
2273
2223
  });
@@ -2277,7 +2227,7 @@ var InvitationsHandler = class {
2277
2227
  } else {
2278
2228
  (0, import_log4.log)("auth failed", err, {
2279
2229
  F: __dxlog_file7,
2280
- L: 363,
2230
+ L: 294,
2281
2231
  S: this,
2282
2232
  C: (f, a) => f(...a)
2283
2233
  });
@@ -2288,7 +2238,7 @@ var InvitationsHandler = class {
2288
2238
  error: err
2289
2239
  }), {
2290
2240
  F: __dxlog_file7,
2291
- L: 366,
2241
+ L: 297,
2292
2242
  S: this,
2293
2243
  C: (f, a) => f(...a)
2294
2244
  });
@@ -2306,7 +2256,7 @@ var InvitationsHandler = class {
2306
2256
  ...protocol.toJSON()
2307
2257
  }, {
2308
2258
  F: __dxlog_file7,
2309
- L: 377,
2259
+ L: 308,
2310
2260
  S: this,
2311
2261
  C: (f, a) => f(...a)
2312
2262
  });
@@ -2316,7 +2266,7 @@ var InvitationsHandler = class {
2316
2266
  } else {
2317
2267
  (0, import_log4.log)("auth failed", err, {
2318
2268
  F: __dxlog_file7,
2319
- L: 380,
2269
+ L: 311,
2320
2270
  S: this,
2321
2271
  C: (f, a) => f(...a)
2322
2272
  });
@@ -2333,7 +2283,7 @@ var InvitationsHandler = class {
2333
2283
  } else {
2334
2284
  (0, import_invariant5.invariant)(invitation.swarmKey, void 0, {
2335
2285
  F: __dxlog_file7,
2336
- L: 394,
2286
+ L: 325,
2337
2287
  S: this,
2338
2288
  A: [
2339
2289
  "invitation.swarmKey",
@@ -2371,198 +2321,110 @@ var InvitationsHandler = class {
2371
2321
  });
2372
2322
  return observable;
2373
2323
  }
2324
+ async _handleGuestOtpAuth(extension, setState, authenticated, options) {
2325
+ for (let attempt = 1; attempt <= MAX_OTP_ATTEMPTS; attempt++) {
2326
+ (0, import_log4.log)("guest waiting for authentication code...", void 0, {
2327
+ F: __dxlog_file7,
2328
+ L: 365,
2329
+ S: this,
2330
+ C: (f, a) => f(...a)
2331
+ });
2332
+ setState({
2333
+ state: import_services3.Invitation.State.READY_FOR_AUTHENTICATION
2334
+ });
2335
+ const authCode = await authenticated.wait(options);
2336
+ (0, import_log4.log)("sending authentication request", void 0, {
2337
+ F: __dxlog_file7,
2338
+ L: 369,
2339
+ S: this,
2340
+ C: (f, a) => f(...a)
2341
+ });
2342
+ setState({
2343
+ state: import_services3.Invitation.State.AUTHENTICATING
2344
+ });
2345
+ const response = await extension.rpc.InvitationHostService.authenticate({
2346
+ authCode
2347
+ });
2348
+ if (response.status === void 0 || response.status === import_invitations.AuthenticationResponse.Status.OK) {
2349
+ break;
2350
+ }
2351
+ if (response.status === import_invitations.AuthenticationResponse.Status.INVALID_OTP) {
2352
+ if (attempt === MAX_OTP_ATTEMPTS) {
2353
+ throw new Error(`Maximum retry attempts: ${MAX_OTP_ATTEMPTS}`);
2354
+ } else {
2355
+ (0, import_log4.log)("retrying invalid code", {
2356
+ attempt
2357
+ }, {
2358
+ F: __dxlog_file7,
2359
+ L: 380,
2360
+ S: this,
2361
+ C: (f, a) => f(...a)
2362
+ });
2363
+ authenticated.reset();
2364
+ }
2365
+ }
2366
+ }
2367
+ }
2368
+ async _handleGuestKpkAuth(extension, setState, invitation, introductionResponse) {
2369
+ if (invitation.guestKeypair?.privateKey == null) {
2370
+ throw new Error("keypair missing in the invitation");
2371
+ }
2372
+ if (introductionResponse.challenge == null) {
2373
+ throw new Error("challenge missing in the introduction");
2374
+ }
2375
+ (0, import_log4.log)("sending authentication request", void 0, {
2376
+ F: __dxlog_file7,
2377
+ L: 399,
2378
+ S: this,
2379
+ C: (f, a) => f(...a)
2380
+ });
2381
+ setState({
2382
+ state: import_services3.Invitation.State.AUTHENTICATING
2383
+ });
2384
+ const signature = (0, import_crypto.sign)(Buffer.from(introductionResponse.challenge), invitation.guestKeypair.privateKey);
2385
+ const response = await extension.rpc.InvitationHostService.authenticate({
2386
+ signedChallenge: signature
2387
+ });
2388
+ if (response.status !== import_invitations.AuthenticationResponse.Status.OK) {
2389
+ throw new Error(`Authentication failed with code: ${response.status}`);
2390
+ }
2391
+ }
2374
2392
  };
2375
- var invitationExpired = (invitation) => {
2376
- return invitation.created && invitation.lifetime && invitation.lifetime !== 0 && invitation.created.getTime() + invitation.lifetime * 1e3 < Date.now();
2393
+ var createAdmissionKeypair = () => {
2394
+ const keypair = (0, import_crypto.createKeyPair)();
2395
+ return {
2396
+ publicKey: import_keys5.PublicKey.from(keypair.publicKey),
2397
+ privateKey: keypair.secretKey
2398
+ };
2377
2399
  };
2378
- var __dxlog_file8 = "/home/runner/work/dxos/dxos/packages/sdk/client-services/src/packlets/invitations/invitations-service.ts";
2379
2400
  var InvitationsServiceImpl = class {
2380
- constructor(_invitationsHandler, _getHandler, _metadataStore) {
2381
- this._invitationsHandler = _invitationsHandler;
2382
- this._getHandler = _getHandler;
2383
- this._metadataStore = _metadataStore;
2384
- this._createInvitations = /* @__PURE__ */ new Map();
2385
- this._acceptInvitations = /* @__PURE__ */ new Map();
2386
- this._invitationCreated = new import_async9.Event();
2387
- this._invitationAccepted = new import_async9.Event();
2388
- this._removedCreated = new import_async9.Event();
2389
- this._removedAccepted = new import_async9.Event();
2390
- this._saved = new import_async9.Event();
2391
- this._persistentInvitationsLoadedEvent = new import_async9.Event();
2392
- this._persistentInvitationsLoaded = false;
2401
+ constructor(_invitationsManager) {
2402
+ this._invitationsManager = _invitationsManager;
2393
2403
  }
2394
2404
  // TODO(burdon): Guest/host label.
2395
2405
  getLoggingContext() {
2396
2406
  return {};
2397
2407
  }
2398
2408
  createInvitation(options) {
2399
- let invitation;
2400
- const savePersistentInvitationCtx = new import_context6.Context();
2401
- const existingInvitation = this._createInvitations.get(options.invitationId);
2402
- if (existingInvitation) {
2403
- invitation = existingInvitation;
2404
- } else {
2405
- const handler = this._getHandler(options);
2406
- invitation = this._invitationsHandler.createInvitation(handler, options);
2407
- this._createInvitations.set(invitation.get().invitationId, invitation);
2408
- this._invitationCreated.emit(invitation.get());
2409
- }
2410
2409
  return new import_codec_protobuf8.Stream(({ next, close }) => {
2411
- if (invitation.get().persistent) {
2412
- (0, import_async9.scheduleTask)(savePersistentInvitationCtx, async () => {
2413
- try {
2414
- await this._metadataStore.addInvitation(invitation.get());
2415
- this._saved.emit(invitation.get());
2416
- } catch (err) {
2417
- close(err);
2418
- }
2419
- });
2420
- }
2421
- invitation.subscribe((invitation2) => {
2422
- next(invitation2);
2423
- }, async (err) => {
2424
- await savePersistentInvitationCtx.dispose();
2425
- close(err);
2426
- }, async () => {
2427
- close();
2428
- if (invitation.get().persistent) {
2429
- await savePersistentInvitationCtx.dispose();
2430
- await this._metadataStore.removeInvitation(invitation.get().invitationId);
2431
- }
2432
- this._createInvitations.delete(invitation.get().invitationId);
2433
- if (invitation.get().type !== import_services5.Invitation.Type.MULTIUSE) {
2434
- this._removedCreated.emit(invitation.get());
2435
- }
2436
- });
2410
+ void this._invitationsManager.createInvitation(options).then((invitation) => invitation.subscribe(next, close, close)).catch(close);
2437
2411
  });
2438
2412
  }
2439
- async loadPersistentInvitations() {
2440
- const persistentInvitations = this._metadataStore.getInvitations();
2441
- const freshInvitations = persistentInvitations.filter(async (invitation) => !invitationExpired(invitation));
2442
- const cInvitations = freshInvitations.map((persistentInvitation) => {
2443
- (0, import_invariant7.invariant)(!this._createInvitations.get(persistentInvitation.invitationId), "invitation already exists", {
2444
- F: __dxlog_file8,
2445
- L: 109,
2446
- S: this,
2447
- A: [
2448
- "!this._createInvitations.get(persistentInvitation.invitationId)",
2449
- "'invitation already exists'"
2450
- ]
2451
- });
2452
- const handler = this._getHandler(persistentInvitation);
2453
- const invitation = this._invitationsHandler.createInvitation(handler, persistentInvitation);
2454
- this._createInvitations.set(invitation.get().invitationId, invitation);
2455
- this._invitationCreated.emit(invitation.get());
2456
- return persistentInvitation;
2457
- });
2458
- this._persistentInvitationsLoadedEvent.emit();
2459
- this._persistentInvitationsLoaded = true;
2460
- return {
2461
- invitations: cInvitations
2462
- };
2463
- }
2464
- acceptInvitation({ invitation: options, deviceProfile }) {
2465
- let invitation;
2466
- if (deviceProfile) {
2467
- (0, import_invariant7.invariant)(options.kind === import_services5.Invitation.Kind.DEVICE, "deviceProfile provided for non-device invitation", {
2468
- F: __dxlog_file8,
2469
- L: 127,
2470
- S: this,
2471
- A: [
2472
- "options.kind === Invitation.Kind.DEVICE",
2473
- "'deviceProfile provided for non-device invitation'"
2474
- ]
2475
- });
2476
- }
2477
- const existingInvitation = this._acceptInvitations.get(options.invitationId);
2478
- if (existingInvitation) {
2479
- invitation = existingInvitation;
2480
- } else {
2481
- const handler = this._getHandler(options);
2482
- invitation = this._invitationsHandler.acceptInvitation(handler, options, deviceProfile);
2483
- this._acceptInvitations.set(invitation.get().invitationId, invitation);
2484
- this._invitationAccepted.emit(invitation.get());
2485
- }
2413
+ acceptInvitation(request) {
2414
+ const invitation = this._invitationsManager.acceptInvitation(request);
2486
2415
  return new import_codec_protobuf8.Stream(({ next, close }) => {
2487
- invitation.subscribe((invitation2) => {
2488
- next(invitation2);
2489
- }, (err) => {
2490
- close(err);
2491
- }, () => {
2492
- close();
2493
- this._acceptInvitations.delete(invitation.get().invitationId);
2494
- if (invitation.get().type !== import_services5.Invitation.Type.MULTIUSE) {
2495
- this._removedAccepted.emit(invitation.get());
2496
- }
2497
- });
2416
+ invitation.subscribe(next, close, close);
2498
2417
  });
2499
2418
  }
2500
- async authenticate({ invitationId, authCode }) {
2501
- (0, import_log6.log)("authenticating...", void 0, {
2502
- F: __dxlog_file8,
2503
- L: 160,
2504
- S: this,
2505
- C: (f, a) => f(...a)
2506
- });
2507
- (0, import_invariant7.invariant)(invitationId, void 0, {
2508
- F: __dxlog_file8,
2509
- L: 161,
2510
- S: this,
2511
- A: [
2512
- "invitationId",
2513
- ""
2514
- ]
2515
- });
2516
- const observable = this._acceptInvitations.get(invitationId);
2517
- if (!observable) {
2518
- import_log6.log.warn("invalid invitation", {
2519
- invitationId
2520
- }, {
2521
- F: __dxlog_file8,
2522
- L: 164,
2523
- S: this,
2524
- C: (f, a) => f(...a)
2525
- });
2526
- } else {
2527
- await observable.authenticate(authCode);
2528
- }
2419
+ async authenticate(request) {
2420
+ return this._invitationsManager.authenticate(request);
2529
2421
  }
2530
- async cancelInvitation({ invitationId }) {
2531
- (0, import_log6.log)("cancelInvitation...", {
2532
- invitationId
2533
- }, {
2534
- F: __dxlog_file8,
2535
- L: 171,
2536
- S: this,
2537
- C: (f, a) => f(...a)
2538
- });
2539
- (0, import_invariant7.invariant)(invitationId, void 0, {
2540
- F: __dxlog_file8,
2541
- L: 172,
2542
- S: this,
2543
- A: [
2544
- "invitationId",
2545
- ""
2546
- ]
2547
- });
2548
- const created = this._createInvitations.get(invitationId);
2549
- const accepted = this._acceptInvitations.get(invitationId);
2550
- if (created) {
2551
- await created.cancel();
2552
- this._createInvitations.delete(invitationId);
2553
- this._removedCreated.emit(created.get());
2554
- if (created.get().persistent) {
2555
- await this._metadataStore.removeInvitation(created.get().invitationId);
2556
- }
2557
- } else if (accepted) {
2558
- await accepted.cancel();
2559
- this._acceptInvitations.delete(invitationId);
2560
- this._removedAccepted.emit(accepted.get());
2561
- }
2422
+ async cancelInvitation(request) {
2423
+ return this._invitationsManager.cancelInvitation(request);
2562
2424
  }
2563
2425
  queryInvitations() {
2564
2426
  return new import_codec_protobuf8.Stream(({ next, ctx }) => {
2565
- this._invitationCreated.on(ctx, (invitation) => {
2427
+ this._invitationsManager.invitationCreated.on(ctx, (invitation) => {
2566
2428
  next({
2567
2429
  action: import_services5.QueryInvitationsResponse.Action.ADDED,
2568
2430
  type: import_services5.QueryInvitationsResponse.Type.CREATED,
@@ -2571,7 +2433,7 @@ var InvitationsServiceImpl = class {
2571
2433
  ]
2572
2434
  });
2573
2435
  });
2574
- this._invitationAccepted.on(ctx, (invitation) => {
2436
+ this._invitationsManager.invitationAccepted.on(ctx, (invitation) => {
2575
2437
  next({
2576
2438
  action: import_services5.QueryInvitationsResponse.Action.ADDED,
2577
2439
  type: import_services5.QueryInvitationsResponse.Type.ACCEPTED,
@@ -2580,7 +2442,7 @@ var InvitationsServiceImpl = class {
2580
2442
  ]
2581
2443
  });
2582
2444
  });
2583
- this._removedCreated.on(ctx, (invitation) => {
2445
+ this._invitationsManager.removedCreated.on(ctx, (invitation) => {
2584
2446
  next({
2585
2447
  action: import_services5.QueryInvitationsResponse.Action.REMOVED,
2586
2448
  type: import_services5.QueryInvitationsResponse.Type.CREATED,
@@ -2589,7 +2451,7 @@ var InvitationsServiceImpl = class {
2589
2451
  ]
2590
2452
  });
2591
2453
  });
2592
- this._removedAccepted.on(ctx, (invitation) => {
2454
+ this._invitationsManager.removedAccepted.on(ctx, (invitation) => {
2593
2455
  next({
2594
2456
  action: import_services5.QueryInvitationsResponse.Action.REMOVED,
2595
2457
  type: import_services5.QueryInvitationsResponse.Type.ACCEPTED,
@@ -2598,7 +2460,7 @@ var InvitationsServiceImpl = class {
2598
2460
  ]
2599
2461
  });
2600
2462
  });
2601
- this._saved.on(ctx, (invitation) => {
2463
+ this._invitationsManager.saved.on(ctx, (invitation) => {
2602
2464
  next({
2603
2465
  action: import_services5.QueryInvitationsResponse.Action.SAVED,
2604
2466
  type: import_services5.QueryInvitationsResponse.Type.CREATED,
@@ -2610,32 +2472,25 @@ var InvitationsServiceImpl = class {
2610
2472
  next({
2611
2473
  action: import_services5.QueryInvitationsResponse.Action.ADDED,
2612
2474
  type: import_services5.QueryInvitationsResponse.Type.CREATED,
2613
- invitations: Array.from(this._createInvitations.values()).map((invitation) => invitation.get()),
2475
+ invitations: this._invitationsManager.getCreatedInvitations(),
2614
2476
  existing: true
2615
2477
  });
2616
2478
  next({
2617
2479
  action: import_services5.QueryInvitationsResponse.Action.ADDED,
2618
2480
  type: import_services5.QueryInvitationsResponse.Type.ACCEPTED,
2619
- invitations: Array.from(this._acceptInvitations.values()).map((invitation) => invitation.get()),
2481
+ invitations: this._invitationsManager.getAcceptedInvitations(),
2620
2482
  existing: true
2621
2483
  });
2622
- if (this._persistentInvitationsLoaded) {
2484
+ this._invitationsManager.onPersistentInvitationsLoaded(ctx, () => {
2623
2485
  next({
2624
2486
  action: import_services5.QueryInvitationsResponse.Action.LOAD_COMPLETE,
2625
2487
  type: import_services5.QueryInvitationsResponse.Type.CREATED
2626
2488
  });
2627
- } else {
2628
- this._persistentInvitationsLoadedEvent.on(ctx, () => {
2629
- next({
2630
- action: import_services5.QueryInvitationsResponse.Action.LOAD_COMPLETE,
2631
- type: import_services5.QueryInvitationsResponse.Type.CREATED
2632
- });
2633
- });
2634
- }
2489
+ });
2635
2490
  });
2636
2491
  }
2637
2492
  };
2638
- var __dxlog_file9 = "/home/runner/work/dxos/dxos/packages/sdk/client-services/src/packlets/invitations/space-invitation-protocol.ts";
2493
+ var __dxlog_file8 = "/home/runner/work/dxos/dxos/packages/sdk/client-services/src/packlets/invitations/space-invitation-protocol.ts";
2639
2494
  var SpaceInvitationProtocol = class {
2640
2495
  constructor(_spaceManager, _signingContext, _keyring, _spaceKey) {
2641
2496
  this._spaceManager = _spaceManager;
@@ -2655,10 +2510,10 @@ var SpaceInvitationProtocol = class {
2655
2510
  spaceKey: this._spaceKey
2656
2511
  };
2657
2512
  }
2658
- async admit(request, guestProfile) {
2659
- (0, import_invariant8.invariant)(this._spaceKey, void 0, {
2660
- F: __dxlog_file9,
2661
- L: 47,
2513
+ async admit(invitation, request, guestProfile) {
2514
+ (0, import_invariant7.invariant)(this._spaceKey, void 0, {
2515
+ F: __dxlog_file8,
2516
+ L: 55,
2662
2517
  S: this,
2663
2518
  A: [
2664
2519
  "this._spaceKey",
@@ -2666,18 +2521,18 @@ var SpaceInvitationProtocol = class {
2666
2521
  ]
2667
2522
  });
2668
2523
  const space = await this._spaceManager.spaces.get(this._spaceKey);
2669
- (0, import_invariant8.invariant)(space, void 0, {
2670
- F: __dxlog_file9,
2671
- L: 49,
2524
+ (0, import_invariant7.invariant)(space, void 0, {
2525
+ F: __dxlog_file8,
2526
+ L: 57,
2672
2527
  S: this,
2673
2528
  A: [
2674
2529
  "space",
2675
2530
  ""
2676
2531
  ]
2677
2532
  });
2678
- (0, import_invariant8.invariant)(request.space, void 0, {
2679
- F: __dxlog_file9,
2680
- L: 51,
2533
+ (0, import_invariant7.invariant)(request.space, void 0, {
2534
+ F: __dxlog_file8,
2535
+ L: 59,
2681
2536
  S: this,
2682
2537
  A: [
2683
2538
  "request.space",
@@ -2685,19 +2540,19 @@ var SpaceInvitationProtocol = class {
2685
2540
  ]
2686
2541
  });
2687
2542
  const { identityKey, deviceKey } = request.space;
2688
- (0, import_log7.log)("writing guest credentials", {
2543
+ (0, import_log6.log)("writing guest credentials", {
2689
2544
  host: this._signingContext.deviceKey,
2690
2545
  guest: deviceKey
2691
2546
  }, {
2692
- F: __dxlog_file9,
2693
- L: 54,
2547
+ F: __dxlog_file8,
2548
+ L: 62,
2694
2549
  S: this,
2695
2550
  C: (f, a) => f(...a)
2696
2551
  });
2697
- const credentials = await (0, import_credentials8.createAdmissionCredentials)(this._signingContext.credentialSigner, identityKey, space.key, space.inner.genesisFeedKey, guestProfile);
2698
- (0, import_invariant8.invariant)(credentials[0].credential, void 0, {
2699
- F: __dxlog_file9,
2700
- L: 65,
2552
+ const credentials = await (0, import_credentials7.createAdmissionCredentials)(this._signingContext.credentialSigner, identityKey, space.key, space.inner.genesisFeedKey, guestProfile, invitation.delegationCredentialId);
2553
+ (0, import_invariant7.invariant)(credentials[0].credential, void 0, {
2554
+ F: __dxlog_file8,
2555
+ L: 74,
2701
2556
  S: this,
2702
2557
  A: [
2703
2558
  "credentials[0].credential",
@@ -2705,9 +2560,9 @@ var SpaceInvitationProtocol = class {
2705
2560
  ]
2706
2561
  });
2707
2562
  const spaceMemberCredential = credentials[0].credential.credential;
2708
- (0, import_invariant8.invariant)((0, import_credentials8.getCredentialAssertion)(spaceMemberCredential)["@type"] === "dxos.halo.credentials.SpaceMember", void 0, {
2709
- F: __dxlog_file9,
2710
- L: 67,
2563
+ (0, import_invariant7.invariant)((0, import_credentials7.getCredentialAssertion)(spaceMemberCredential)["@type"] === "dxos.halo.credentials.SpaceMember", void 0, {
2564
+ F: __dxlog_file8,
2565
+ L: 76,
2711
2566
  S: this,
2712
2567
  A: [
2713
2568
  "getCredentialAssertion(spaceMemberCredential)['@type'] === 'dxos.halo.credentials.SpaceMember'",
@@ -2722,6 +2577,69 @@ var SpaceInvitationProtocol = class {
2722
2577
  }
2723
2578
  };
2724
2579
  }
2580
+ async delegate(invitation) {
2581
+ (0, import_invariant7.invariant)(this._spaceKey, void 0, {
2582
+ F: __dxlog_file8,
2583
+ L: 89,
2584
+ S: this,
2585
+ A: [
2586
+ "this._spaceKey",
2587
+ ""
2588
+ ]
2589
+ });
2590
+ const space = await this._spaceManager.spaces.get(this._spaceKey);
2591
+ (0, import_invariant7.invariant)(space, void 0, {
2592
+ F: __dxlog_file8,
2593
+ L: 91,
2594
+ S: this,
2595
+ A: [
2596
+ "space",
2597
+ ""
2598
+ ]
2599
+ });
2600
+ if (invitation.authMethod === import_services6.Invitation.AuthMethod.KNOWN_PUBLIC_KEY) {
2601
+ (0, import_invariant7.invariant)(invitation.guestKeypair?.publicKey, void 0, {
2602
+ F: __dxlog_file8,
2603
+ L: 93,
2604
+ S: this,
2605
+ A: [
2606
+ "invitation.guestKeypair?.publicKey",
2607
+ ""
2608
+ ]
2609
+ });
2610
+ }
2611
+ (0, import_log6.log)("writing delegate space invitation", {
2612
+ host: this._signingContext.deviceKey,
2613
+ id: invitation.invitationId
2614
+ }, {
2615
+ F: __dxlog_file8,
2616
+ L: 96,
2617
+ S: this,
2618
+ C: (f, a) => f(...a)
2619
+ });
2620
+ const credential = await (0, import_credentials7.createDelegatedSpaceInvitationCredential)(this._signingContext.credentialSigner, space.key, {
2621
+ invitationId: invitation.invitationId,
2622
+ authMethod: invitation.authMethod,
2623
+ swarmKey: invitation.swarmKey,
2624
+ role: import_credentials8.SpaceMember.Role.ADMIN,
2625
+ expiresOn: invitation.lifetime ? new Date((invitation.created?.getTime() ?? Date.now()) + invitation.lifetime) : void 0,
2626
+ multiUse: invitation.multiUse ?? false,
2627
+ guestKey: invitation.authMethod === import_services6.Invitation.AuthMethod.KNOWN_PUBLIC_KEY ? invitation.guestKeypair.publicKey : void 0
2628
+ });
2629
+ (0, import_invariant7.invariant)(credential.credential, void 0, {
2630
+ F: __dxlog_file8,
2631
+ L: 116,
2632
+ S: this,
2633
+ A: [
2634
+ "credential.credential",
2635
+ ""
2636
+ ]
2637
+ });
2638
+ await (0, import_feed_store3.writeMessages)(space.inner.controlPipeline.writer, [
2639
+ credential
2640
+ ]);
2641
+ return credential.credential.credential.id;
2642
+ }
2725
2643
  checkInvitation(invitation) {
2726
2644
  if (invitation.spaceKey && this._spaceManager.spaces.has(invitation.spaceKey)) {
2727
2645
  return new import_protocols6.AlreadyJoinedError("Already joined space.");
@@ -2745,9 +2663,9 @@ var SpaceInvitationProtocol = class {
2745
2663
  };
2746
2664
  }
2747
2665
  async accept(response) {
2748
- (0, import_invariant8.invariant)(response.space, void 0, {
2749
- F: __dxlog_file9,
2750
- L: 107,
2666
+ (0, import_invariant7.invariant)(response.space, void 0, {
2667
+ F: __dxlog_file8,
2668
+ L: 149,
2751
2669
  S: this,
2752
2670
  A: [
2753
2671
  "response.space",
@@ -2755,19 +2673,19 @@ var SpaceInvitationProtocol = class {
2755
2673
  ]
2756
2674
  });
2757
2675
  const { credential, controlTimeframe, dataTimeframe } = response.space;
2758
- const assertion = (0, import_credentials8.getCredentialAssertion)(credential);
2759
- (0, import_invariant8.invariant)(assertion["@type"] === "dxos.halo.credentials.SpaceMember", "Invalid credential", {
2760
- F: __dxlog_file9,
2761
- L: 110,
2676
+ const assertion = (0, import_credentials7.getCredentialAssertion)(credential);
2677
+ (0, import_invariant7.invariant)(assertion["@type"] === "dxos.halo.credentials.SpaceMember", "Invalid credential", {
2678
+ F: __dxlog_file8,
2679
+ L: 152,
2762
2680
  S: this,
2763
2681
  A: [
2764
2682
  "assertion['@type'] === 'dxos.halo.credentials.SpaceMember'",
2765
2683
  "'Invalid credential'"
2766
2684
  ]
2767
2685
  });
2768
- (0, import_invariant8.invariant)(credential.subject.id.equals(this._signingContext.identityKey), void 0, {
2769
- F: __dxlog_file9,
2770
- L: 111,
2686
+ (0, import_invariant7.invariant)(credential.subject.id.equals(this._signingContext.identityKey), void 0, {
2687
+ F: __dxlog_file8,
2688
+ L: 153,
2771
2689
  S: this,
2772
2690
  A: [
2773
2691
  "credential.subject.id.equals(this._signingContext.identityKey)",
@@ -2789,6 +2707,284 @@ var SpaceInvitationProtocol = class {
2789
2707
  };
2790
2708
  }
2791
2709
  };
2710
+ var __dxlog_file9 = "/home/runner/work/dxos/dxos/packages/sdk/client-services/src/packlets/invitations/invitations-manager.ts";
2711
+ var InvitationsManager = class {
2712
+ constructor(_invitationsHandler, _getHandler, _metadataStore) {
2713
+ this._invitationsHandler = _invitationsHandler;
2714
+ this._getHandler = _getHandler;
2715
+ this._metadataStore = _metadataStore;
2716
+ this._createInvitations = /* @__PURE__ */ new Map();
2717
+ this._acceptInvitations = /* @__PURE__ */ new Map();
2718
+ this.invitationCreated = new import_async9.Event();
2719
+ this.invitationAccepted = new import_async9.Event();
2720
+ this.removedCreated = new import_async9.Event();
2721
+ this.removedAccepted = new import_async9.Event();
2722
+ this.saved = new import_async9.Event();
2723
+ this._persistentInvitationsLoadedEvent = new import_async9.Event();
2724
+ this._persistentInvitationsLoaded = false;
2725
+ }
2726
+ async createInvitation(options) {
2727
+ if (options.invitationId) {
2728
+ const existingInvitation = this._createInvitations.get(options.invitationId);
2729
+ if (existingInvitation) {
2730
+ return existingInvitation;
2731
+ }
2732
+ }
2733
+ const handler = this._getHandler(options);
2734
+ const invitation = this._createInvitation(handler, options);
2735
+ const { ctx, stream, observableInvitation } = this._createObservableInvitation(handler, invitation);
2736
+ this._createInvitations.set(invitation.invitationId, observableInvitation);
2737
+ this.invitationCreated.emit(invitation);
2738
+ this._onInvitationComplete(observableInvitation, async () => {
2739
+ this._createInvitations.delete(observableInvitation.get().invitationId);
2740
+ this.removedCreated.emit(observableInvitation.get());
2741
+ if (observableInvitation.get().persistent) {
2742
+ await this._safeDeleteInvitation(observableInvitation.get());
2743
+ }
2744
+ });
2745
+ try {
2746
+ await this._persistIfRequired(handler, stream, invitation);
2747
+ } catch (err) {
2748
+ import_log7.log.catch(err, void 0, {
2749
+ F: __dxlog_file9,
2750
+ L: 76,
2751
+ S: this,
2752
+ C: (f, a) => f(...a)
2753
+ });
2754
+ await observableInvitation.cancel();
2755
+ return observableInvitation;
2756
+ }
2757
+ this._invitationsHandler.handleInvitationFlow(ctx, stream, handler, observableInvitation.get());
2758
+ return observableInvitation;
2759
+ }
2760
+ async loadPersistentInvitations() {
2761
+ if (this._persistentInvitationsLoaded) {
2762
+ const invitations = this.getCreatedInvitations().filter((i) => i.persistent);
2763
+ return {
2764
+ invitations
2765
+ };
2766
+ }
2767
+ try {
2768
+ const persistentInvitations = this._metadataStore.getInvitations();
2769
+ const freshInvitations = persistentInvitations.filter((invitation) => !(0, import_echo_pipeline.hasInvitationExpired)(invitation));
2770
+ const loadTasks = freshInvitations.map((persistentInvitation) => {
2771
+ (0, import_invariant8.invariant)(!this._createInvitations.get(persistentInvitation.invitationId), "invitation already exists", {
2772
+ F: __dxlog_file9,
2773
+ L: 97,
2774
+ S: this,
2775
+ A: [
2776
+ "!this._createInvitations.get(persistentInvitation.invitationId)",
2777
+ "'invitation already exists'"
2778
+ ]
2779
+ });
2780
+ return this.createInvitation({
2781
+ ...persistentInvitation,
2782
+ persistent: false
2783
+ });
2784
+ });
2785
+ const cInvitations = await Promise.all(loadTasks);
2786
+ return {
2787
+ invitations: cInvitations.map((invitation) => invitation.get())
2788
+ };
2789
+ } catch (err) {
2790
+ import_log7.log.catch(err, void 0, {
2791
+ F: __dxlog_file9,
2792
+ L: 104,
2793
+ S: this,
2794
+ C: (f, a) => f(...a)
2795
+ });
2796
+ return {
2797
+ invitations: []
2798
+ };
2799
+ } finally {
2800
+ this._persistentInvitationsLoadedEvent.emit();
2801
+ this._persistentInvitationsLoaded = true;
2802
+ }
2803
+ }
2804
+ acceptInvitation(request) {
2805
+ const options = request.invitation;
2806
+ const existingInvitation = this._acceptInvitations.get(options.invitationId);
2807
+ if (existingInvitation) {
2808
+ return existingInvitation;
2809
+ }
2810
+ const handler = this._getHandler(options);
2811
+ const invitation = this._invitationsHandler.acceptInvitation(handler, options, request.deviceProfile);
2812
+ this._acceptInvitations.set(invitation.get().invitationId, invitation);
2813
+ this.invitationAccepted.emit(invitation.get());
2814
+ this._onInvitationComplete(invitation, () => {
2815
+ this._acceptInvitations.delete(invitation.get().invitationId);
2816
+ this.removedAccepted.emit(invitation.get());
2817
+ });
2818
+ return invitation;
2819
+ }
2820
+ async authenticate({ invitationId, authCode }) {
2821
+ (0, import_log7.log)("authenticating...", void 0, {
2822
+ F: __dxlog_file9,
2823
+ L: 133,
2824
+ S: this,
2825
+ C: (f, a) => f(...a)
2826
+ });
2827
+ (0, import_invariant8.invariant)(invitationId, void 0, {
2828
+ F: __dxlog_file9,
2829
+ L: 134,
2830
+ S: this,
2831
+ A: [
2832
+ "invitationId",
2833
+ ""
2834
+ ]
2835
+ });
2836
+ const observable = this._acceptInvitations.get(invitationId);
2837
+ if (!observable) {
2838
+ import_log7.log.warn("invalid invitation", {
2839
+ invitationId
2840
+ }, {
2841
+ F: __dxlog_file9,
2842
+ L: 137,
2843
+ S: this,
2844
+ C: (f, a) => f(...a)
2845
+ });
2846
+ } else {
2847
+ await observable.authenticate(authCode);
2848
+ }
2849
+ }
2850
+ async cancelInvitation({ invitationId }) {
2851
+ (0, import_log7.log)("cancelInvitation...", {
2852
+ invitationId
2853
+ }, {
2854
+ F: __dxlog_file9,
2855
+ L: 144,
2856
+ S: this,
2857
+ C: (f, a) => f(...a)
2858
+ });
2859
+ (0, import_invariant8.invariant)(invitationId, void 0, {
2860
+ F: __dxlog_file9,
2861
+ L: 145,
2862
+ S: this,
2863
+ A: [
2864
+ "invitationId",
2865
+ ""
2866
+ ]
2867
+ });
2868
+ const created = this._createInvitations.get(invitationId);
2869
+ if (created) {
2870
+ if (created.get().persistent) {
2871
+ await this._metadataStore.removeInvitation(invitationId);
2872
+ }
2873
+ await created.cancel();
2874
+ this._createInvitations.delete(invitationId);
2875
+ this.removedCreated.emit(created.get());
2876
+ return;
2877
+ }
2878
+ const accepted = this._acceptInvitations.get(invitationId);
2879
+ if (accepted) {
2880
+ await accepted.cancel();
2881
+ this._acceptInvitations.delete(invitationId);
2882
+ this.removedAccepted.emit(accepted.get());
2883
+ }
2884
+ }
2885
+ getCreatedInvitations() {
2886
+ return [
2887
+ ...this._createInvitations.values()
2888
+ ].map((i) => i.get());
2889
+ }
2890
+ getAcceptedInvitations() {
2891
+ return [
2892
+ ...this._acceptInvitations.values()
2893
+ ].map((i) => i.get());
2894
+ }
2895
+ onPersistentInvitationsLoaded(ctx, callback) {
2896
+ if (this._persistentInvitationsLoaded) {
2897
+ callback();
2898
+ } else {
2899
+ this._persistentInvitationsLoadedEvent.once(ctx, () => callback());
2900
+ }
2901
+ }
2902
+ _createInvitation(protocol, options) {
2903
+ const { invitationId = import_keys7.PublicKey.random().toHex(), type = import_services7.Invitation.Type.INTERACTIVE, authMethod = import_services7.Invitation.AuthMethod.SHARED_SECRET, state = import_services7.Invitation.State.INIT, timeout = import_client_protocol3.INVITATION_TIMEOUT, swarmKey = import_keys7.PublicKey.random(), persistent = options?.authMethod !== import_services7.Invitation.AuthMethod.KNOWN_PUBLIC_KEY, created = /* @__PURE__ */ new Date(), guestKeypair = void 0, lifetime = 86400, multiUse = false } = options ?? {};
2904
+ const authCode = options?.authCode ?? (authMethod === import_services7.Invitation.AuthMethod.SHARED_SECRET ? (0, import_credentials9.generatePasscode)(import_client_protocol3.AUTHENTICATION_CODE_LENGTH) : void 0);
2905
+ return {
2906
+ invitationId,
2907
+ type,
2908
+ authMethod,
2909
+ state,
2910
+ swarmKey,
2911
+ authCode,
2912
+ timeout,
2913
+ persistent: persistent && type !== import_services7.Invitation.Type.DELEGATED,
2914
+ guestKeypair: guestKeypair ?? (authMethod === import_services7.Invitation.AuthMethod.KNOWN_PUBLIC_KEY ? createAdmissionKeypair() : void 0),
2915
+ created,
2916
+ lifetime,
2917
+ multiUse,
2918
+ delegationCredentialId: options?.delegationCredentialId,
2919
+ ...protocol.getInvitationContext()
2920
+ };
2921
+ }
2922
+ _createObservableInvitation(handler, invitation) {
2923
+ const stream = new import_async9.PushStream();
2924
+ const ctx = new import_context6.Context({
2925
+ onError: (err) => {
2926
+ stream.error(err);
2927
+ void ctx.dispose();
2928
+ }
2929
+ });
2930
+ ctx.onDispose(() => {
2931
+ (0, import_log7.log)("complete", {
2932
+ ...handler.toJSON()
2933
+ }, {
2934
+ F: __dxlog_file9,
2935
+ L: 228,
2936
+ S: this,
2937
+ C: (f, a) => f(...a)
2938
+ });
2939
+ stream.complete();
2940
+ });
2941
+ const observableInvitation = new import_client_protocol3.CancellableInvitation({
2942
+ initialInvitation: invitation,
2943
+ subscriber: stream.observable,
2944
+ onCancel: async () => {
2945
+ stream.next({
2946
+ ...invitation,
2947
+ state: import_services7.Invitation.State.CANCELLED
2948
+ });
2949
+ await ctx.dispose();
2950
+ }
2951
+ });
2952
+ return {
2953
+ ctx,
2954
+ stream,
2955
+ observableInvitation
2956
+ };
2957
+ }
2958
+ async _persistIfRequired(handler, changeStream, invitation) {
2959
+ if (invitation.type === import_services7.Invitation.Type.DELEGATED && invitation.delegationCredentialId == null) {
2960
+ const delegationCredentialId = await handler.delegate(invitation);
2961
+ changeStream.next({
2962
+ ...invitation,
2963
+ delegationCredentialId
2964
+ });
2965
+ } else if (invitation.persistent) {
2966
+ await this._metadataStore.addInvitation(invitation);
2967
+ this.saved.emit(invitation);
2968
+ }
2969
+ }
2970
+ async _safeDeleteInvitation(invitation) {
2971
+ try {
2972
+ await this._metadataStore.removeInvitation(invitation.invitationId);
2973
+ } catch (err) {
2974
+ import_log7.log.catch(err, void 0, {
2975
+ F: __dxlog_file9,
2976
+ L: 260,
2977
+ S: this,
2978
+ C: (f, a) => f(...a)
2979
+ });
2980
+ }
2981
+ }
2982
+ _onInvitationComplete(invitation, callback) {
2983
+ invitation.subscribe(() => {
2984
+ }, () => {
2985
+ }, callback);
2986
+ }
2987
+ };
2792
2988
  function _ts_decorate3(decorators, target, key, desc) {
2793
2989
  var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
2794
2990
  if (typeof Reflect === "object" && typeof Reflect.decorate === "function")
@@ -2825,180 +3021,45 @@ var ClientRpcServer = class {
2825
3021
  this._callMetrics.inc(`${serviceName}.${methodName} request stream`);
2826
3022
  if (this._handleStream) {
2827
3023
  return import_codec_protobuf9.Stream.map(import_codec_protobuf9.Stream.unwrapPromise(this._handleStream(methodName, params2, handler)), (data) => {
2828
- this._callMetrics.inc(`${serviceName}.${methodName} response stream`);
2829
- return data;
2830
- });
2831
- } else {
2832
- return handler(methodName, params2);
2833
- }
2834
- }
2835
- });
2836
- }
2837
- get _services() {
2838
- return Object.keys(this._serviceRegistry.services);
2839
- }
2840
- async open() {
2841
- await this._rpcPeer.open();
2842
- }
2843
- async close() {
2844
- await this._rpcPeer.close();
2845
- }
2846
- _getServiceHandler(serviceName) {
2847
- if (!this._handlerCache.has(serviceName)) {
2848
- const [key, descriptor] = Object.entries(this._serviceRegistry.descriptors).find(([key2, descriptor2]) => descriptor2.name === serviceName) ?? (0, import_debug2.raise)(new Error(`Service not available: ${serviceName}`));
2849
- const service = this._serviceRegistry.services[key];
2850
- if (!service) {
2851
- throw new Error(`Service not available: ${serviceName}`);
2852
- }
2853
- this._handlerCache.set(serviceName, descriptor.createServer(service));
2854
- }
2855
- return this._handlerCache.get(serviceName);
2856
- }
2857
- };
2858
- _ts_decorate3([
2859
- import_tracing3.trace.metricsCounter()
2860
- ], ClientRpcServer.prototype, "_callMetrics", void 0);
2861
- _ts_decorate3([
2862
- import_tracing3.trace.info()
2863
- ], ClientRpcServer.prototype, "_services", null);
2864
- ClientRpcServer = _ts_decorate3([
2865
- import_tracing3.trace.resource()
2866
- ], ClientRpcServer);
2867
- var getPlatform = () => {
2868
- if (process.browser) {
2869
- if (typeof window !== "undefined") {
2870
- const { userAgent } = window.navigator;
2871
- return {
2872
- type: import_services8.Platform.PLATFORM_TYPE.BROWSER,
2873
- userAgent,
2874
- uptime: Math.floor((Date.now() - window.performance.timeOrigin) / 1e3)
2875
- };
2876
- } else {
2877
- return {
2878
- type: import_services8.Platform.PLATFORM_TYPE.SHARED_WORKER,
2879
- uptime: Math.floor((Date.now() - performance.timeOrigin) / 1e3)
2880
- };
2881
- }
2882
- } else {
2883
- const { platform: platform2, version, arch } = process;
2884
- return {
2885
- type: import_services8.Platform.PLATFORM_TYPE.NODE,
2886
- platform: platform2,
2887
- arch,
2888
- runtime: version,
2889
- uptime: Math.floor(process.uptime()),
2890
- memory: process.memoryUsage()
2891
- };
2892
- }
2893
- };
2894
- var DXOS_VERSION = "0.4.10-main.fd4f2a3";
2895
- var __dxlog_file10 = "/home/runner/work/dxos/dxos/packages/sdk/client-services/src/packlets/services/diagnostics.ts";
2896
- var DEFAULT_TIMEOUT = 1e3;
2897
- var createDiagnostics = async (clientServices, serviceContext, config) => {
2898
- const diagnostics = {
2899
- created: (/* @__PURE__ */ new Date()).toISOString(),
2900
- platform: getPlatform(),
2901
- client: {
2902
- version: DXOS_VERSION,
2903
- storage: {
2904
- version: import_protocols7.STORAGE_VERSION
2905
- }
2906
- },
2907
- trace: import_tracing4.TRACE_PROCESSOR.getDiagnostics()
2908
- };
2909
- {
2910
- (0, import_invariant9.invariant)(clientServices.LoggingService, "SystemService is not available.", {
2911
- F: __dxlog_file10,
2912
- L: 108,
2913
- S: void 0,
2914
- A: [
2915
- "clientServices.LoggingService",
2916
- "'SystemService is not available.'"
2917
- ]
2918
- });
2919
- diagnostics.metrics = await (0, import_codec_protobuf10.getFirstStreamValue)(clientServices.LoggingService.queryMetrics({}), {
2920
- timeout: DEFAULT_TIMEOUT
2921
- }).catch(() => void 0);
2922
- }
2923
- if (typeof navigator !== "undefined" && navigator.storage) {
2924
- const map = /* @__PURE__ */ new Map();
2925
- const dir = await navigator.storage.getDirectory();
2926
- for await (const filename of dir?.keys()) {
2927
- const idx = filename.indexOf("-", filename.indexOf("-") + 1);
2928
- if (idx === -1) {
2929
- continue;
2930
- }
2931
- map.set(filename.slice(0, idx), (map.get(filename.slice(0, idx)) ?? 0) + 1);
2932
- }
2933
- diagnostics.storage = Array.from(map.entries()).sort((a, b) => b[1] - a[1]).map(([file, count]) => ({
2934
- file,
2935
- count
2936
- }));
2937
- }
2938
- const identity = serviceContext.identityManager.identity;
2939
- if (identity) {
2940
- diagnostics.identity = {
2941
- identityKey: identity.identityKey,
2942
- spaceKey: identity.space.key,
2943
- profile: identity.profileDocument
2944
- };
2945
- const { devices } = await (0, import_codec_protobuf10.getFirstStreamValue)(clientServices.DevicesService.queryDevices(), {
2946
- timeout: DEFAULT_TIMEOUT
2947
- }).catch(() => void 0) ?? {};
2948
- diagnostics.devices = devices;
2949
- if (serviceContext.dataSpaceManager) {
2950
- diagnostics.spaces = await Promise.all(Array.from(serviceContext.dataSpaceManager.spaces.values()).map((space) => getSpaceStats(space)) ?? []);
2951
- }
2952
- const { feeds = [] } = await (0, import_codec_protobuf10.getFirstStreamValue)(clientServices.DevtoolsHost.subscribeToFeeds({}), {
2953
- timeout: DEFAULT_TIMEOUT
2954
- }).catch(() => void 0) ?? {};
2955
- diagnostics.feeds = feeds.map(({ feedKey, bytes, length }) => ({
2956
- feedKey,
2957
- bytes,
2958
- length
2959
- }));
2960
- const status = await (0, import_codec_protobuf10.getFirstStreamValue)(clientServices.NetworkService.queryStatus(), {
2961
- timeout: DEFAULT_TIMEOUT
2962
- }).catch(() => void 0);
2963
- diagnostics.networkStatus = status;
2964
- diagnostics.swarms = serviceContext.networkManager.connectionLog?.swarms;
2965
- }
2966
- diagnostics.config = config.values;
2967
- return diagnostics;
2968
- };
2969
- var getSpaceStats = async (space) => {
2970
- const stats = {
2971
- key: space.key,
2972
- metrics: space.metrics,
2973
- epochs: space.inner.spaceState.credentials.filter((0, import_credentials9.credentialTypeFilter)("dxos.halo.credentials.Epoch")).map((credential) => ({
2974
- ...credential.subject.assertion,
2975
- id: credential.id
2976
- })),
2977
- members: Array.from(space.inner.spaceState.members.values()).map((member) => ({
2978
- identity: {
2979
- identityKey: member.key,
2980
- profile: {
2981
- displayName: member.assertion.profile?.displayName
3024
+ this._callMetrics.inc(`${serviceName}.${methodName} response stream`);
3025
+ return data;
3026
+ });
3027
+ } else {
3028
+ return handler(methodName, params2);
2982
3029
  }
2983
- },
2984
- presence: space.presence.getPeersOnline().filter(({ identityKey }) => identityKey.equals(member.key)).length > 0 ? import_services7.SpaceMember.PresenceState.ONLINE : import_services7.SpaceMember.PresenceState.OFFLINE
2985
- })),
2986
- pipeline: {
2987
- // TODO(burdon): Pick properties from credentials if needed.
2988
- currentEpoch: space.automergeSpaceState.lastEpoch,
2989
- appliedEpoch: space.automergeSpaceState.lastEpoch,
2990
- controlFeeds: space.inner.controlPipeline.state.feeds.map((feed) => feed.key),
2991
- currentControlTimeframe: space.inner.controlPipeline.state.timeframe,
2992
- targetControlTimeframe: space.inner.controlPipeline.state.targetTimeframe,
2993
- totalControlTimeframe: space.inner.controlPipeline.state.endTimeframe
3030
+ }
3031
+ });
3032
+ }
3033
+ get _services() {
3034
+ return Object.keys(this._serviceRegistry.services);
3035
+ }
3036
+ async open() {
3037
+ await this._rpcPeer.open();
3038
+ }
3039
+ async close() {
3040
+ await this._rpcPeer.close();
3041
+ }
3042
+ _getServiceHandler(serviceName) {
3043
+ if (!this._handlerCache.has(serviceName)) {
3044
+ const [key, descriptor] = Object.entries(this._serviceRegistry.descriptors).find(([key2, descriptor2]) => descriptor2.name === serviceName) ?? (0, import_debug2.raise)(new Error(`Service not available: ${serviceName}`));
3045
+ const service = this._serviceRegistry.services[key];
3046
+ if (!service) {
3047
+ throw new Error(`Service not available: ${serviceName}`);
3048
+ }
3049
+ this._handlerCache.set(serviceName, descriptor.createServer(service));
2994
3050
  }
2995
- };
2996
- if (stats.metrics) {
2997
- const { open, ready } = stats.metrics;
2998
- stats.metrics.startupTime = open && ready && ready.getTime() - open.getTime();
3051
+ return this._handlerCache.get(serviceName);
2999
3052
  }
3000
- return stats;
3001
3053
  };
3054
+ _ts_decorate3([
3055
+ import_tracing3.trace.metricsCounter()
3056
+ ], ClientRpcServer.prototype, "_callMetrics", void 0);
3057
+ _ts_decorate3([
3058
+ import_tracing3.trace.info()
3059
+ ], ClientRpcServer.prototype, "_services", null);
3060
+ ClientRpcServer = _ts_decorate3([
3061
+ import_tracing3.trace.resource()
3062
+ ], ClientRpcServer);
3002
3063
  var AutomergeSpaceState = class {
3003
3064
  constructor(_onNewRoot) {
3004
3065
  this._onNewRoot = _onNewRoot;
@@ -3033,7 +3094,7 @@ var AutomergeSpaceState = class {
3033
3094
  await this.onNewEpoch.waitForCondition(() => !!this.lastEpoch);
3034
3095
  }
3035
3096
  };
3036
- var __dxlog_file11 = "/home/runner/work/dxos/dxos/packages/sdk/client-services/src/packlets/spaces/notarization-plugin.ts";
3097
+ var __dxlog_file10 = "/home/runner/work/dxos/dxos/packages/sdk/client-services/src/packlets/spaces/notarization-plugin.ts";
3037
3098
  var DEFAULT_RETRY_TIMEOUT = 1e3;
3038
3099
  var DEFAULT_SUCCESS_DELAY = 1e3;
3039
3100
  var DEFAULT_NOTARIZE_TIMEOUT = 1e4;
@@ -3043,8 +3104,8 @@ var NotarizationPlugin = class {
3043
3104
  this._ctx = new import_context8.Context();
3044
3105
  this._extensionOpened = new import_async12.Event();
3045
3106
  this._extensions = /* @__PURE__ */ new Set();
3046
- this._processedCredentials = new import_util5.ComplexSet(import_keys8.PublicKey.hash);
3047
- this._processCredentialsTriggers = new import_util5.ComplexMap(import_keys8.PublicKey.hash);
3107
+ this._processedCredentials = new import_util5.ComplexSet(import_keys9.PublicKey.hash);
3108
+ this._processCredentialsTriggers = new import_util5.ComplexMap(import_keys9.PublicKey.hash);
3048
3109
  }
3049
3110
  get hasWriter() {
3050
3111
  return !!this._writer;
@@ -3061,13 +3122,13 @@ var NotarizationPlugin = class {
3061
3122
  (0, import_log9.log)("notarize", {
3062
3123
  credentials
3063
3124
  }, {
3064
- F: __dxlog_file11,
3125
+ F: __dxlog_file10,
3065
3126
  L: 90,
3066
3127
  S: this,
3067
3128
  C: (f, a) => f(...a)
3068
3129
  });
3069
- (0, import_invariant11.invariant)(credentials.every((credential) => credential.id), "Credentials must have an id", {
3070
- F: __dxlog_file11,
3130
+ (0, import_invariant10.invariant)(credentials.every((credential) => credential.id), "Credentials must have an id", {
3131
+ F: __dxlog_file10,
3071
3132
  L: 91,
3072
3133
  S: this,
3073
3134
  A: [
@@ -3081,7 +3142,7 @@ var NotarizationPlugin = class {
3081
3142
  import_log9.log.warn("Notarization error", {
3082
3143
  err
3083
3144
  }, {
3084
- F: __dxlog_file11,
3145
+ F: __dxlog_file10,
3085
3146
  L: 99,
3086
3147
  S: this,
3087
3148
  C: (f, a) => f(...a)
@@ -3097,7 +3158,7 @@ var NotarizationPlugin = class {
3097
3158
  timeout,
3098
3159
  peers: Array.from(this._extensions).map((extension) => extension.remotePeerId)
3099
3160
  }, {
3100
- F: __dxlog_file11,
3161
+ F: __dxlog_file10,
3101
3162
  L: 111,
3102
3163
  S: this,
3103
3164
  C: (f, a) => f(...a)
@@ -3120,7 +3181,7 @@ var NotarizationPlugin = class {
3120
3181
  import_log9.log.info("Exhausted all peers to notarize with", {
3121
3182
  retryIn: retryTimeout
3122
3183
  }, {
3123
- F: __dxlog_file11,
3184
+ F: __dxlog_file10,
3124
3185
  L: 136,
3125
3186
  S: this,
3126
3187
  C: (f, a) => f(...a)
@@ -3134,7 +3195,7 @@ var NotarizationPlugin = class {
3134
3195
  peer: peer.localPeerId,
3135
3196
  credentialId: credentials.map((credential) => credential.id)
3136
3197
  }, {
3137
- F: __dxlog_file11,
3198
+ F: __dxlog_file10,
3138
3199
  L: 143,
3139
3200
  S: this,
3140
3201
  C: (f, a) => f(...a)
@@ -3143,7 +3204,7 @@ var NotarizationPlugin = class {
3143
3204
  credentials: credentials.filter((credential) => !this._processedCredentials.has(credential.id))
3144
3205
  });
3145
3206
  (0, import_log9.log)("success", void 0, {
3146
- F: __dxlog_file11,
3207
+ F: __dxlog_file10,
3147
3208
  L: 147,
3148
3209
  S: this,
3149
3210
  C: (f, a) => f(...a)
@@ -3152,7 +3213,7 @@ var NotarizationPlugin = class {
3152
3213
  } catch (err) {
3153
3214
  if (!ctx.disposed && !err.message.includes(WRITER_NOT_SET_ERROR_CODE)) {
3154
3215
  import_log9.log.info("error notarizing (recoverable)", err, {
3155
- F: __dxlog_file11,
3216
+ F: __dxlog_file10,
3156
3217
  L: 151,
3157
3218
  S: this,
3158
3219
  C: (f, a) => f(...a)
@@ -3170,7 +3231,7 @@ var NotarizationPlugin = class {
3170
3231
  errors.wait()
3171
3232
  ]);
3172
3233
  (0, import_log9.log)("done", void 0, {
3173
- F: __dxlog_file11,
3234
+ F: __dxlog_file10,
3174
3235
  L: 162,
3175
3236
  S: this,
3176
3237
  C: (f, a) => f(...a)
@@ -3191,8 +3252,8 @@ var NotarizationPlugin = class {
3191
3252
  this._processCredentialsTriggers.delete(credential.id);
3192
3253
  }
3193
3254
  setWriter(writer) {
3194
- (0, import_invariant11.invariant)(!this._writer, "Writer already set.", {
3195
- F: __dxlog_file11,
3255
+ (0, import_invariant10.invariant)(!this._writer, "Writer already set.", {
3256
+ F: __dxlog_file10,
3196
3257
  L: 181,
3197
3258
  S: this,
3198
3259
  A: [
@@ -3216,8 +3277,8 @@ var NotarizationPlugin = class {
3216
3277
  throw new Error(WRITER_NOT_SET_ERROR_CODE);
3217
3278
  }
3218
3279
  for (const credential of request.credentials ?? []) {
3219
- (0, import_invariant11.invariant)(credential.id, "Credential must have an id", {
3220
- F: __dxlog_file11,
3280
+ (0, import_invariant10.invariant)(credential.id, "Credential must have an id", {
3281
+ F: __dxlog_file10,
3221
3282
  L: 200,
3222
3283
  S: this,
3223
3284
  A: [
@@ -3237,7 +3298,7 @@ var NotarizationPlugin = class {
3237
3298
  (0, import_log9.log)("extension opened", {
3238
3299
  peer: extension.localPeerId
3239
3300
  }, {
3240
- F: __dxlog_file11,
3301
+ F: __dxlog_file10,
3241
3302
  L: 211,
3242
3303
  S: this,
3243
3304
  C: (f, a) => f(...a)
@@ -3249,7 +3310,7 @@ var NotarizationPlugin = class {
3249
3310
  (0, import_log9.log)("extension closed", {
3250
3311
  peer: extension.localPeerId
3251
3312
  }, {
3252
- F: __dxlog_file11,
3313
+ F: __dxlog_file10,
3253
3314
  L: 216,
3254
3315
  S: this,
3255
3316
  C: (f, a) => f(...a)
@@ -3265,10 +3326,10 @@ var NotarizationTeleportExtension = class extends import_teleport2.RpcExtension
3265
3326
  constructor(_params) {
3266
3327
  super({
3267
3328
  requested: {
3268
- NotarizationService: import_protocols9.schema.getService("dxos.mesh.teleport.notarization.NotarizationService")
3329
+ NotarizationService: import_protocols8.schema.getService("dxos.mesh.teleport.notarization.NotarizationService")
3269
3330
  },
3270
3331
  exposed: {
3271
- NotarizationService: import_protocols9.schema.getService("dxos.mesh.teleport.notarization.NotarizationService")
3332
+ NotarizationService: import_protocols8.schema.getService("dxos.mesh.teleport.notarization.NotarizationService")
3272
3333
  }
3273
3334
  });
3274
3335
  this._params = _params;
@@ -3301,14 +3362,14 @@ function _ts_decorate4(decorators, target, key, desc) {
3301
3362
  r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
3302
3363
  return c > 3 && r && Object.defineProperty(target, key, r), r;
3303
3364
  }
3304
- var __dxlog_file12 = "/home/runner/work/dxos/dxos/packages/sdk/client-services/src/packlets/spaces/data-space.ts";
3365
+ var __dxlog_file11 = "/home/runner/work/dxos/dxos/packages/sdk/client-services/src/packlets/spaces/data-space.ts";
3305
3366
  var DataSpace = class {
3306
3367
  constructor(params) {
3307
3368
  this._ctx = new import_context7.Context();
3308
3369
  this._notarizationPlugin = new NotarizationPlugin();
3309
3370
  this._cache = void 0;
3310
3371
  this._automergeSpaceState = new AutomergeSpaceState((rootUrl) => this._onNewAutomergeRoot(rootUrl));
3311
- this._state = import_services9.SpaceState.CLOSED;
3372
+ this._state = import_services8.SpaceState.CLOSED;
3312
3373
  this.error = void 0;
3313
3374
  this.stateUpdate = new import_async10.Event();
3314
3375
  this.metrics = {};
@@ -3323,16 +3384,16 @@ var DataSpace = class {
3323
3384
  this._callbacks = params.callbacks ?? {};
3324
3385
  this._automergeHost = params.automergeHost;
3325
3386
  this.authVerifier = new TrustedKeySetAuthVerifier({
3326
- trustedKeysProvider: () => new import_util4.ComplexSet(import_keys7.PublicKey.hash, Array.from(this._inner.spaceState.members.values()).filter((member) => !member.removed).map((member) => member.key)),
3387
+ trustedKeysProvider: () => new import_util4.ComplexSet(import_keys8.PublicKey.hash, Array.from(this._inner.spaceState.members.values()).filter((member) => !member.removed).map((member) => member.key)),
3327
3388
  update: this._inner.stateUpdate,
3328
- authTimeout: import_client_protocol3.AUTH_TIMEOUT
3389
+ authTimeout: import_client_protocol4.AUTH_TIMEOUT
3329
3390
  });
3330
3391
  this._cache = params.cache;
3331
3392
  this._state = params.initialState;
3332
3393
  (0, import_log8.log)("new state", {
3333
- state: import_services9.SpaceState[this._state]
3394
+ state: import_services8.SpaceState[this._state]
3334
3395
  }, {
3335
- F: __dxlog_file12,
3396
+ F: __dxlog_file11,
3336
3397
  L: 140,
3337
3398
  S: this,
3338
3399
  C: (f, a) => f(...a)
@@ -3378,11 +3439,11 @@ var DataSpace = class {
3378
3439
  await this._inner.spaceState.addCredentialProcessor(this._notarizationPlugin);
3379
3440
  await this._inner.spaceState.addCredentialProcessor(this._automergeSpaceState);
3380
3441
  await this._inner.open(new import_context7.Context());
3381
- this._state = import_services9.SpaceState.CONTROL_ONLY;
3442
+ this._state = import_services8.SpaceState.CONTROL_ONLY;
3382
3443
  (0, import_log8.log)("new state", {
3383
- state: import_services9.SpaceState[this._state]
3444
+ state: import_services8.SpaceState[this._state]
3384
3445
  }, {
3385
- F: __dxlog_file12,
3446
+ F: __dxlog_file11,
3386
3447
  L: 198,
3387
3448
  S: this,
3388
3449
  C: (f, a) => f(...a)
@@ -3396,11 +3457,11 @@ var DataSpace = class {
3396
3457
  }
3397
3458
  async _close() {
3398
3459
  await this._callbacks.beforeClose?.();
3399
- this._state = import_services9.SpaceState.CLOSED;
3460
+ this._state = import_services8.SpaceState.CLOSED;
3400
3461
  (0, import_log8.log)("new state", {
3401
- state: import_services9.SpaceState[this._state]
3462
+ state: import_services8.SpaceState[this._state]
3402
3463
  }, {
3403
- F: __dxlog_file12,
3464
+ F: __dxlog_file11,
3404
3465
  L: 212,
3405
3466
  S: this,
3406
3467
  C: (f, a) => f(...a)
@@ -3430,9 +3491,9 @@ var DataSpace = class {
3430
3491
  this.metrics.pipelineInitBegin = /* @__PURE__ */ new Date();
3431
3492
  await this.initializeDataPipeline();
3432
3493
  } catch (err) {
3433
- if (err instanceof import_protocols8.CancelledError || err instanceof import_context7.ContextDisposedError) {
3494
+ if (err instanceof import_protocols7.CancelledError || err instanceof import_context7.ContextDisposedError) {
3434
3495
  (0, import_log8.log)("data pipeline initialization cancelled", err, {
3435
- F: __dxlog_file12,
3496
+ F: __dxlog_file11,
3436
3497
  L: 245,
3437
3498
  S: this,
3438
3499
  C: (f, a) => f(...a)
@@ -3440,16 +3501,16 @@ var DataSpace = class {
3440
3501
  return;
3441
3502
  }
3442
3503
  import_log8.log.error("Error initializing data pipeline", err, {
3443
- F: __dxlog_file12,
3504
+ F: __dxlog_file11,
3444
3505
  L: 249,
3445
3506
  S: this,
3446
3507
  C: (f, a) => f(...a)
3447
3508
  });
3448
- this._state = import_services9.SpaceState.ERROR;
3509
+ this._state = import_services8.SpaceState.ERROR;
3449
3510
  (0, import_log8.log)("new state", {
3450
- state: import_services9.SpaceState[this._state]
3511
+ state: import_services8.SpaceState[this._state]
3451
3512
  }, {
3452
- F: __dxlog_file12,
3513
+ F: __dxlog_file11,
3453
3514
  L: 251,
3454
3515
  S: this,
3455
3516
  C: (f, a) => f(...a)
@@ -3462,14 +3523,14 @@ var DataSpace = class {
3462
3523
  });
3463
3524
  }
3464
3525
  async initializeDataPipeline() {
3465
- if (this._state !== import_services9.SpaceState.CONTROL_ONLY) {
3466
- throw new import_protocols8.SystemError("Invalid operation");
3526
+ if (this._state !== import_services8.SpaceState.CONTROL_ONLY) {
3527
+ throw new import_protocols7.SystemError("Invalid operation");
3467
3528
  }
3468
- this._state = import_services9.SpaceState.INITIALIZING;
3529
+ this._state = import_services8.SpaceState.INITIALIZING;
3469
3530
  (0, import_log8.log)("new state", {
3470
- state: import_services9.SpaceState[this._state]
3531
+ state: import_services8.SpaceState[this._state]
3471
3532
  }, {
3472
- F: __dxlog_file12,
3533
+ F: __dxlog_file11,
3473
3534
  L: 267,
3474
3535
  S: this,
3475
3536
  C: (f, a) => f(...a)
@@ -3479,17 +3540,17 @@ var DataSpace = class {
3479
3540
  this._automergeSpaceState.startProcessingRootDocs();
3480
3541
  await (0, import_context7.cancelWithContext)(this._ctx, this.automergeSpaceState.ensureEpochInitialized());
3481
3542
  (0, import_log8.log)("data pipeline ready", void 0, {
3482
- F: __dxlog_file12,
3543
+ F: __dxlog_file11,
3483
3544
  L: 279,
3484
3545
  S: this,
3485
3546
  C: (f, a) => f(...a)
3486
3547
  });
3487
3548
  await this._callbacks.beforeReady?.();
3488
- this._state = import_services9.SpaceState.READY;
3549
+ this._state = import_services8.SpaceState.READY;
3489
3550
  (0, import_log8.log)("new state", {
3490
- state: import_services9.SpaceState[this._state]
3551
+ state: import_services8.SpaceState[this._state]
3491
3552
  }, {
3492
- F: __dxlog_file12,
3553
+ F: __dxlog_file11,
3493
3554
  L: 283,
3494
3555
  S: this,
3495
3556
  C: (f, a) => f(...a)
@@ -3505,14 +3566,14 @@ var DataSpace = class {
3505
3566
  this.metrics.controlPipelineReady = /* @__PURE__ */ new Date();
3506
3567
  await this._createWritableFeeds();
3507
3568
  (0, import_log8.log)("writable feeds created", void 0, {
3508
- F: __dxlog_file12,
3569
+ F: __dxlog_file11,
3509
3570
  L: 299,
3510
3571
  S: this,
3511
3572
  C: (f, a) => f(...a)
3512
3573
  });
3513
3574
  this.stateUpdate.emit();
3514
3575
  if (!this.notarizationPlugin.hasWriter) {
3515
- this.notarizationPlugin.setWriter((0, import_echo_pipeline.createMappedFeedWriter)((credential) => ({
3576
+ this.notarizationPlugin.setWriter((0, import_echo_pipeline2.createMappedFeedWriter)((credential) => ({
3516
3577
  credential: {
3517
3578
  credential
3518
3579
  }
@@ -3568,7 +3629,7 @@ var DataSpace = class {
3568
3629
  space: this.key,
3569
3630
  rootUrl
3570
3631
  }, {
3571
- F: __dxlog_file12,
3632
+ F: __dxlog_file11,
3572
3633
  L: 365,
3573
3634
  S: this,
3574
3635
  C: (f, a) => f(...a)
@@ -3583,7 +3644,7 @@ var DataSpace = class {
3583
3644
  if (this._ctx.disposed) {
3584
3645
  return;
3585
3646
  }
3586
- const doc = handle.docSync() ?? (0, import_invariant10.failedInvariant)();
3647
+ const doc = handle.docSync() ?? (0, import_invariant9.failedInvariant)();
3587
3648
  if (!doc.access?.spaceKey) {
3588
3649
  handle.change((doc2) => {
3589
3650
  doc2.access = {
@@ -3600,7 +3661,7 @@ var DataSpace = class {
3600
3661
  rootUrl,
3601
3662
  err
3602
3663
  }, {
3603
- F: __dxlog_file12,
3664
+ F: __dxlog_file11,
3604
3665
  L: 388,
3605
3666
  S: this,
3606
3667
  C: (f, a) => f(...a)
@@ -3627,7 +3688,7 @@ var DataSpace = class {
3627
3688
  let epoch;
3628
3689
  switch (options?.migration) {
3629
3690
  case void 0:
3630
- case import_services9.CreateEpochRequest.Migration.NONE:
3691
+ case import_services8.CreateEpochRequest.Migration.NONE:
3631
3692
  {
3632
3693
  epoch = {
3633
3694
  previousId: this._automergeSpaceState.lastEpoch?.id,
@@ -3637,7 +3698,7 @@ var DataSpace = class {
3637
3698
  };
3638
3699
  }
3639
3700
  break;
3640
- case import_services9.CreateEpochRequest.Migration.INIT_AUTOMERGE:
3701
+ case import_services8.CreateEpochRequest.Migration.INIT_AUTOMERGE:
3641
3702
  {
3642
3703
  const document = this._automergeHost.repo.create();
3643
3704
  epoch = {
@@ -3648,14 +3709,14 @@ var DataSpace = class {
3648
3709
  };
3649
3710
  }
3650
3711
  break;
3651
- case import_services9.CreateEpochRequest.Migration.PRUNE_AUTOMERGE_ROOT_HISTORY:
3712
+ case import_services8.CreateEpochRequest.Migration.PRUNE_AUTOMERGE_ROOT_HISTORY:
3652
3713
  {
3653
3714
  const currentRootUrl = this._automergeSpaceState.rootUrl;
3654
3715
  const rootHandle = this._automergeHost.repo.find(currentRootUrl);
3655
3716
  await (0, import_context7.cancelWithContext)(this._ctx, (0, import_async10.asyncTimeout)(rootHandle.whenReady(), 1e4));
3656
3717
  const newRoot = this._automergeHost.repo.create(rootHandle.docSync());
3657
- (0, import_invariant10.invariant)(typeof newRoot.url === "string" && newRoot.url.length > 0, void 0, {
3658
- F: __dxlog_file12,
3718
+ (0, import_invariant9.invariant)(typeof newRoot.url === "string" && newRoot.url.length > 0, void 0, {
3719
+ F: __dxlog_file11,
3659
3720
  L: 438,
3660
3721
  S: this,
3661
3722
  A: [
@@ -3671,10 +3732,10 @@ var DataSpace = class {
3671
3732
  };
3672
3733
  }
3673
3734
  break;
3674
- case import_services9.CreateEpochRequest.Migration.FRAGMENT_AUTOMERGE_ROOT:
3735
+ case import_services8.CreateEpochRequest.Migration.FRAGMENT_AUTOMERGE_ROOT:
3675
3736
  {
3676
3737
  import_log8.log.info("Fragmenting", void 0, {
3677
- F: __dxlog_file12,
3738
+ F: __dxlog_file11,
3678
3739
  L: 450,
3679
3740
  S: this,
3680
3741
  C: (f, a) => f(...a)
@@ -3683,10 +3744,10 @@ var DataSpace = class {
3683
3744
  const rootHandle = this._automergeHost.repo.find(currentRootUrl);
3684
3745
  await (0, import_context7.cancelWithContext)(this._ctx, (0, import_async10.asyncTimeout)(rootHandle.whenReady(), 1e4));
3685
3746
  const objects = Object.entries(rootHandle.docSync().objects);
3686
- const properties = objects.find(([_, value]) => value.system.type?.itemId === import_echo_db.TYPE_PROPERTIES);
3747
+ const properties = objects.find(([_, value]) => value.system.type?.itemId === import_echo_schema.TYPE_PROPERTIES);
3687
3748
  const otherObjects = objects.filter(([key]) => key !== properties?.[0]);
3688
- (0, import_invariant10.invariant)(properties, "Properties not found", {
3689
- F: __dxlog_file12,
3749
+ (0, import_invariant9.invariant)(properties, "Properties not found", {
3750
+ F: __dxlog_file11,
3690
3751
  L: 460,
3691
3752
  S: this,
3692
3753
  A: [
@@ -3701,8 +3762,8 @@ var DataSpace = class {
3701
3762
  ])
3702
3763
  };
3703
3764
  const newRoot = this._automergeHost.repo.create(newSpaceDoc);
3704
- (0, import_invariant10.invariant)(typeof newRoot.url === "string" && newRoot.url.length > 0, void 0, {
3705
- F: __dxlog_file12,
3765
+ (0, import_invariant9.invariant)(typeof newRoot.url === "string" && newRoot.url.length > 0, void 0, {
3766
+ F: __dxlog_file11,
3706
3767
  L: 465,
3707
3768
  S: this,
3708
3769
  A: [
@@ -3710,7 +3771,7 @@ var DataSpace = class {
3710
3771
  ""
3711
3772
  ]
3712
3773
  });
3713
- const docLoader = new import_echo_pipeline2.AutomergeDocumentLoaderImpl(this.key, this._automergeHost.repo);
3774
+ const docLoader = new import_echo_pipeline3.AutomergeDocumentLoaderImpl(this.key, this._automergeHost.repo);
3714
3775
  await docLoader.loadSpaceRootDocHandle(this._ctx, {
3715
3776
  rootUrl: newRoot.url
3716
3777
  });
@@ -3754,24 +3815,24 @@ var DataSpace = class {
3754
3815
  ]));
3755
3816
  }
3756
3817
  async activate() {
3757
- if (this._state !== import_services9.SpaceState.INACTIVE) {
3818
+ if (this._state !== import_services8.SpaceState.INACTIVE) {
3758
3819
  return;
3759
3820
  }
3760
- await this._metadataStore.setSpaceState(this.key, import_services9.SpaceState.ACTIVE);
3821
+ await this._metadataStore.setSpaceState(this.key, import_services8.SpaceState.ACTIVE);
3761
3822
  await this._open();
3762
3823
  this.initializeDataPipelineAsync();
3763
3824
  }
3764
3825
  async deactivate() {
3765
- if (this._state === import_services9.SpaceState.INACTIVE) {
3826
+ if (this._state === import_services8.SpaceState.INACTIVE) {
3766
3827
  return;
3767
3828
  }
3768
- await this._metadataStore.setSpaceState(this.key, import_services9.SpaceState.INACTIVE);
3829
+ await this._metadataStore.setSpaceState(this.key, import_services8.SpaceState.INACTIVE);
3769
3830
  await this._close();
3770
- this._state = import_services9.SpaceState.INACTIVE;
3831
+ this._state = import_services8.SpaceState.INACTIVE;
3771
3832
  (0, import_log8.log)("new state", {
3772
- state: import_services9.SpaceState[this._state]
3833
+ state: import_services8.SpaceState[this._state]
3773
3834
  }, {
3774
- F: __dxlog_file12,
3835
+ F: __dxlog_file11,
3775
3836
  L: 531,
3776
3837
  S: this,
3777
3838
  C: (f, a) => f(...a)
@@ -3780,18 +3841,18 @@ var DataSpace = class {
3780
3841
  }
3781
3842
  };
3782
3843
  _ts_decorate4([
3783
- import_tracing5.trace.info()
3844
+ import_tracing4.trace.info()
3784
3845
  ], DataSpace.prototype, "_inner", void 0);
3785
3846
  _ts_decorate4([
3786
- import_tracing5.trace.info()
3847
+ import_tracing4.trace.info()
3787
3848
  ], DataSpace.prototype, "key", null);
3788
3849
  _ts_decorate4([
3789
- import_tracing5.trace.info({
3790
- enum: import_services9.SpaceState
3850
+ import_tracing4.trace.info({
3851
+ enum: import_services8.SpaceState
3791
3852
  })
3792
3853
  ], DataSpace.prototype, "state", null);
3793
3854
  _ts_decorate4([
3794
- import_tracing5.trace.info({
3855
+ import_tracing4.trace.info({
3795
3856
  depth: null
3796
3857
  })
3797
3858
  ], DataSpace.prototype, "_automergeInfo", null);
@@ -3802,12 +3863,12 @@ _ts_decorate4([
3802
3863
  import_async10.synchronized
3803
3864
  ], DataSpace.prototype, "close", null);
3804
3865
  _ts_decorate4([
3805
- import_tracing5.trace.span({
3866
+ import_tracing4.trace.span({
3806
3867
  showInBrowserTimeline: true
3807
3868
  })
3808
3869
  ], DataSpace.prototype, "initializeDataPipeline", null);
3809
3870
  _ts_decorate4([
3810
- import_tracing5.trace.span({
3871
+ import_tracing4.trace.span({
3811
3872
  showInBrowserTimeline: true
3812
3873
  })
3813
3874
  ], DataSpace.prototype, "_initializeAndReadControlPipeline", null);
@@ -3822,7 +3883,7 @@ _ts_decorate4([
3822
3883
  ], DataSpace.prototype, "deactivate", null);
3823
3884
  DataSpace = _ts_decorate4([
3824
3885
  (0, import_async10.trackLeaks)("open", "close"),
3825
- import_tracing5.trace.resource()
3886
+ import_tracing4.trace.resource()
3826
3887
  ], DataSpace);
3827
3888
  var spaceGenesis = async (keyring, signingContext, space, automergeRoot) => {
3828
3889
  const credentials = [
@@ -3898,22 +3959,23 @@ function _ts_decorate5(decorators, target, key, desc) {
3898
3959
  r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
3899
3960
  return c > 3 && r && Object.defineProperty(target, key, r), r;
3900
3961
  }
3901
- var __dxlog_file13 = "/home/runner/work/dxos/dxos/packages/sdk/client-services/src/packlets/spaces/data-space-manager.ts";
3962
+ var __dxlog_file12 = "/home/runner/work/dxos/dxos/packages/sdk/client-services/src/packlets/spaces/data-space-manager.ts";
3902
3963
  var PRESENCE_ANNOUNCE_INTERVAL = 1e4;
3903
3964
  var PRESENCE_OFFLINE_TIMEOUT = 2e4;
3904
3965
  var DataSpaceManager = class {
3905
- constructor(_spaceManager, _metadataStore, _keyring, _signingContext, _feedStore, _automergeHost, params) {
3966
+ constructor(_spaceManager, _metadataStore, _keyring, _signingContext, _feedStore, _automergeHost, _invitationsManager, params) {
3906
3967
  this._spaceManager = _spaceManager;
3907
3968
  this._metadataStore = _metadataStore;
3908
3969
  this._keyring = _keyring;
3909
3970
  this._signingContext = _signingContext;
3910
3971
  this._feedStore = _feedStore;
3911
3972
  this._automergeHost = _automergeHost;
3973
+ this._invitationsManager = _invitationsManager;
3912
3974
  this._ctx = new import_context9.Context();
3913
3975
  this.updated = new import_async13.Event();
3914
- this._spaces = new import_util6.ComplexMap(import_keys9.PublicKey.hash);
3976
+ this._spaces = new import_util6.ComplexMap(import_keys10.PublicKey.hash);
3915
3977
  this._isOpen = false;
3916
- this._instanceId = import_keys9.PublicKey.random().toHex();
3978
+ this._instanceId = import_keys10.PublicKey.random().toHex();
3917
3979
  const { spaceMemberPresenceAnnounceInterval = PRESENCE_ANNOUNCE_INTERVAL, spaceMemberPresenceOfflineTimeout = PRESENCE_OFFLINE_TIMEOUT } = params ?? {};
3918
3980
  this._spaceMemberPresenceAnnounceInterval = spaceMemberPresenceAnnounceInterval;
3919
3981
  this._spaceMemberPresenceOfflineTimeout = spaceMemberPresenceOfflineTimeout;
@@ -3924,24 +3986,24 @@ var DataSpaceManager = class {
3924
3986
  }
3925
3987
  async open() {
3926
3988
  (0, import_log10.log)("open", void 0, {
3927
- F: __dxlog_file13,
3928
- L: 98,
3989
+ F: __dxlog_file12,
3990
+ L: 101,
3929
3991
  S: this,
3930
3992
  C: (f, a) => f(...a)
3931
3993
  });
3932
- import_log10.log.trace("dxos.echo.data-space-manager.open", import_protocols10.trace.begin({
3994
+ import_log10.log.trace("dxos.echo.data-space-manager.open", import_protocols9.trace.begin({
3933
3995
  id: this._instanceId
3934
3996
  }), {
3935
- F: __dxlog_file13,
3936
- L: 99,
3997
+ F: __dxlog_file12,
3998
+ L: 102,
3937
3999
  S: this,
3938
4000
  C: (f, a) => f(...a)
3939
4001
  });
3940
4002
  (0, import_log10.log)("metadata loaded", {
3941
4003
  spaces: this._metadataStore.spaces.length
3942
4004
  }, {
3943
- F: __dxlog_file13,
3944
- L: 100,
4005
+ F: __dxlog_file12,
4006
+ L: 103,
3945
4007
  S: this,
3946
4008
  C: (f, a) => f(...a)
3947
4009
  });
@@ -3950,8 +4012,8 @@ var DataSpaceManager = class {
3950
4012
  (0, import_log10.log)("load space", {
3951
4013
  spaceMetadata
3952
4014
  }, {
3953
- F: __dxlog_file13,
3954
- L: 104,
4015
+ F: __dxlog_file12,
4016
+ L: 107,
3955
4017
  S: this,
3956
4018
  C: (f, a) => f(...a)
3957
4019
  });
@@ -3961,8 +4023,8 @@ var DataSpaceManager = class {
3961
4023
  spaceMetadata,
3962
4024
  err
3963
4025
  }, {
3964
- F: __dxlog_file13,
3965
- L: 107,
4026
+ F: __dxlog_file12,
4027
+ L: 110,
3966
4028
  S: this,
3967
4029
  C: (f, a) => f(...a)
3968
4030
  });
@@ -3971,23 +4033,23 @@ var DataSpaceManager = class {
3971
4033
  this._isOpen = true;
3972
4034
  this.updated.emit();
3973
4035
  for (const space of this._spaces.values()) {
3974
- if (space.state !== import_services10.SpaceState.INACTIVE) {
4036
+ if (space.state !== import_services9.SpaceState.INACTIVE) {
3975
4037
  space.initializeDataPipelineAsync();
3976
4038
  }
3977
4039
  }
3978
- import_log10.log.trace("dxos.echo.data-space-manager.open", import_protocols10.trace.end({
4040
+ import_log10.log.trace("dxos.echo.data-space-manager.open", import_protocols9.trace.end({
3979
4041
  id: this._instanceId
3980
4042
  }), {
3981
- F: __dxlog_file13,
3982
- L: 120,
4043
+ F: __dxlog_file12,
4044
+ L: 123,
3983
4045
  S: this,
3984
4046
  C: (f, a) => f(...a)
3985
4047
  });
3986
4048
  }
3987
4049
  async close() {
3988
4050
  (0, import_log10.log)("close", void 0, {
3989
- F: __dxlog_file13,
3990
- L: 125,
4051
+ F: __dxlog_file12,
4052
+ L: 128,
3991
4053
  S: this,
3992
4054
  C: (f, a) => f(...a)
3993
4055
  });
@@ -4001,9 +4063,9 @@ var DataSpaceManager = class {
4001
4063
  * Creates a new space writing the genesis credentials to the control feed.
4002
4064
  */
4003
4065
  async createSpace() {
4004
- (0, import_invariant12.invariant)(this._isOpen, "Not open.", {
4005
- F: __dxlog_file13,
4006
- L: 138,
4066
+ (0, import_invariant11.invariant)(this._isOpen, "Not open.", {
4067
+ F: __dxlog_file12,
4068
+ L: 141,
4007
4069
  S: this,
4008
4070
  A: [
4009
4071
  "this._isOpen",
@@ -4018,13 +4080,13 @@ var DataSpaceManager = class {
4018
4080
  genesisFeedKey: controlFeedKey,
4019
4081
  controlFeedKey,
4020
4082
  dataFeedKey,
4021
- state: import_services10.SpaceState.ACTIVE
4083
+ state: import_services9.SpaceState.ACTIVE
4022
4084
  };
4023
4085
  (0, import_log10.log)("creating space...", {
4024
4086
  spaceKey
4025
4087
  }, {
4026
- F: __dxlog_file13,
4027
- L: 150,
4088
+ F: __dxlog_file12,
4089
+ L: 153,
4028
4090
  S: this,
4029
4091
  C: (f, a) => f(...a)
4030
4092
  });
@@ -4038,9 +4100,9 @@ var DataSpaceManager = class {
4038
4100
  const credentials = await spaceGenesis(this._keyring, this._signingContext, space.inner, automergeRoot.url);
4039
4101
  await this._metadataStore.addSpace(metadata);
4040
4102
  const memberCredential = credentials[1];
4041
- (0, import_invariant12.invariant)((0, import_credentials12.getCredentialAssertion)(memberCredential)["@type"] === "dxos.halo.credentials.SpaceMember", void 0, {
4042
- F: __dxlog_file13,
4043
- L: 163,
4103
+ (0, import_invariant11.invariant)((0, import_credentials12.getCredentialAssertion)(memberCredential)["@type"] === "dxos.halo.credentials.SpaceMember", void 0, {
4104
+ F: __dxlog_file12,
4105
+ L: 166,
4044
4106
  S: this,
4045
4107
  A: [
4046
4108
  "getCredentialAssertion(memberCredential)['@type'] === 'dxos.halo.credentials.SpaceMember'",
@@ -4057,23 +4119,23 @@ var DataSpaceManager = class {
4057
4119
  (0, import_log10.log)("accept space", {
4058
4120
  opts
4059
4121
  }, {
4060
- F: __dxlog_file13,
4061
- L: 175,
4122
+ F: __dxlog_file12,
4123
+ L: 178,
4062
4124
  S: this,
4063
4125
  C: (f, a) => f(...a)
4064
4126
  });
4065
- (0, import_invariant12.invariant)(this._isOpen, "Not open.", {
4066
- F: __dxlog_file13,
4067
- L: 176,
4127
+ (0, import_invariant11.invariant)(this._isOpen, "Not open.", {
4128
+ F: __dxlog_file12,
4129
+ L: 179,
4068
4130
  S: this,
4069
4131
  A: [
4070
4132
  "this._isOpen",
4071
4133
  "'Not open.'"
4072
4134
  ]
4073
4135
  });
4074
- (0, import_invariant12.invariant)(!this._spaces.has(opts.spaceKey), "Space already exists.", {
4075
- F: __dxlog_file13,
4076
- L: 177,
4136
+ (0, import_invariant11.invariant)(!this._spaces.has(opts.spaceKey), "Space already exists.", {
4137
+ F: __dxlog_file12,
4138
+ L: 180,
4077
4139
  S: this,
4078
4140
  A: [
4079
4141
  "!this._spaces.has(opts.spaceKey)",
@@ -4100,15 +4162,15 @@ var DataSpaceManager = class {
4100
4162
  async waitUntilSpaceReady(spaceKey) {
4101
4163
  await (0, import_context9.cancelWithContext)(this._ctx, this.updated.waitForCondition(() => {
4102
4164
  const space = this._spaces.get(spaceKey);
4103
- return !!space && space.state === import_services10.SpaceState.READY;
4165
+ return !!space && space.state === import_services9.SpaceState.READY;
4104
4166
  }));
4105
4167
  }
4106
4168
  async _constructSpace(metadata) {
4107
4169
  (0, import_log10.log)("construct space", {
4108
4170
  metadata
4109
4171
  }, {
4110
- F: __dxlog_file13,
4111
- L: 210,
4172
+ F: __dxlog_file12,
4173
+ L: 213,
4112
4174
  S: this,
4113
4175
  C: (f, a) => f(...a)
4114
4176
  });
@@ -4145,19 +4207,22 @@ var DataSpaceManager = class {
4145
4207
  },
4146
4208
  onAuthFailure: () => {
4147
4209
  import_log10.log.warn("auth failure", void 0, {
4148
- F: __dxlog_file13,
4149
- L: 247,
4210
+ F: __dxlog_file12,
4211
+ L: 250,
4150
4212
  S: this,
4151
4213
  C: (f, a) => f(...a)
4152
4214
  });
4153
4215
  },
4154
- memberKey: this._signingContext.identityKey
4216
+ memberKey: this._signingContext.identityKey,
4217
+ onDelegatedInvitationStatusChange: (invitation, isActive) => {
4218
+ return this._handleInvitationStatusChange(dataSpace, invitation, isActive);
4219
+ }
4155
4220
  });
4156
4221
  controlFeed && await space.setControlFeed(controlFeed);
4157
4222
  dataFeed && await space.setDataFeed(dataFeed);
4158
4223
  const dataSpace = new DataSpace({
4159
4224
  inner: space,
4160
- initialState: metadata.state === import_services10.SpaceState.INACTIVE ? import_services10.SpaceState.INACTIVE : import_services10.SpaceState.CLOSED,
4225
+ initialState: metadata.state === import_services9.SpaceState.INACTIVE ? import_services9.SpaceState.INACTIVE : import_services9.SpaceState.CLOSED,
4161
4226
  metadataStore: this._metadataStore,
4162
4227
  gossip,
4163
4228
  presence,
@@ -4169,8 +4234,8 @@ var DataSpaceManager = class {
4169
4234
  (0, import_log10.log)("before space ready", {
4170
4235
  space: space.key
4171
4236
  }, {
4172
- F: __dxlog_file13,
4173
- L: 265,
4237
+ F: __dxlog_file12,
4238
+ L: 271,
4174
4239
  S: this,
4175
4240
  C: (f, a) => f(...a)
4176
4241
  });
@@ -4180,12 +4245,15 @@ var DataSpaceManager = class {
4180
4245
  space: space.key,
4181
4246
  open: this._isOpen
4182
4247
  }, {
4183
- F: __dxlog_file13,
4184
- L: 268,
4248
+ F: __dxlog_file12,
4249
+ L: 274,
4185
4250
  S: this,
4186
4251
  C: (f, a) => f(...a)
4187
4252
  });
4188
4253
  if (this._isOpen) {
4254
+ await this._createDelegatedInvitations(dataSpace, [
4255
+ ...space.spaceState.invitations.entries()
4256
+ ]);
4189
4257
  this.updated.emit();
4190
4258
  }
4191
4259
  },
@@ -4193,8 +4261,8 @@ var DataSpaceManager = class {
4193
4261
  (0, import_log10.log)("before space close", {
4194
4262
  space: space.key
4195
4263
  }, {
4196
- F: __dxlog_file13,
4197
- L: 274,
4264
+ F: __dxlog_file12,
4265
+ L: 281,
4198
4266
  S: this,
4199
4267
  C: (f, a) => f(...a)
4200
4268
  });
@@ -4203,7 +4271,7 @@ var DataSpaceManager = class {
4203
4271
  cache: metadata.cache,
4204
4272
  automergeHost: this._automergeHost
4205
4273
  });
4206
- if (metadata.state !== import_services10.SpaceState.INACTIVE) {
4274
+ if (metadata.state !== import_services9.SpaceState.INACTIVE) {
4207
4275
  await dataSpace.open();
4208
4276
  }
4209
4277
  if (metadata.controlTimeframe) {
@@ -4212,6 +4280,41 @@ var DataSpaceManager = class {
4212
4280
  this._spaces.set(metadata.key, dataSpace);
4213
4281
  return dataSpace;
4214
4282
  }
4283
+ async _handleInvitationStatusChange(dataSpace, delegatedInvitation, isActive) {
4284
+ if (dataSpace?.state !== import_services9.SpaceState.READY) {
4285
+ return;
4286
+ }
4287
+ if (isActive) {
4288
+ await this._createDelegatedInvitations(dataSpace, [
4289
+ [
4290
+ delegatedInvitation.credentialId,
4291
+ delegatedInvitation.invitation
4292
+ ]
4293
+ ]);
4294
+ } else {
4295
+ await this._invitationsManager.cancelInvitation(delegatedInvitation.invitation);
4296
+ }
4297
+ }
4298
+ async _createDelegatedInvitations(space, invitations) {
4299
+ const tasks = invitations.map(([credentialId, invitation]) => {
4300
+ return this._invitationsManager.createInvitation({
4301
+ type: import_services9.Invitation.Type.DELEGATED,
4302
+ kind: import_services9.Invitation.Kind.SPACE,
4303
+ spaceKey: space.key,
4304
+ authMethod: invitation.authMethod,
4305
+ invitationId: invitation.invitationId,
4306
+ swarmKey: invitation.swarmKey,
4307
+ guestKeypair: invitation.guestKey ? {
4308
+ publicKey: invitation.guestKey
4309
+ } : void 0,
4310
+ lifetime: invitation.expiresOn ? invitation.expiresOn.getTime() - Date.now() : void 0,
4311
+ multiUse: invitation.multiUse,
4312
+ delegationCredentialId: credentialId,
4313
+ persistent: false
4314
+ });
4315
+ });
4316
+ await Promise.all(tasks);
4317
+ }
4215
4318
  };
4216
4319
  _ts_decorate5([
4217
4320
  import_async13.synchronized
@@ -4228,7 +4331,7 @@ _ts_decorate5([
4228
4331
  DataSpaceManager = _ts_decorate5([
4229
4332
  (0, import_async13.trackLeaks)("open", "close")
4230
4333
  ], DataSpaceManager);
4231
- var __dxlog_file14 = "/home/runner/work/dxos/dxos/packages/sdk/client-services/src/packlets/spaces/spaces-service.ts";
4334
+ var __dxlog_file13 = "/home/runner/work/dxos/dxos/packages/sdk/client-services/src/packlets/spaces/spaces-service.ts";
4232
4335
  var SpacesServiceImpl = class {
4233
4336
  constructor(_identityManager, _spaceManager, _getDataSpaceManager) {
4234
4337
  this._identityManager = _identityManager;
@@ -4245,29 +4348,29 @@ var SpacesServiceImpl = class {
4245
4348
  }
4246
4349
  async updateSpace({ spaceKey, state }) {
4247
4350
  const dataSpaceManager = await this._getDataSpaceManager();
4248
- const space = dataSpaceManager.spaces.get(spaceKey) ?? (0, import_debug5.raise)(new import_protocols11.SpaceNotFoundError(spaceKey));
4351
+ const space = dataSpaceManager.spaces.get(spaceKey) ?? (0, import_debug5.raise)(new import_protocols10.SpaceNotFoundError(spaceKey));
4249
4352
  if (state) {
4250
4353
  switch (state) {
4251
- case import_services11.SpaceState.ACTIVE:
4354
+ case import_services10.SpaceState.ACTIVE:
4252
4355
  await space.activate();
4253
4356
  break;
4254
- case import_services11.SpaceState.INACTIVE:
4357
+ case import_services10.SpaceState.INACTIVE:
4255
4358
  await space.deactivate();
4256
4359
  break;
4257
4360
  default:
4258
- throw new import_protocols11.ApiError("Invalid space state");
4361
+ throw new import_protocols10.ApiError("Invalid space state");
4259
4362
  }
4260
4363
  }
4261
4364
  }
4262
4365
  querySpaces() {
4263
- return new import_codec_protobuf11.Stream(({ next, ctx }) => {
4366
+ return new import_codec_protobuf10.Stream(({ next, ctx }) => {
4264
4367
  const scheduler = new import_async14.UpdateScheduler(ctx, async () => {
4265
4368
  const dataSpaceManager = await this._getDataSpaceManager();
4266
4369
  const spaces = Array.from(dataSpaceManager.spaces.values()).map((space) => this._serializeSpace(space));
4267
4370
  (0, import_log11.log)("update", {
4268
4371
  spaces
4269
4372
  }, {
4270
- F: __dxlog_file14,
4373
+ F: __dxlog_file13,
4271
4374
  L: 77,
4272
4375
  S: this,
4273
4376
  C: (f, a) => f(...a)
@@ -4307,14 +4410,14 @@ var SpacesServiceImpl = class {
4307
4410
  }
4308
4411
  async postMessage({ spaceKey, channel, message }) {
4309
4412
  const dataSpaceManager = await this._getDataSpaceManager();
4310
- const space = dataSpaceManager.spaces.get(spaceKey) ?? (0, import_debug5.raise)(new import_protocols11.SpaceNotFoundError(spaceKey));
4413
+ const space = dataSpaceManager.spaces.get(spaceKey) ?? (0, import_debug5.raise)(new import_protocols10.SpaceNotFoundError(spaceKey));
4311
4414
  await space.postMessage(getChannelId(channel), message);
4312
4415
  }
4313
4416
  subscribeMessages({ spaceKey, channel }) {
4314
- return new import_codec_protobuf11.Stream(({ ctx, next }) => {
4417
+ return new import_codec_protobuf10.Stream(({ ctx, next }) => {
4315
4418
  (0, import_async14.scheduleTask)(ctx, async () => {
4316
4419
  const dataSpaceManager = await this._getDataSpaceManager();
4317
- const space = dataSpaceManager.spaces.get(spaceKey) ?? (0, import_debug5.raise)(new import_protocols11.SpaceNotFoundError(spaceKey));
4420
+ const space = dataSpaceManager.spaces.get(spaceKey) ?? (0, import_debug5.raise)(new import_protocols10.SpaceNotFoundError(spaceKey));
4318
4421
  const handle = space.listen(getChannelId(channel), (message) => {
4319
4422
  next(message);
4320
4423
  });
@@ -4323,8 +4426,8 @@ var SpacesServiceImpl = class {
4323
4426
  });
4324
4427
  }
4325
4428
  queryCredentials({ spaceKey, noTail }) {
4326
- return new import_codec_protobuf11.Stream(({ ctx, next, close }) => {
4327
- const space = this._spaceManager.spaces.get(spaceKey) ?? (0, import_debug5.raise)(new import_protocols11.SpaceNotFoundError(spaceKey));
4429
+ return new import_codec_protobuf10.Stream(({ ctx, next, close }) => {
4430
+ const space = this._spaceManager.spaces.get(spaceKey) ?? (0, import_debug5.raise)(new import_protocols10.SpaceNotFoundError(spaceKey));
4328
4431
  const processor = {
4329
4432
  processCredential: async (credential) => {
4330
4433
  next(credential);
@@ -4340,7 +4443,7 @@ var SpacesServiceImpl = class {
4340
4443
  });
4341
4444
  }
4342
4445
  async writeCredentials({ spaceKey, credentials }) {
4343
- const space = this._spaceManager.spaces.get(spaceKey) ?? (0, import_debug5.raise)(new import_protocols11.SpaceNotFoundError(spaceKey));
4446
+ const space = this._spaceManager.spaces.get(spaceKey) ?? (0, import_debug5.raise)(new import_protocols10.SpaceNotFoundError(spaceKey));
4344
4447
  for (const credential of credentials ?? []) {
4345
4448
  if (credential.proof) {
4346
4449
  await space.controlPipeline.writer.write({
@@ -4349,8 +4452,8 @@ var SpacesServiceImpl = class {
4349
4452
  }
4350
4453
  });
4351
4454
  } else {
4352
- (0, import_invariant13.invariant)(!credential.id, "Id on unsigned credentials is not allowed", {
4353
- F: __dxlog_file14,
4455
+ (0, import_invariant12.invariant)(!credential.id, "Id on unsigned credentials is not allowed", {
4456
+ F: __dxlog_file13,
4354
4457
  L: 164,
4355
4458
  S: this,
4356
4459
  A: [
@@ -4358,8 +4461,8 @@ var SpacesServiceImpl = class {
4358
4461
  "'Id on unsigned credentials is not allowed'"
4359
4462
  ]
4360
4463
  });
4361
- (0, import_invariant13.invariant)(this._identityManager.identity, "Identity is not available", {
4362
- F: __dxlog_file14,
4464
+ (0, import_invariant12.invariant)(this._identityManager.identity, "Identity is not available", {
4465
+ F: __dxlog_file13,
4363
4466
  L: 165,
4364
4467
  S: this,
4365
4468
  A: [
@@ -4368,8 +4471,8 @@ var SpacesServiceImpl = class {
4368
4471
  ]
4369
4472
  });
4370
4473
  const signer = this._identityManager.identity.getIdentityCredentialSigner();
4371
- (0, import_invariant13.invariant)(credential.issuer.equals(signer.getIssuer()), void 0, {
4372
- F: __dxlog_file14,
4474
+ (0, import_invariant12.invariant)(credential.issuer.equals(signer.getIssuer()), void 0, {
4475
+ F: __dxlog_file13,
4373
4476
  L: 167,
4374
4477
  S: this,
4375
4478
  A: [
@@ -4391,7 +4494,7 @@ var SpacesServiceImpl = class {
4391
4494
  }
4392
4495
  async createEpoch({ spaceKey, migration }) {
4393
4496
  const dataSpaceManager = await this._getDataSpaceManager();
4394
- const space = dataSpaceManager.spaces.get(spaceKey) ?? (0, import_debug5.raise)(new import_protocols11.SpaceNotFoundError(spaceKey));
4497
+ const space = dataSpaceManager.spaces.get(spaceKey) ?? (0, import_debug5.raise)(new import_protocols10.SpaceNotFoundError(spaceKey));
4395
4498
  await space.createEpoch({
4396
4499
  migration
4397
4500
  });
@@ -4400,7 +4503,7 @@ var SpacesServiceImpl = class {
4400
4503
  return {
4401
4504
  spaceKey: space.key,
4402
4505
  state: space.state,
4403
- error: space.error ? (0, import_protocols11.encodeError)(space.error) : void 0,
4506
+ error: space.error ? (0, import_protocols10.encodeError)(space.error) : void 0,
4404
4507
  pipeline: {
4405
4508
  currentEpoch: space.automergeSpaceState.lastEpoch,
4406
4509
  appliedEpoch: space.automergeSpaceState.lastEpoch,
@@ -4425,7 +4528,7 @@ var SpacesServiceImpl = class {
4425
4528
  identityKey: member.key,
4426
4529
  profile: member.profile ?? {}
4427
4530
  },
4428
- presence: member.removed ? import_services11.SpaceMember.PresenceState.REMOVED : isMe || peers.length > 0 ? import_services11.SpaceMember.PresenceState.ONLINE : import_services11.SpaceMember.PresenceState.OFFLINE,
4531
+ presence: member.removed ? import_services10.SpaceMember.PresenceState.REMOVED : isMe || peers.length > 0 ? import_services10.SpaceMember.PresenceState.ONLINE : import_services10.SpaceMember.PresenceState.OFFLINE,
4429
4532
  peerStates: peers
4430
4533
  };
4431
4534
  }),
@@ -4444,9 +4547,11 @@ var createSelectedDocumentsIterator = (automergeHost) => (
4444
4547
  // TODO(mykola): Unload automerge handles after usage.
4445
4548
  async function* loadDocuments(ids) {
4446
4549
  for (const id of ids) {
4447
- const { documentId, objectId } = import_protocols13.idCodec.decode(id);
4448
- const handle = automergeHost.repo.find(documentId);
4449
- await (0, import_debug7.warnAfterTimeout)(5e3, "to long to load doc", () => handle.whenReady());
4550
+ const { documentId, objectId } = import_protocols12.idCodec.decode(id);
4551
+ const handle = automergeHost.repo.handles[documentId] ?? automergeHost.repo.find(documentId);
4552
+ if (!handle.isReady()) {
4553
+ await handle.whenReady();
4554
+ }
4450
4555
  const doc = handle.docSync();
4451
4556
  const hash = (0, import_automerge.getHeads)(doc).join("");
4452
4557
  yield doc.objects?.[objectId] ? [
@@ -4459,57 +4564,6 @@ var createSelectedDocumentsIterator = (automergeHost) => (
4459
4564
  }
4460
4565
  }
4461
4566
  );
4462
- var createDocumentsIterator = (automergeHost) => (
4463
- /**
4464
- * Recursively get all object data blobs from Automerge Repo.
4465
- * @param ids
4466
- */
4467
- // TODO(mykola): Unload automerge handles after usage.
4468
- async function* getAllDocuments() {
4469
- const visited = /* @__PURE__ */ new Set();
4470
- async function* getObjectsFromHandle(handle) {
4471
- if (visited.has(handle.documentId)) {
4472
- return;
4473
- }
4474
- await (0, import_debug7.warnAfterTimeout)(5e3, "to long to load doc", () => handle.whenReady());
4475
- const doc = handle.docSync();
4476
- const heads = (0, import_automerge.getHeads)(doc);
4477
- if (doc.objects) {
4478
- yield Object.entries(doc.objects).map(([objectId, object]) => {
4479
- return {
4480
- id: import_protocols13.idCodec.encode({
4481
- documentId: handle.documentId,
4482
- objectId
4483
- }),
4484
- object,
4485
- currentHash: heads.join("")
4486
- };
4487
- });
4488
- }
4489
- if (doc.links) {
4490
- for (const id of Object.values(doc.links)) {
4491
- if (visited.has(id)) {
4492
- continue;
4493
- }
4494
- const linkHandle = automergeHost.repo.find(id);
4495
- for await (const result of getObjectsFromHandle(linkHandle)) {
4496
- yield result;
4497
- }
4498
- }
4499
- }
4500
- visited.add(handle.documentId);
4501
- }
4502
- for (const handle of Object.values(automergeHost.repo.handles)) {
4503
- if (visited.has(handle.documentId)) {
4504
- continue;
4505
- }
4506
- for await (const result of getObjectsFromHandle(handle)) {
4507
- yield result;
4508
- }
4509
- visited.add(handle.documentId);
4510
- }
4511
- }
4512
- );
4513
4567
  function _ts_decorate6(decorators, target, key, desc) {
4514
4568
  var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
4515
4569
  if (typeof Reflect === "object" && typeof Reflect.decorate === "function")
@@ -4520,7 +4574,7 @@ function _ts_decorate6(decorators, target, key, desc) {
4520
4574
  r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
4521
4575
  return c > 3 && r && Object.defineProperty(target, key, r), r;
4522
4576
  }
4523
- var __dxlog_file15 = "/home/runner/work/dxos/dxos/packages/sdk/client-services/src/packlets/services/service-context.ts";
4577
+ var __dxlog_file14 = "/home/runner/work/dxos/dxos/packages/sdk/client-services/src/packlets/services/service-context.ts";
4524
4578
  var ServiceContext = class extends import_context10.Resource {
4525
4579
  constructor(storage, level, networkManager, signalManager, _runtimeParams) {
4526
4580
  super();
@@ -4531,9 +4585,9 @@ var ServiceContext = class extends import_context10.Resource {
4531
4585
  this._runtimeParams = _runtimeParams;
4532
4586
  this.initialized = new import_async15.Trigger();
4533
4587
  this._handlerFactories = /* @__PURE__ */ new Map();
4534
- this._instanceId = import_keys10.PublicKey.random().toHex();
4535
- this.metadataStore = new import_echo_pipeline3.MetadataStore(storage.createDirectory("metadata"));
4536
- this.snapshotStore = new import_echo_pipeline3.SnapshotStore(storage.createDirectory("snapshots"));
4588
+ this._instanceId = import_keys11.PublicKey.random().toHex();
4589
+ this.metadataStore = new import_echo_pipeline4.MetadataStore(storage.createDirectory("metadata"));
4590
+ this.snapshotStore = new import_echo_pipeline4.SnapshotStore(storage.createDirectory("snapshots"));
4537
4591
  this.blobStore = new import_teleport_extension_object_sync.BlobStore(storage.createDirectory("blobs"));
4538
4592
  this.keyring = new import_keyring.Keyring(storage.createDirectory("keyring"));
4539
4593
  this.feedStore = new import_feed_store4.FeedStore({
@@ -4541,12 +4595,12 @@ var ServiceContext = class extends import_context10.Resource {
4541
4595
  root: storage.createDirectory("feeds"),
4542
4596
  signer: this.keyring,
4543
4597
  hypercore: {
4544
- valueEncoding: import_echo_pipeline3.valueEncoding,
4598
+ valueEncoding: import_echo_pipeline4.valueEncoding,
4545
4599
  stats: true
4546
4600
  }
4547
4601
  })
4548
4602
  });
4549
- this.spaceManager = new import_echo_pipeline3.SpaceManager({
4603
+ this.spaceManager = new import_echo_pipeline4.SpaceManager({
4550
4604
  feedStore: this.feedStore,
4551
4605
  networkManager: this.networkManager,
4552
4606
  blobStore: this.blobStore,
@@ -4557,64 +4611,79 @@ var ServiceContext = class extends import_context10.Resource {
4557
4611
  this.indexMetadata = new import_indexing.IndexMetadataStore({
4558
4612
  db: level.sublevel("index-metadata")
4559
4613
  });
4560
- this.automergeHost = new import_echo_pipeline3.AutomergeHost({
4614
+ this.automergeHost = new import_echo_pipeline4.AutomergeHost({
4561
4615
  directory: storage.createDirectory("automerge"),
4562
- metadata: this.indexMetadata
4616
+ db: level.sublevel("automerge"),
4617
+ storageCallbacks: (0, import_indexing.createStorageCallbacks)({
4618
+ host: () => this.automergeHost,
4619
+ metadata: this.indexMetadata
4620
+ })
4563
4621
  });
4564
4622
  this.indexer = new import_indexing.Indexer({
4623
+ db: this.level,
4565
4624
  indexStore: new import_indexing.IndexStore({
4566
- directory: storage.createDirectory("index-store")
4625
+ db: level.sublevel("index-storage")
4567
4626
  }),
4568
4627
  metadataStore: this.indexMetadata,
4569
- loadDocuments: createSelectedDocumentsIterator(this.automergeHost),
4570
- getAllDocuments: createDocumentsIterator(this.automergeHost)
4628
+ loadDocuments: createSelectedDocumentsIterator(this.automergeHost)
4571
4629
  });
4572
4630
  this.invitations = new InvitationsHandler(this.networkManager);
4573
- this._handlerFactories.set(import_services12.Invitation.Kind.DEVICE, () => new DeviceInvitationProtocol(this.keyring, () => this.identityManager.identity ?? (0, import_debug6.failUndefined)(), this._acceptIdentity.bind(this)));
4631
+ this.invitationsManager = new InvitationsManager(this.invitations, (invitation) => this.getInvitationHandler(invitation), this.metadataStore);
4632
+ this._handlerFactories.set(import_services11.Invitation.Kind.DEVICE, () => new DeviceInvitationProtocol(this.keyring, () => this.identityManager.identity ?? (0, import_debug6.failUndefined)(), this._acceptIdentity.bind(this)));
4574
4633
  }
4575
4634
  async _open(ctx) {
4576
4635
  await this._checkStorageVersion();
4577
4636
  (0, import_log12.log)("opening...", void 0, {
4578
- F: __dxlog_file15,
4579
- L: 156,
4637
+ F: __dxlog_file14,
4638
+ L: 164,
4580
4639
  S: this,
4581
4640
  C: (f, a) => f(...a)
4582
4641
  });
4583
- import_log12.log.trace("dxos.sdk.service-context.open", import_protocols12.trace.begin({
4642
+ import_log12.log.trace("dxos.sdk.service-context.open", import_protocols11.trace.begin({
4584
4643
  id: this._instanceId
4585
4644
  }), {
4586
- F: __dxlog_file15,
4587
- L: 157,
4645
+ F: __dxlog_file14,
4646
+ L: 165,
4588
4647
  S: this,
4589
4648
  C: (f, a) => f(...a)
4590
4649
  });
4591
4650
  await this.signalManager.open();
4592
4651
  await this.networkManager.open();
4652
+ await this.automergeHost.open();
4593
4653
  await this.metadataStore.load();
4594
4654
  await this.spaceManager.open();
4595
4655
  await this.identityManager.open(ctx);
4596
4656
  if (this.identityManager.identity) {
4597
4657
  await this._initialize(ctx);
4598
4658
  }
4599
- import_log12.log.trace("dxos.sdk.service-context.open", import_protocols12.trace.end({
4659
+ const loadedInvitations = await this.invitationsManager.loadPersistentInvitations();
4660
+ (0, import_log12.log)("loaded persistent invitations", {
4661
+ count: loadedInvitations.invitations?.length
4662
+ }, {
4663
+ F: __dxlog_file14,
4664
+ L: 178,
4665
+ S: this,
4666
+ C: (f, a) => f(...a)
4667
+ });
4668
+ import_log12.log.trace("dxos.sdk.service-context.open", import_protocols11.trace.end({
4600
4669
  id: this._instanceId
4601
4670
  }), {
4602
- F: __dxlog_file15,
4603
- L: 167,
4671
+ F: __dxlog_file14,
4672
+ L: 180,
4604
4673
  S: this,
4605
4674
  C: (f, a) => f(...a)
4606
4675
  });
4607
4676
  (0, import_log12.log)("opened", void 0, {
4608
- F: __dxlog_file15,
4609
- L: 168,
4677
+ F: __dxlog_file14,
4678
+ L: 181,
4610
4679
  S: this,
4611
4680
  C: (f, a) => f(...a)
4612
4681
  });
4613
4682
  }
4614
4683
  async _close() {
4615
4684
  (0, import_log12.log)("closing...", void 0, {
4616
- F: __dxlog_file15,
4617
- L: 172,
4685
+ F: __dxlog_file14,
4686
+ L: 185,
4618
4687
  S: this,
4619
4688
  C: (f, a) => f(...a)
4620
4689
  });
@@ -4631,8 +4700,8 @@ var ServiceContext = class extends import_context10.Resource {
4631
4700
  await this.metadataStore.close();
4632
4701
  await this.indexer.destroy();
4633
4702
  (0, import_log12.log)("closed", void 0, {
4634
- F: __dxlog_file15,
4635
- L: 185,
4703
+ F: __dxlog_file14,
4704
+ L: 198,
4636
4705
  S: this,
4637
4706
  C: (f, a) => f(...a)
4638
4707
  });
@@ -4644,9 +4713,9 @@ var ServiceContext = class extends import_context10.Resource {
4644
4713
  }
4645
4714
  getInvitationHandler(invitation) {
4646
4715
  const factory = this._handlerFactories.get(invitation.kind);
4647
- (0, import_invariant14.invariant)(factory, `Unknown invitation kind: ${invitation.kind}`, {
4648
- F: __dxlog_file15,
4649
- L: 196,
4716
+ (0, import_invariant13.invariant)(factory, `Unknown invitation kind: ${invitation.kind}`, {
4717
+ F: __dxlog_file14,
4718
+ L: 209,
4650
4719
  S: this,
4651
4720
  A: [
4652
4721
  "factory",
@@ -4670,15 +4739,15 @@ var ServiceContext = class extends import_context10.Resource {
4670
4739
  }
4671
4740
  async _checkStorageVersion() {
4672
4741
  await this.metadataStore.load();
4673
- if (this.metadataStore.version !== import_protocols12.STORAGE_VERSION) {
4674
- throw new import_protocols12.InvalidStorageVersionError(import_protocols12.STORAGE_VERSION, this.metadataStore.version);
4742
+ if (this.metadataStore.version !== import_protocols11.STORAGE_VERSION) {
4743
+ throw new import_protocols11.InvalidStorageVersionError(import_protocols11.STORAGE_VERSION, this.metadataStore.version);
4675
4744
  }
4676
4745
  }
4677
4746
  // Called when identity is created.
4678
4747
  async _initialize(ctx) {
4679
4748
  (0, import_log12.log)("initializing spaces...", void 0, {
4680
- F: __dxlog_file15,
4681
- L: 227,
4749
+ F: __dxlog_file14,
4750
+ L: 240,
4682
4751
  S: this,
4683
4752
  C: (f, a) => f(...a)
4684
4753
  });
@@ -4696,12 +4765,12 @@ var ServiceContext = class extends import_context10.Resource {
4696
4765
  });
4697
4766
  }
4698
4767
  };
4699
- this.dataSpaceManager = new DataSpaceManager(this.spaceManager, this.metadataStore, this.keyring, signingContext, this.feedStore, this.automergeHost, this._runtimeParams);
4768
+ this.dataSpaceManager = new DataSpaceManager(this.spaceManager, this.metadataStore, this.keyring, signingContext, this.feedStore, this.automergeHost, this.invitationsManager, this._runtimeParams);
4700
4769
  await this.dataSpaceManager.open();
4701
- this._handlerFactories.set(import_services12.Invitation.Kind.SPACE, (invitation) => {
4702
- (0, import_invariant14.invariant)(this.dataSpaceManager, "dataSpaceManager not initialized yet", {
4703
- F: __dxlog_file15,
4704
- L: 251,
4770
+ this._handlerFactories.set(import_services11.Invitation.Kind.SPACE, (invitation) => {
4771
+ (0, import_invariant13.invariant)(this.dataSpaceManager, "dataSpaceManager not initialized yet", {
4772
+ F: __dxlog_file14,
4773
+ L: 265,
4705
4774
  S: this,
4706
4775
  A: [
4707
4776
  "this.dataSpaceManager",
@@ -4724,8 +4793,8 @@ var ServiceContext = class extends import_context10.Resource {
4724
4793
  (0, import_log12.log)("dataSpaceManager not initialized yet, ignoring space admission", {
4725
4794
  details: assertion
4726
4795
  }, {
4727
- F: __dxlog_file15,
4728
- L: 267,
4796
+ F: __dxlog_file14,
4797
+ L: 281,
4729
4798
  S: this,
4730
4799
  C: (f, a) => f(...a)
4731
4800
  });
@@ -4735,8 +4804,8 @@ var ServiceContext = class extends import_context10.Resource {
4735
4804
  (0, import_log12.log)("space already exists, ignoring space admission", {
4736
4805
  details: assertion
4737
4806
  }, {
4738
- F: __dxlog_file15,
4739
- L: 271,
4807
+ F: __dxlog_file14,
4808
+ L: 285,
4740
4809
  S: this,
4741
4810
  C: (f, a) => f(...a)
4742
4811
  });
@@ -4746,8 +4815,8 @@ var ServiceContext = class extends import_context10.Resource {
4746
4815
  (0, import_log12.log)("accepting space recorded in halo", {
4747
4816
  details: assertion
4748
4817
  }, {
4749
- F: __dxlog_file15,
4750
- L: 276,
4818
+ F: __dxlog_file14,
4819
+ L: 290,
4751
4820
  S: this,
4752
4821
  C: (f, a) => f(...a)
4753
4822
  });
@@ -4757,8 +4826,8 @@ var ServiceContext = class extends import_context10.Resource {
4757
4826
  });
4758
4827
  } catch (err) {
4759
4828
  import_log12.log.catch(err, void 0, {
4760
- F: __dxlog_file15,
4761
- L: 282,
4829
+ F: __dxlog_file14,
4830
+ L: 296,
4762
4831
  S: this,
4763
4832
  C: (f, a) => f(...a)
4764
4833
  });
@@ -4769,14 +4838,14 @@ var ServiceContext = class extends import_context10.Resource {
4769
4838
  }
4770
4839
  };
4771
4840
  _ts_decorate6([
4772
- import_tracing6.trace.span()
4841
+ import_tracing5.trace.span()
4773
4842
  ], ServiceContext.prototype, "_open", null);
4774
4843
  _ts_decorate6([
4775
- import_tracing6.trace.span()
4844
+ import_tracing5.trace.span()
4776
4845
  ], ServiceContext.prototype, "_initialize", null);
4777
4846
  ServiceContext = _ts_decorate6([
4778
4847
  (0, import_util7.safeInstanceof)("dxos.client-services.ServiceContext"),
4779
- import_tracing6.trace.resource()
4848
+ import_tracing5.trace.resource()
4780
4849
  ], ServiceContext);
4781
4850
  var ServiceRegistry = class {
4782
4851
  // prettier-ignore
@@ -4800,118 +4869,155 @@ var ServiceRegistry = class {
4800
4869
  delete this._handlers[name];
4801
4870
  }
4802
4871
  };
4803
- function _ts_decorate7(decorators, target, key, desc) {
4804
- var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
4805
- if (typeof Reflect === "object" && typeof Reflect.decorate === "function")
4806
- r = Reflect.decorate(decorators, target, key, desc);
4807
- else
4808
- for (var i = decorators.length - 1; i >= 0; i--)
4809
- if (d = decorators[i])
4810
- r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
4811
- return c > 3 && r && Object.defineProperty(target, key, r), r;
4812
- }
4813
- var __dxlog_file16 = "/home/runner/work/dxos/dxos/packages/sdk/client-services/src/packlets/locks/node.ts";
4814
- var Lock = class {
4815
- constructor({ lockKey: lockPath, onAcquire, onRelease }) {
4816
- this._lockPath = lockPath;
4817
- this._onAcquire = onAcquire;
4818
- this._onRelease = onRelease;
4819
- }
4820
- get lockKey() {
4821
- return this._lockPath;
4822
- }
4823
- async acquire() {
4824
- (0, import_log13.log)("acquiring lock...", void 0, {
4825
- F: __dxlog_file16,
4826
- L: 32,
4827
- S: this,
4828
- C: (f, a) => f(...a)
4829
- });
4830
- this._fileHandle = await import_lock_file.LockFile.acquire(this._lockPath);
4831
- await this._onAcquire?.();
4832
- (0, import_log13.log)("acquired lock", void 0, {
4833
- F: __dxlog_file16,
4834
- L: 37,
4835
- S: this,
4836
- C: (f, a) => f(...a)
4837
- });
4872
+ var DXOS_VERSION = "0.4.10-main.fd8ea31";
4873
+ var getPlatform = () => {
4874
+ if (process.browser) {
4875
+ if (typeof window !== "undefined") {
4876
+ const { userAgent } = window.navigator;
4877
+ return {
4878
+ type: import_services13.Platform.PLATFORM_TYPE.BROWSER,
4879
+ userAgent,
4880
+ uptime: Math.floor((Date.now() - window.performance.timeOrigin) / 1e3)
4881
+ };
4882
+ } else {
4883
+ return {
4884
+ type: import_services13.Platform.PLATFORM_TYPE.SHARED_WORKER,
4885
+ uptime: Math.floor((Date.now() - performance.timeOrigin) / 1e3)
4886
+ };
4887
+ }
4888
+ } else {
4889
+ const { platform: platform2, version, arch } = process;
4890
+ return {
4891
+ type: import_services13.Platform.PLATFORM_TYPE.NODE,
4892
+ platform: platform2,
4893
+ arch,
4894
+ runtime: version,
4895
+ uptime: Math.floor(process.uptime()),
4896
+ memory: process.memoryUsage()
4897
+ };
4838
4898
  }
4839
- async release() {
4840
- await this._onRelease?.();
4841
- (0, import_invariant15.invariant)(this._fileHandle, "Lock is not acquired", {
4842
- F: __dxlog_file16,
4843
- L: 42,
4844
- S: this,
4899
+ };
4900
+ var __dxlog_file15 = "/home/runner/work/dxos/dxos/packages/sdk/client-services/src/packlets/diagnostics/diagnostics.ts";
4901
+ var DEFAULT_TIMEOUT = 1e3;
4902
+ var createDiagnostics = async (clientServices, serviceContext, config) => {
4903
+ const diagnostics = {
4904
+ created: (/* @__PURE__ */ new Date()).toISOString(),
4905
+ platform: getPlatform(),
4906
+ client: {
4907
+ version: DXOS_VERSION,
4908
+ storage: {
4909
+ version: import_protocols13.STORAGE_VERSION
4910
+ }
4911
+ },
4912
+ trace: import_tracing6.TRACE_PROCESSOR.getDiagnostics()
4913
+ };
4914
+ {
4915
+ (0, import_invariant14.invariant)(clientServices.LoggingService, "SystemService is not available.", {
4916
+ F: __dxlog_file15,
4917
+ L: 108,
4918
+ S: void 0,
4845
4919
  A: [
4846
- "this._fileHandle",
4847
- "'Lock is not acquired'"
4920
+ "clientServices.LoggingService",
4921
+ "'SystemService is not available.'"
4848
4922
  ]
4849
4923
  });
4850
- await import_lock_file.LockFile.release(this._fileHandle);
4851
- }
4852
- };
4853
- _ts_decorate7([
4854
- import_log13.logInfo
4855
- ], Lock.prototype, "lockKey", null);
4856
- var isLocked = (lockPath) => import_lock_file.LockFile.isLocked(lockPath);
4857
- var getRootPath = (config) => {
4858
- const { dataRoot = (0, import_util8.isNode)() ? import_client_protocol4.DX_DATA : "dxos/storage" } = config ?? {};
4859
- return `${dataRoot}/`;
4860
- };
4861
- var isPersistent = (config) => {
4862
- const { persistent = false } = config ?? {};
4863
- return config.dataStore !== void 0 && config.dataStore !== import_config2.Runtime.Client.Storage.StorageDriver.RAM || persistent;
4864
- };
4865
- var StorageDriver = import_config.Runtime.Client.Storage.StorageDriver;
4866
- var createStorageObjects = (config) => {
4867
- const { persistent = false, keyStore, dataStore } = config ?? {};
4868
- if (persistent && dataStore === StorageDriver.RAM) {
4869
- throw new import_protocols14.InvalidConfigError("RAM storage cannot be used in persistent mode.");
4924
+ diagnostics.metrics = await (0, import_codec_protobuf11.getFirstStreamValue)(clientServices.LoggingService.queryMetrics({}), {
4925
+ timeout: DEFAULT_TIMEOUT
4926
+ }).catch(() => void 0);
4870
4927
  }
4871
- if (!persistent && dataStore !== void 0 && dataStore !== StorageDriver.RAM) {
4872
- throw new import_protocols14.InvalidConfigError("Cannot use a persistent storage in not persistent mode.");
4928
+ if (typeof navigator !== "undefined" && navigator.storage) {
4929
+ const map = /* @__PURE__ */ new Map();
4930
+ const dir = await navigator.storage.getDirectory();
4931
+ for await (const filename of dir?.keys()) {
4932
+ const idx = filename.indexOf("-", filename.indexOf("-") + 1);
4933
+ if (idx === -1) {
4934
+ continue;
4935
+ }
4936
+ map.set(filename.slice(0, idx), (map.get(filename.slice(0, idx)) ?? 0) + 1);
4937
+ }
4938
+ diagnostics.storage = Array.from(map.entries()).sort((a, b) => b[1] - a[1]).map(([file, count]) => ({
4939
+ file,
4940
+ count
4941
+ }));
4873
4942
  }
4874
- if (persistent && keyStore === StorageDriver.RAM) {
4875
- throw new import_protocols14.InvalidConfigError("RAM key storage cannot be used in persistent mode.");
4943
+ const identity = serviceContext.identityManager.identity;
4944
+ if (identity) {
4945
+ diagnostics.identity = {
4946
+ identityKey: identity.identityKey,
4947
+ spaceKey: identity.space.key,
4948
+ profile: identity.profileDocument
4949
+ };
4950
+ const { devices } = await (0, import_codec_protobuf11.getFirstStreamValue)(clientServices.DevicesService.queryDevices(), {
4951
+ timeout: DEFAULT_TIMEOUT
4952
+ }).catch(() => void 0) ?? {};
4953
+ diagnostics.devices = devices;
4954
+ if (serviceContext.dataSpaceManager) {
4955
+ diagnostics.spaces = await Promise.all(Array.from(serviceContext.dataSpaceManager.spaces.values()).map((space) => getSpaceStats(space)) ?? []);
4956
+ }
4957
+ const { feeds = [] } = await (0, import_codec_protobuf11.getFirstStreamValue)(clientServices.DevtoolsHost.subscribeToFeeds({}), {
4958
+ timeout: DEFAULT_TIMEOUT
4959
+ }).catch(() => void 0) ?? {};
4960
+ diagnostics.feeds = feeds.map(({ feedKey, bytes, length }) => ({
4961
+ feedKey,
4962
+ bytes,
4963
+ length
4964
+ }));
4965
+ const status = await (0, import_codec_protobuf11.getFirstStreamValue)(clientServices.NetworkService.queryStatus(), {
4966
+ timeout: DEFAULT_TIMEOUT
4967
+ }).catch(() => void 0);
4968
+ diagnostics.networkStatus = status;
4969
+ diagnostics.swarms = serviceContext.networkManager.connectionLog?.swarms;
4876
4970
  }
4877
- if (!persistent && keyStore !== StorageDriver.RAM && keyStore !== void 0) {
4878
- throw new import_protocols14.InvalidConfigError("Cannot use a persistent key storage in not persistent mode.");
4971
+ diagnostics.config = config.values;
4972
+ return diagnostics;
4973
+ };
4974
+ var getSpaceStats = async (space) => {
4975
+ const stats = {
4976
+ key: space.key,
4977
+ metrics: space.metrics,
4978
+ epochs: space.inner.spaceState.credentials.filter((0, import_credentials16.credentialTypeFilter)("dxos.halo.credentials.Epoch")).map((credential) => ({
4979
+ ...credential.subject.assertion,
4980
+ id: credential.id
4981
+ })),
4982
+ members: Array.from(space.inner.spaceState.members.values()).map((member) => ({
4983
+ identity: {
4984
+ identityKey: member.key,
4985
+ profile: {
4986
+ displayName: member.assertion.profile?.displayName
4987
+ }
4988
+ },
4989
+ presence: space.presence.getPeersOnline().filter(({ identityKey }) => identityKey.equals(member.key)).length > 0 ? import_services12.SpaceMember.PresenceState.ONLINE : import_services12.SpaceMember.PresenceState.OFFLINE
4990
+ })),
4991
+ pipeline: {
4992
+ // TODO(burdon): Pick properties from credentials if needed.
4993
+ currentEpoch: space.automergeSpaceState.lastEpoch,
4994
+ appliedEpoch: space.automergeSpaceState.lastEpoch,
4995
+ controlFeeds: space.inner.controlPipeline.state.feeds.map((feed) => feed.key),
4996
+ currentControlTimeframe: space.inner.controlPipeline.state.timeframe,
4997
+ targetControlTimeframe: space.inner.controlPipeline.state.targetTimeframe,
4998
+ totalControlTimeframe: space.inner.controlPipeline.state.endTimeframe
4999
+ }
5000
+ };
5001
+ if (stats.metrics) {
5002
+ const { open, ready } = stats.metrics;
5003
+ stats.metrics.startupTime = open && ready && ready.getTime() - open.getTime();
4879
5004
  }
5005
+ return stats;
5006
+ };
5007
+ var createCollectDiagnosticsBroadcastSender = () => {
4880
5008
  return {
4881
- storage: (0, import_random_access_storage.createStorage)({
4882
- type: persistent ? toStorageType(dataStore) : import_random_access_storage.StorageType.RAM,
4883
- root: getRootPath(config)
4884
- })
5009
+ broadcastDiagnosticsRequest: async () => void 0
4885
5010
  };
4886
5011
  };
4887
- var toStorageType = (type) => {
4888
- switch (type) {
4889
- case void 0:
4890
- return void 0;
4891
- case StorageDriver.RAM:
4892
- return import_random_access_storage.StorageType.RAM;
4893
- case StorageDriver.CHROME:
4894
- return import_random_access_storage.StorageType.CHROME;
4895
- case StorageDriver.FIREFOX:
4896
- return import_random_access_storage.StorageType.FIREFOX;
4897
- case StorageDriver.IDB:
4898
- return import_random_access_storage.StorageType.IDB;
4899
- case StorageDriver.NODE:
4900
- return import_random_access_storage.StorageType.NODE;
4901
- case StorageDriver.WEBFS:
4902
- return import_random_access_storage.StorageType.WEBFS;
4903
- default:
4904
- throw new Error(`Invalid storage type: ${StorageDriver[type]}`);
4905
- }
4906
- };
4907
- var createLevel = async (config) => {
4908
- const persistent = isPersistent(config);
4909
- const storagePath = persistent ? getRootPath(config) : import_node_path.default.join("tmp", "level", import_keys11.PublicKey.random().toHex());
4910
- const level = new import_level.Level(storagePath);
4911
- await level.open();
4912
- return level;
5012
+ var createCollectDiagnosticsBroadcastHandler = (_) => {
5013
+ return {
5014
+ start: () => {
5015
+ },
5016
+ stop: () => {
5017
+ }
5018
+ };
4913
5019
  };
4914
- var __dxlog_file17 = "/home/runner/work/dxos/dxos/packages/sdk/client-services/src/packlets/devices/devices-service.ts";
5020
+ var __dxlog_file16 = "/home/runner/work/dxos/dxos/packages/sdk/client-services/src/packlets/devices/devices-service.ts";
4915
5021
  var DevicesServiceImpl = class {
4916
5022
  constructor(_identityManager) {
4917
5023
  this._identityManager = _identityManager;
@@ -4928,8 +5034,8 @@ var DevicesServiceImpl = class {
4928
5034
  devices: []
4929
5035
  });
4930
5036
  } else {
4931
- (0, import_invariant17.invariant)(this._identityManager.identity?.presence, "presence not present", {
4932
- F: __dxlog_file17,
5037
+ (0, import_invariant16.invariant)(this._identityManager.identity?.presence, "presence not present", {
5038
+ F: __dxlog_file16,
4933
5039
  L: 32,
4934
5040
  S: this,
4935
5041
  A: [
@@ -4944,9 +5050,9 @@ var DevicesServiceImpl = class {
4944
5050
  const peerState = peers.find((peer) => peer.identityKey.equals(key));
4945
5051
  return {
4946
5052
  deviceKey: key,
4947
- kind: this._identityManager.identity?.deviceKey.equals(key) ? import_services14.DeviceKind.CURRENT : import_services14.DeviceKind.TRUSTED,
5053
+ kind: this._identityManager.identity?.deviceKey.equals(key) ? import_services16.DeviceKind.CURRENT : import_services16.DeviceKind.TRUSTED,
4948
5054
  profile,
4949
- presence: isMe ? import_services14.Device.PresenceState.ONLINE : peerState ? import_services14.Device.PresenceState.ONLINE : import_services14.Device.PresenceState.OFFLINE
5055
+ presence: isMe ? import_services16.Device.PresenceState.ONLINE : peerState ? import_services16.Device.PresenceState.ONLINE : import_services16.Device.PresenceState.OFFLINE
4950
5056
  };
4951
5057
  })
4952
5058
  });
@@ -4987,6 +5093,60 @@ var DevicesServiceImpl = class {
4987
5093
  });
4988
5094
  }
4989
5095
  };
5096
+ function _ts_decorate7(decorators, target, key, desc) {
5097
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
5098
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function")
5099
+ r = Reflect.decorate(decorators, target, key, desc);
5100
+ else
5101
+ for (var i = decorators.length - 1; i >= 0; i--)
5102
+ if (d = decorators[i])
5103
+ r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
5104
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
5105
+ }
5106
+ var __dxlog_file17 = "/home/runner/work/dxos/dxos/packages/sdk/client-services/src/packlets/locks/node.ts";
5107
+ var Lock = class {
5108
+ constructor({ lockKey: lockPath, onAcquire, onRelease }) {
5109
+ this._lockPath = lockPath;
5110
+ this._onAcquire = onAcquire;
5111
+ this._onRelease = onRelease;
5112
+ }
5113
+ get lockKey() {
5114
+ return this._lockPath;
5115
+ }
5116
+ async acquire() {
5117
+ (0, import_log14.log)("acquiring lock...", void 0, {
5118
+ F: __dxlog_file17,
5119
+ L: 32,
5120
+ S: this,
5121
+ C: (f, a) => f(...a)
5122
+ });
5123
+ this._fileHandle = await import_lock_file.LockFile.acquire(this._lockPath);
5124
+ await this._onAcquire?.();
5125
+ (0, import_log14.log)("acquired lock", void 0, {
5126
+ F: __dxlog_file17,
5127
+ L: 37,
5128
+ S: this,
5129
+ C: (f, a) => f(...a)
5130
+ });
5131
+ }
5132
+ async release() {
5133
+ await this._onRelease?.();
5134
+ (0, import_invariant17.invariant)(this._fileHandle, "Lock is not acquired", {
5135
+ F: __dxlog_file17,
5136
+ L: 42,
5137
+ S: this,
5138
+ A: [
5139
+ "this._fileHandle",
5140
+ "'Lock is not acquired'"
5141
+ ]
5142
+ });
5143
+ await import_lock_file.LockFile.release(this._fileHandle);
5144
+ }
5145
+ };
5146
+ _ts_decorate7([
5147
+ import_log14.logInfo
5148
+ ], Lock.prototype, "lockKey", null);
5149
+ var isLocked = (lockPath) => import_lock_file.LockFile.isLocked(lockPath);
4990
5150
  var LoggingServiceImpl = class {
4991
5151
  constructor() {
4992
5152
  this._logs = new import_async18.Event();
@@ -5088,16 +5248,16 @@ var LoggingServiceImpl = class {
5088
5248
  };
5089
5249
  var matchFilter = (filter, level, path2, options) => {
5090
5250
  switch (options) {
5091
- case import_services15.QueryLogsRequest.MatchingOptions.INCLUSIVE:
5251
+ case import_services17.QueryLogsRequest.MatchingOptions.INCLUSIVE:
5092
5252
  return level >= filter.level && (!filter.pattern || path2.includes(filter.pattern));
5093
- case import_services15.QueryLogsRequest.MatchingOptions.EXPLICIT:
5253
+ case import_services17.QueryLogsRequest.MatchingOptions.EXPLICIT:
5094
5254
  return level === filter.level && (!filter.pattern || path2.includes(filter.pattern));
5095
5255
  }
5096
5256
  };
5097
5257
  var shouldLog = (entry2, request) => {
5098
- const options = request.options ?? import_services15.QueryLogsRequest.MatchingOptions.INCLUSIVE;
5258
+ const options = request.options ?? import_services17.QueryLogsRequest.MatchingOptions.INCLUSIVE;
5099
5259
  if (request.filters === void 0) {
5100
- return options === import_services15.QueryLogsRequest.MatchingOptions.INCLUSIVE;
5260
+ return options === import_services17.QueryLogsRequest.MatchingOptions.INCLUSIVE;
5101
5261
  } else {
5102
5262
  return request.filters.some((filter) => matchFilter(filter, entry2.level, entry2.meta?.F ?? "", options));
5103
5263
  }
@@ -5133,6 +5293,63 @@ var NetworkServiceImpl = class {
5133
5293
  await this.networkManager.setConnectionState(request.swarm);
5134
5294
  }
5135
5295
  };
5296
+ var getRootPath = (config) => {
5297
+ const { dataRoot = (0, import_util11.isNode)() ? import_client_protocol6.DX_DATA : "dxos/storage" } = config ?? {};
5298
+ return `${dataRoot}/`;
5299
+ };
5300
+ var isPersistent = (config) => {
5301
+ const { persistent = false } = config ?? {};
5302
+ return config.dataStore !== void 0 && config.dataStore !== import_config3.Runtime.Client.Storage.StorageDriver.RAM || persistent;
5303
+ };
5304
+ var StorageDriver = import_config2.Runtime.Client.Storage.StorageDriver;
5305
+ var createStorageObjects = (config) => {
5306
+ const { persistent = false, keyStore, dataStore } = config ?? {};
5307
+ if (persistent && dataStore === StorageDriver.RAM) {
5308
+ throw new import_protocols15.InvalidConfigError("RAM storage cannot be used in persistent mode.");
5309
+ }
5310
+ if (!persistent && dataStore !== void 0 && dataStore !== StorageDriver.RAM) {
5311
+ throw new import_protocols15.InvalidConfigError("Cannot use a persistent storage in not persistent mode.");
5312
+ }
5313
+ if (persistent && keyStore === StorageDriver.RAM) {
5314
+ throw new import_protocols15.InvalidConfigError("RAM key storage cannot be used in persistent mode.");
5315
+ }
5316
+ if (!persistent && keyStore !== StorageDriver.RAM && keyStore !== void 0) {
5317
+ throw new import_protocols15.InvalidConfigError("Cannot use a persistent key storage in not persistent mode.");
5318
+ }
5319
+ return {
5320
+ storage: (0, import_random_access_storage.createStorage)({
5321
+ type: persistent ? toStorageType(dataStore) : import_random_access_storage.StorageType.RAM,
5322
+ root: getRootPath(config)
5323
+ })
5324
+ };
5325
+ };
5326
+ var toStorageType = (type) => {
5327
+ switch (type) {
5328
+ case void 0:
5329
+ return void 0;
5330
+ case StorageDriver.RAM:
5331
+ return import_random_access_storage.StorageType.RAM;
5332
+ case StorageDriver.CHROME:
5333
+ return import_random_access_storage.StorageType.CHROME;
5334
+ case StorageDriver.FIREFOX:
5335
+ return import_random_access_storage.StorageType.FIREFOX;
5336
+ case StorageDriver.IDB:
5337
+ return import_random_access_storage.StorageType.IDB;
5338
+ case StorageDriver.NODE:
5339
+ return import_random_access_storage.StorageType.NODE;
5340
+ case StorageDriver.WEBFS:
5341
+ return import_random_access_storage.StorageType.WEBFS;
5342
+ default:
5343
+ throw new Error(`Invalid storage type: ${StorageDriver[type]}`);
5344
+ }
5345
+ };
5346
+ var createLevel = async (config) => {
5347
+ const persistent = isPersistent(config);
5348
+ const storagePath = persistent ? import_node_path.default.join(getRootPath(config), "level") : `/tmp/dxos-${import_keys14.PublicKey.random().toHex()}`;
5349
+ const level = new import_level.Level(storagePath);
5350
+ await level.open();
5351
+ return level;
5352
+ };
5136
5353
  var SystemServiceImpl = class {
5137
5354
  constructor({ config, statusUpdate, getDiagnostics, onUpdateStatus, getCurrentStatus, onReset }) {
5138
5355
  this._config = config;
@@ -5152,9 +5369,9 @@ var SystemServiceImpl = class {
5152
5369
  const diagnostics = await this._getDiagnostics();
5153
5370
  return {
5154
5371
  timestamp: /* @__PURE__ */ new Date(),
5155
- diagnostics: JSON.parse(JSON.stringify(diagnostics, (0, import_util11.jsonKeyReplacer)({
5156
- truncate: keys === import_services16.GetDiagnosticsRequest.KEY_OPTION.TRUNCATE,
5157
- humanize: keys === import_services16.GetDiagnosticsRequest.KEY_OPTION.HUMANIZE
5372
+ diagnostics: JSON.parse(JSON.stringify(diagnostics, (0, import_util12.jsonKeyReplacer)({
5373
+ truncate: keys === import_services18.GetDiagnosticsRequest.KEY_OPTION.TRUNCATE,
5374
+ humanize: keys === import_services18.GetDiagnosticsRequest.KEY_OPTION.HUMANIZE
5158
5375
  })))
5159
5376
  };
5160
5377
  }
@@ -5202,16 +5419,18 @@ var ClientServicesHost = class {
5202
5419
  transportFactory,
5203
5420
  signalManager,
5204
5421
  storage,
5422
+ level,
5205
5423
  // TODO(wittjosiah): Turn this on by default.
5206
5424
  lockKey,
5207
5425
  callbacks,
5208
5426
  runtimeParams
5209
5427
  } = {}) {
5210
- this._tracingService = import_tracing7.TRACE_PROCESSOR.createTraceSender();
5428
+ this._tracingService = import_tracing8.TRACE_PROCESSOR.createTraceSender();
5211
5429
  this._statusUpdate = new import_async16.Event();
5212
5430
  this._opening = false;
5213
5431
  this._open = false;
5214
5432
  this._storage = storage;
5433
+ this._level = level;
5215
5434
  this._callbacks = callbacks;
5216
5435
  this._runtimeParams = runtimeParams;
5217
5436
  if (config) {
@@ -5235,14 +5454,14 @@ var ClientServicesHost = class {
5235
5454
  this._systemService = new SystemServiceImpl({
5236
5455
  config: () => this._config,
5237
5456
  statusUpdate: this._statusUpdate,
5238
- getCurrentStatus: () => this.isOpen ? import_services13.SystemStatus.ACTIVE : import_services13.SystemStatus.INACTIVE,
5457
+ getCurrentStatus: () => this.isOpen ? import_services15.SystemStatus.ACTIVE : import_services15.SystemStatus.INACTIVE,
5239
5458
  getDiagnostics: () => {
5240
5459
  return createDiagnostics(this._serviceRegistry.services, this._serviceContext, this._config);
5241
5460
  },
5242
5461
  onUpdateStatus: async (status) => {
5243
- if (!this.isOpen && status === import_services13.SystemStatus.ACTIVE) {
5462
+ if (!this.isOpen && status === import_services15.SystemStatus.ACTIVE) {
5244
5463
  await this._resourceLock?.acquire();
5245
- } else if (this.isOpen && status === import_services13.SystemStatus.INACTIVE) {
5464
+ } else if (this.isOpen && status === import_services15.SystemStatus.INACTIVE) {
5246
5465
  await this._resourceLock?.release();
5247
5466
  }
5248
5467
  },
@@ -5250,6 +5469,7 @@ var ClientServicesHost = class {
5250
5469
  await this.reset();
5251
5470
  }
5252
5471
  });
5472
+ this.diagnosticsBroadcastHandler = createCollectDiagnosticsBroadcastHandler(this._systemService);
5253
5473
  this._loggingService = new LoggingServiceImpl();
5254
5474
  this._serviceRegistry = new ServiceRegistry(import_client_protocol5.clientServiceBundle, {
5255
5475
  SystemService: this._systemService,
@@ -5280,25 +5500,25 @@ var ClientServicesHost = class {
5280
5500
  * Can only be called once.
5281
5501
  */
5282
5502
  initialize({ config, ...options }) {
5283
- (0, import_invariant16.invariant)(!this._open, "service host is open", {
5503
+ (0, import_invariant15.invariant)(!this._open, "service host is open", {
5284
5504
  F: __dxlog_file18,
5285
- L: 182,
5505
+ L: 198,
5286
5506
  S: this,
5287
5507
  A: [
5288
5508
  "!this._open",
5289
5509
  "'service host is open'"
5290
5510
  ]
5291
5511
  });
5292
- (0, import_log14.log)("initializing...", void 0, {
5512
+ (0, import_log13.log)("initializing...", void 0, {
5293
5513
  F: __dxlog_file18,
5294
- L: 183,
5514
+ L: 199,
5295
5515
  S: this,
5296
5516
  C: (f, a) => f(...a)
5297
5517
  });
5298
5518
  if (config) {
5299
- (0, import_invariant16.invariant)(!this._config, "config already set", {
5519
+ (0, import_invariant15.invariant)(!this._config, "config already set", {
5300
5520
  F: __dxlog_file18,
5301
- L: 186,
5521
+ L: 202,
5302
5522
  S: this,
5303
5523
  A: [
5304
5524
  "!this._config",
@@ -5311,9 +5531,9 @@ var ClientServicesHost = class {
5311
5531
  }
5312
5532
  }
5313
5533
  if (!options.signalManager) {
5314
- import_log14.log.warn("running signaling without telemetry metadata.", void 0, {
5534
+ import_log13.log.warn("running signaling without telemetry metadata.", void 0, {
5315
5535
  F: __dxlog_file18,
5316
- L: 194,
5536
+ L: 210,
5317
5537
  S: this,
5318
5538
  C: (f, a) => f(...a)
5319
5539
  });
@@ -5322,9 +5542,9 @@ var ClientServicesHost = class {
5322
5542
  iceServers: this._config?.get("runtime.services.ice")
5323
5543
  }), signalManager = new import_messaging.WebsocketSignalManager(this._config?.get("runtime.services.signaling") ?? []) } = options;
5324
5544
  this._signalManager = signalManager;
5325
- (0, import_invariant16.invariant)(!this._networkManager, "network manager already set", {
5545
+ (0, import_invariant15.invariant)(!this._networkManager, "network manager already set", {
5326
5546
  F: __dxlog_file18,
5327
- L: 205,
5547
+ L: 221,
5328
5548
  S: this,
5329
5549
  A: [
5330
5550
  "!this._networkManager",
@@ -5336,9 +5556,9 @@ var ClientServicesHost = class {
5336
5556
  transportFactory,
5337
5557
  signalManager
5338
5558
  });
5339
- (0, import_log14.log)("initialized", void 0, {
5559
+ (0, import_log13.log)("initialized", void 0, {
5340
5560
  F: __dxlog_file18,
5341
- L: 212,
5561
+ L: 228,
5342
5562
  S: this,
5343
5563
  C: (f, a) => f(...a)
5344
5564
  });
@@ -5348,44 +5568,44 @@ var ClientServicesHost = class {
5348
5568
  return;
5349
5569
  }
5350
5570
  const traceId = import_keys12.PublicKey.random().toHex();
5351
- import_log14.log.trace("dxos.client-services.host.open", import_protocols15.trace.begin({
5571
+ import_log13.log.trace("dxos.client-services.host.open", import_protocols14.trace.begin({
5352
5572
  id: traceId
5353
5573
  }), {
5354
5574
  F: __dxlog_file18,
5355
- L: 223,
5575
+ L: 239,
5356
5576
  S: this,
5357
5577
  C: (f, a) => f(...a)
5358
5578
  });
5359
- (0, import_invariant16.invariant)(this._config, "config not set", {
5579
+ (0, import_invariant15.invariant)(this._config, "config not set", {
5360
5580
  F: __dxlog_file18,
5361
- L: 225,
5581
+ L: 241,
5362
5582
  S: this,
5363
5583
  A: [
5364
5584
  "this._config",
5365
5585
  "'config not set'"
5366
5586
  ]
5367
5587
  });
5368
- (0, import_invariant16.invariant)(this._storage, "storage not set", {
5588
+ (0, import_invariant15.invariant)(this._storage, "storage not set", {
5369
5589
  F: __dxlog_file18,
5370
- L: 226,
5590
+ L: 242,
5371
5591
  S: this,
5372
5592
  A: [
5373
5593
  "this._storage",
5374
5594
  "'storage not set'"
5375
5595
  ]
5376
5596
  });
5377
- (0, import_invariant16.invariant)(this._signalManager, "signal manager not set", {
5597
+ (0, import_invariant15.invariant)(this._signalManager, "signal manager not set", {
5378
5598
  F: __dxlog_file18,
5379
- L: 227,
5599
+ L: 243,
5380
5600
  S: this,
5381
5601
  A: [
5382
5602
  "this._signalManager",
5383
5603
  "'signal manager not set'"
5384
5604
  ]
5385
5605
  });
5386
- (0, import_invariant16.invariant)(this._networkManager, "network manager not set", {
5606
+ (0, import_invariant15.invariant)(this._networkManager, "network manager not set", {
5387
5607
  F: __dxlog_file18,
5388
- L: 228,
5608
+ L: 244,
5389
5609
  S: this,
5390
5610
  A: [
5391
5611
  "this._networkManager",
@@ -5393,34 +5613,37 @@ var ClientServicesHost = class {
5393
5613
  ]
5394
5614
  });
5395
5615
  this._opening = true;
5396
- (0, import_log14.log)("opening...", {
5616
+ (0, import_log13.log)("opening...", {
5397
5617
  lockKey: this._resourceLock?.lockKey
5398
5618
  }, {
5399
5619
  F: __dxlog_file18,
5400
- L: 231,
5620
+ L: 247,
5401
5621
  S: this,
5402
5622
  C: (f, a) => f(...a)
5403
5623
  });
5404
5624
  if (!this._level) {
5405
5625
  this._level = await createLevel(this._config.get("runtime.client.storage", {}));
5406
5626
  }
5627
+ await this._level.open();
5407
5628
  await this._resourceLock?.acquire();
5408
5629
  await this._loggingService.open();
5409
5630
  this._serviceContext = new ServiceContext(this._storage, this._level, this._networkManager, this._signalManager, this._runtimeParams);
5631
+ this._queryService = new import_indexing2.QueryServiceImpl({
5632
+ indexer: this._serviceContext.indexer,
5633
+ automergeHost: this._serviceContext.automergeHost
5634
+ });
5635
+ await this._queryService.open(ctx);
5410
5636
  this._serviceRegistry.setServices({
5411
5637
  SystemService: this._systemService,
5412
5638
  IdentityService: new IdentityServiceImpl((params) => this._createIdentity(params), this._serviceContext.identityManager, this._serviceContext.keyring, (profile) => this._serviceContext.broadcastProfileUpdate(profile)),
5413
- InvitationsService: new InvitationsServiceImpl(this._serviceContext.invitations, (invitation) => this._serviceContext.getInvitationHandler(invitation), this._serviceContext.metadataStore),
5639
+ InvitationsService: new InvitationsServiceImpl(this._serviceContext.invitationsManager),
5414
5640
  DevicesService: new DevicesServiceImpl(this._serviceContext.identityManager),
5415
5641
  SpacesService: new SpacesServiceImpl(this._serviceContext.identityManager, this._serviceContext.spaceManager, async () => {
5416
5642
  await this._serviceContext.initialized.wait();
5417
5643
  return this._serviceContext.dataSpaceManager;
5418
5644
  }),
5419
- DataService: new import_echo_pipeline4.DataServiceImpl(this._serviceContext.automergeHost),
5420
- IndexService: new import_indexing2.IndexServiceImpl({
5421
- indexer: this._serviceContext.indexer,
5422
- automergeHost: this._serviceContext.automergeHost
5423
- }),
5645
+ DataService: new import_echo_pipeline5.DataServiceImpl(this._serviceContext.automergeHost),
5646
+ QueryService: this._queryService,
5424
5647
  NetworkService: new NetworkServiceImpl(this._serviceContext.networkManager, this._serviceContext.signalManager),
5425
5648
  LoggingService: this._loggingService,
5426
5649
  TracingService: this._tracingService,
@@ -5432,24 +5655,6 @@ var ClientServicesHost = class {
5432
5655
  })
5433
5656
  });
5434
5657
  await this._serviceContext.open(ctx);
5435
- (0, import_invariant16.invariant)(this.serviceRegistry.services.InvitationsService, void 0, {
5436
- F: __dxlog_file18,
5437
- L: 297,
5438
- S: this,
5439
- A: [
5440
- "this.serviceRegistry.services.InvitationsService",
5441
- ""
5442
- ]
5443
- });
5444
- const loadedInvitations = await this.serviceRegistry.services.InvitationsService.loadPersistentInvitations();
5445
- (0, import_log14.log)("loaded persistent invitations", {
5446
- count: loadedInvitations.invitations?.length
5447
- }, {
5448
- F: __dxlog_file18,
5449
- L: 300,
5450
- S: this,
5451
- C: (f, a) => f(...a)
5452
- });
5453
5658
  const devtoolsProxy = this._config?.get("runtime.client.devtoolsProxy");
5454
5659
  if (devtoolsProxy) {
5455
5660
  this._devtoolsProxy = new import_websocket_rpc.WebsocketRpcClient({
@@ -5460,23 +5665,24 @@ var ClientServicesHost = class {
5460
5665
  });
5461
5666
  void this._devtoolsProxy.open();
5462
5667
  }
5668
+ this.diagnosticsBroadcastHandler.start();
5463
5669
  this._opening = false;
5464
5670
  this._open = true;
5465
5671
  this._statusUpdate.emit();
5466
5672
  const deviceKey = this._serviceContext.identityManager.identity?.deviceKey;
5467
- (0, import_log14.log)("opened", {
5673
+ (0, import_log13.log)("opened", {
5468
5674
  deviceKey
5469
5675
  }, {
5470
5676
  F: __dxlog_file18,
5471
- L: 317,
5677
+ L: 330,
5472
5678
  S: this,
5473
5679
  C: (f, a) => f(...a)
5474
5680
  });
5475
- import_log14.log.trace("dxos.client-services.host.open", import_protocols15.trace.end({
5681
+ import_log13.log.trace("dxos.client-services.host.open", import_protocols14.trace.end({
5476
5682
  id: traceId
5477
5683
  }), {
5478
5684
  F: __dxlog_file18,
5479
- L: 318,
5685
+ L: 331,
5480
5686
  S: this,
5481
5687
  C: (f, a) => f(...a)
5482
5688
  });
@@ -5486,61 +5692,63 @@ var ClientServicesHost = class {
5486
5692
  return;
5487
5693
  }
5488
5694
  const deviceKey = this._serviceContext.identityManager.identity?.deviceKey;
5489
- (0, import_log14.log)("closing...", {
5695
+ (0, import_log13.log)("closing...", {
5490
5696
  deviceKey
5491
5697
  }, {
5492
5698
  F: __dxlog_file18,
5493
- L: 329,
5699
+ L: 342,
5494
5700
  S: this,
5495
5701
  C: (f, a) => f(...a)
5496
5702
  });
5703
+ this.diagnosticsBroadcastHandler.stop();
5497
5704
  await this._devtoolsProxy?.close();
5498
5705
  this._serviceRegistry.setServices({
5499
5706
  SystemService: this._systemService
5500
5707
  });
5501
5708
  await this._loggingService.close();
5709
+ await this._queryService.close();
5502
5710
  await this._serviceContext.close();
5503
5711
  await this._level?.close();
5504
5712
  this._open = false;
5505
5713
  this._statusUpdate.emit();
5506
- (0, import_log14.log)("closed", {
5714
+ (0, import_log13.log)("closed", {
5507
5715
  deviceKey
5508
5716
  }, {
5509
5717
  F: __dxlog_file18,
5510
- L: 337,
5718
+ L: 352,
5511
5719
  S: this,
5512
5720
  C: (f, a) => f(...a)
5513
5721
  });
5514
5722
  }
5515
5723
  async reset() {
5516
5724
  const traceId = import_keys12.PublicKey.random().toHex();
5517
- import_log14.log.trace("dxos.sdk.client-services-host.reset", import_protocols15.trace.begin({
5725
+ import_log13.log.trace("dxos.sdk.client-services-host.reset", import_protocols14.trace.begin({
5518
5726
  id: traceId
5519
5727
  }), {
5520
5728
  F: __dxlog_file18,
5521
- L: 342,
5729
+ L: 357,
5522
5730
  S: this,
5523
5731
  C: (f, a) => f(...a)
5524
5732
  });
5525
- (0, import_log14.log)("resetting...", void 0, {
5733
+ (0, import_log13.log)("resetting...", void 0, {
5526
5734
  F: __dxlog_file18,
5527
- L: 344,
5735
+ L: 359,
5528
5736
  S: this,
5529
5737
  C: (f, a) => f(...a)
5530
5738
  });
5531
5739
  await this._serviceContext?.close();
5532
5740
  await this._storage.reset();
5533
- (0, import_log14.log)("reset", void 0, {
5741
+ (0, import_log13.log)("reset", void 0, {
5534
5742
  F: __dxlog_file18,
5535
- L: 347,
5743
+ L: 362,
5536
5744
  S: this,
5537
5745
  C: (f, a) => f(...a)
5538
5746
  });
5539
- import_log14.log.trace("dxos.sdk.client-services-host.reset", import_protocols15.trace.end({
5747
+ import_log13.log.trace("dxos.sdk.client-services-host.reset", import_protocols14.trace.end({
5540
5748
  id: traceId
5541
5749
  }), {
5542
5750
  F: __dxlog_file18,
5543
- L: 348,
5751
+ L: 363,
5544
5752
  S: this,
5545
5753
  C: (f, a) => f(...a)
5546
5754
  });
@@ -5551,9 +5759,9 @@ var ClientServicesHost = class {
5551
5759
  await this._serviceContext.initialized.wait();
5552
5760
  const space = await this._serviceContext.dataSpaceManager.createSpace();
5553
5761
  const automergeIndex = space.automergeSpaceState.rootUrl;
5554
- (0, import_invariant16.invariant)(automergeIndex, void 0, {
5762
+ (0, import_invariant15.invariant)(automergeIndex, void 0, {
5555
5763
  F: __dxlog_file18,
5556
- L: 360,
5764
+ L: 375,
5557
5765
  S: this,
5558
5766
  A: [
5559
5767
  "automergeIndex",
@@ -5564,7 +5772,7 @@ var ClientServicesHost = class {
5564
5772
  await document.whenReady();
5565
5773
  const properties = {
5566
5774
  system: {
5567
- type: (0, import_echo_pipeline4.encodeReference)(E.getTypeReference(import_client_protocol5.Properties))
5775
+ type: (0, import_echo_pipeline5.encodeReference)((0, import_echo_schema2.getTypeReference)(import_client_protocol5.Properties))
5568
5776
  },
5569
5777
  data: {
5570
5778
  [import_client_protocol5.defaultKey]: identity.identityKey.toHex()
@@ -5585,35 +5793,70 @@ var ClientServicesHost = class {
5585
5793
  }
5586
5794
  };
5587
5795
  _ts_decorate8([
5588
- import_tracing7.trace.info()
5796
+ import_tracing8.trace.info()
5589
5797
  ], ClientServicesHost.prototype, "_opening", void 0);
5590
5798
  _ts_decorate8([
5591
- import_tracing7.trace.info()
5799
+ import_tracing8.trace.info()
5592
5800
  ], ClientServicesHost.prototype, "_open", void 0);
5593
5801
  _ts_decorate8([
5594
5802
  import_async16.synchronized,
5595
- import_tracing7.trace.span()
5803
+ import_tracing8.trace.span()
5596
5804
  ], ClientServicesHost.prototype, "open", null);
5597
5805
  _ts_decorate8([
5598
5806
  import_async16.synchronized,
5599
- import_tracing7.trace.span()
5807
+ import_tracing8.trace.span()
5600
5808
  ], ClientServicesHost.prototype, "close", null);
5601
5809
  ClientServicesHost = _ts_decorate8([
5602
- import_tracing7.trace.resource()
5810
+ import_tracing8.trace.resource()
5603
5811
  ], ClientServicesHost);
5812
+ var ClientServicesProviderResource = Symbol.for("dxos.resource.ClientServices");
5813
+ var DiagnosticsCollector = class {
5814
+ static {
5815
+ this.broadcastSender = createCollectDiagnosticsBroadcastSender();
5816
+ }
5817
+ static async collect(config = findConfigs(), services = findSystemServiceProvider(), options = {}) {
5818
+ const serviceDiagnostics = await services?.services?.SystemService?.getDiagnostics({
5819
+ keys: options.humanize ? import_services14.GetDiagnosticsRequest.KEY_OPTION.HUMANIZE : options.truncate ? import_services14.GetDiagnosticsRequest.KEY_OPTION.TRUNCATE : void 0
5820
+ });
5821
+ const clientDiagnostics = {
5822
+ config,
5823
+ trace: import_tracing7.TRACE_PROCESSOR.getDiagnostics()
5824
+ };
5825
+ const diagnostics = serviceDiagnostics != null ? {
5826
+ client: clientDiagnostics,
5827
+ services: serviceDiagnostics
5828
+ } : {
5829
+ client: clientDiagnostics,
5830
+ broadcast: await this.broadcastSender.broadcastDiagnosticsRequest()
5831
+ };
5832
+ return JSON.parse(JSON.stringify(diagnostics, (0, import_util8.jsonKeyReplacer)(options)));
5833
+ }
5834
+ };
5835
+ var findSystemServiceProvider = () => {
5836
+ const serviceProviders = import_tracing7.TRACE_PROCESSOR.findByAnnotation(ClientServicesProviderResource);
5837
+ const providerResource = serviceProviders.find((r) => r.instance.deref()?.services?.SystemService != null);
5838
+ return providerResource?.instance?.deref() ?? null;
5839
+ };
5840
+ var findConfigs = () => {
5841
+ const configs = import_tracing7.TRACE_PROCESSOR.findByAnnotation(import_config.ConfigResource);
5842
+ return configs.map((r) => r.instance.deref()).filter(import_util8.nonNullable);
5843
+ };
5604
5844
  // Annotate the CommonJS export names for ESM import in node:
5605
5845
  0 && (module.exports = {
5606
5846
  ClientRpcServer,
5607
5847
  ClientServicesHost,
5848
+ ClientServicesProviderResource,
5608
5849
  DataSpace,
5609
5850
  DataSpaceManager,
5610
5851
  DeviceInvitationProtocol,
5611
5852
  DevtoolsHostEvents,
5612
5853
  DevtoolsServiceImpl,
5854
+ DiagnosticsCollector,
5613
5855
  Identity,
5614
5856
  IdentityManager,
5615
5857
  IdentityServiceImpl,
5616
5858
  InvitationsHandler,
5859
+ InvitationsManager,
5617
5860
  InvitationsServiceImpl,
5618
5861
  Lock,
5619
5862
  ServiceContext,
@@ -5621,12 +5864,14 @@ ClientServicesHost = _ts_decorate8([
5621
5864
  SpaceInvitationProtocol,
5622
5865
  SpacesServiceImpl,
5623
5866
  TrustedKeySetAuthVerifier,
5867
+ createAdmissionKeypair,
5624
5868
  createAuthProvider,
5869
+ createCollectDiagnosticsBroadcastHandler,
5870
+ createCollectDiagnosticsBroadcastSender,
5625
5871
  createDiagnostics,
5626
5872
  createLevel,
5627
5873
  createStorageObjects,
5628
5874
  getNetworkPeers,
5629
- invitationExpired,
5630
5875
  isLocked,
5631
5876
  subscribeToFeedBlocks,
5632
5877
  subscribeToFeeds,
@@ -5636,4 +5881,4 @@ ClientServicesHost = _ts_decorate8([
5636
5881
  subscribeToSpaces,
5637
5882
  subscribeToSwarmInfo
5638
5883
  });
5639
- //# sourceMappingURL=chunk-7WXQVUAE.cjs.map
5884
+ //# sourceMappingURL=chunk-YXZQQAQN.cjs.map