@dxos/client-services 0.8.4-main.ae835ea → 0.8.4-main.bc674ce

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 (126) hide show
  1. package/dist/lib/browser/{chunk-KPYVJG6G.mjs → chunk-J33W6T4Q.mjs} +1025 -1331
  2. package/dist/lib/browser/chunk-J33W6T4Q.mjs.map +7 -0
  3. package/dist/lib/browser/chunk-NQSC7HOE.mjs +22 -0
  4. package/dist/lib/browser/chunk-NQSC7HOE.mjs.map +7 -0
  5. package/dist/lib/browser/chunk-QCWEHHJW.mjs +24 -0
  6. package/dist/lib/browser/chunk-QCWEHHJW.mjs.map +7 -0
  7. package/dist/lib/browser/index.mjs +432 -65
  8. package/dist/lib/browser/index.mjs.map +4 -4
  9. package/dist/lib/browser/meta.json +1 -1
  10. package/dist/lib/browser/packlets/diagnostics/browser-diagnostics-broadcast.mjs +93 -0
  11. package/dist/lib/browser/packlets/diagnostics/browser-diagnostics-broadcast.mjs.map +7 -0
  12. package/dist/lib/browser/packlets/diagnostics/diagnostics-broadcast.mjs +11 -0
  13. package/dist/lib/browser/packlets/diagnostics/diagnostics-broadcast.mjs.map +7 -0
  14. package/dist/lib/browser/packlets/locks/browser.mjs +126 -0
  15. package/dist/lib/browser/packlets/locks/browser.mjs.map +7 -0
  16. package/dist/lib/browser/packlets/locks/node.mjs +66 -0
  17. package/dist/lib/browser/packlets/locks/node.mjs.map +7 -0
  18. package/dist/lib/browser/testing/index.mjs +24 -12
  19. package/dist/lib/browser/testing/index.mjs.map +3 -3
  20. package/dist/lib/node-esm/chunk-2SZHAWBN.mjs +24 -0
  21. package/dist/lib/node-esm/chunk-2SZHAWBN.mjs.map +7 -0
  22. package/dist/lib/node-esm/{chunk-BBBSS6UL.mjs → chunk-34HKLADW.mjs} +517 -692
  23. package/dist/lib/node-esm/chunk-34HKLADW.mjs.map +7 -0
  24. package/dist/lib/node-esm/chunk-PKEGMOQ4.mjs +22 -0
  25. package/dist/lib/node-esm/chunk-PKEGMOQ4.mjs.map +7 -0
  26. package/dist/lib/node-esm/index.mjs +432 -65
  27. package/dist/lib/node-esm/index.mjs.map +4 -4
  28. package/dist/lib/node-esm/meta.json +1 -1
  29. package/dist/lib/node-esm/packlets/diagnostics/browser-diagnostics-broadcast.mjs +93 -0
  30. package/dist/lib/node-esm/packlets/diagnostics/browser-diagnostics-broadcast.mjs.map +7 -0
  31. package/dist/lib/node-esm/packlets/diagnostics/diagnostics-broadcast.mjs +11 -0
  32. package/dist/lib/node-esm/packlets/diagnostics/diagnostics-broadcast.mjs.map +7 -0
  33. package/dist/lib/node-esm/packlets/locks/browser.mjs +126 -0
  34. package/dist/lib/node-esm/packlets/locks/browser.mjs.map +7 -0
  35. package/dist/lib/node-esm/packlets/locks/node.mjs +66 -0
  36. package/dist/lib/node-esm/packlets/locks/node.mjs.map +7 -0
  37. package/dist/lib/node-esm/testing/index.mjs +24 -12
  38. package/dist/lib/node-esm/testing/index.mjs.map +3 -3
  39. package/dist/types/src/packlets/devtools/devtools.d.ts +2 -2
  40. package/dist/types/src/packlets/devtools/devtools.d.ts.map +1 -1
  41. package/dist/types/src/packlets/diagnostics/index.d.ts +1 -1
  42. package/dist/types/src/packlets/diagnostics/index.d.ts.map +1 -1
  43. package/dist/types/src/packlets/identity/authenticator.d.ts +2 -2
  44. package/dist/types/src/packlets/identity/authenticator.d.ts.map +1 -1
  45. package/dist/types/src/packlets/identity/default-space-state-machine.d.ts +2 -2
  46. package/dist/types/src/packlets/identity/default-space-state-machine.d.ts.map +1 -1
  47. package/dist/types/src/packlets/identity/identity-manager.d.ts +4 -4
  48. package/dist/types/src/packlets/identity/identity-manager.d.ts.map +1 -1
  49. package/dist/types/src/packlets/identity/identity-recovery-manager.d.ts +2 -2
  50. package/dist/types/src/packlets/identity/identity-recovery-manager.d.ts.map +1 -1
  51. package/dist/types/src/packlets/identity/identity.d.ts +2 -2
  52. package/dist/types/src/packlets/identity/identity.d.ts.map +1 -1
  53. package/dist/types/src/packlets/invitations/device-invitation-protocol.d.ts +4 -4
  54. package/dist/types/src/packlets/invitations/device-invitation-protocol.d.ts.map +1 -1
  55. package/dist/types/src/packlets/invitations/invitation-guest-extenstion.d.ts.map +1 -1
  56. package/dist/types/src/packlets/invitations/invitation-host-extension.d.ts.map +1 -1
  57. package/dist/types/src/packlets/invitations/invitation-protocol.d.ts +2 -3
  58. package/dist/types/src/packlets/invitations/invitation-protocol.d.ts.map +1 -1
  59. package/dist/types/src/packlets/invitations/invitations-handler.d.ts +4 -4
  60. package/dist/types/src/packlets/invitations/invitations-handler.d.ts.map +1 -1
  61. package/dist/types/src/packlets/invitations/space-invitation-protocol.d.ts +2 -2
  62. package/dist/types/src/packlets/invitations/space-invitation-protocol.d.ts.map +1 -1
  63. package/dist/types/src/packlets/locks/index.d.ts +1 -1
  64. package/dist/types/src/packlets/locks/index.d.ts.map +1 -1
  65. package/dist/types/src/packlets/services/client-rpc-server.d.ts +2 -2
  66. package/dist/types/src/packlets/services/client-rpc-server.d.ts.map +1 -1
  67. package/dist/types/src/packlets/services/service-context.d.ts +13 -7
  68. package/dist/types/src/packlets/services/service-context.d.ts.map +1 -1
  69. package/dist/types/src/packlets/services/service-host.d.ts +19 -5
  70. package/dist/types/src/packlets/services/service-host.d.ts.map +1 -1
  71. package/dist/types/src/packlets/space-export/space-archive-writer.d.ts.map +1 -1
  72. package/dist/types/src/packlets/spaces/data-space-manager.d.ts +10 -5
  73. package/dist/types/src/packlets/spaces/data-space-manager.d.ts.map +1 -1
  74. package/dist/types/src/packlets/spaces/data-space.d.ts +2 -2
  75. package/dist/types/src/packlets/spaces/data-space.d.ts.map +1 -1
  76. package/dist/types/src/packlets/spaces/edge-feed-replicator.d.ts +2 -2
  77. package/dist/types/src/packlets/spaces/edge-feed-replicator.d.ts.map +1 -1
  78. package/dist/types/src/packlets/spaces/notarization-plugin.d.ts +6 -6
  79. package/dist/types/src/packlets/spaces/notarization-plugin.d.ts.map +1 -1
  80. package/dist/types/src/packlets/spaces/spaces-service.d.ts.map +1 -1
  81. package/dist/types/src/packlets/testing/invitation-utils.d.ts +6 -3
  82. package/dist/types/src/packlets/testing/invitation-utils.d.ts.map +1 -1
  83. package/dist/types/src/packlets/testing/test-builder.d.ts +6 -5
  84. package/dist/types/src/packlets/testing/test-builder.d.ts.map +1 -1
  85. package/dist/types/src/packlets/worker/worker-runtime.d.ts +23 -4
  86. package/dist/types/src/packlets/worker/worker-runtime.d.ts.map +1 -1
  87. package/dist/types/src/packlets/worker/worker-session.d.ts +2 -2
  88. package/dist/types/src/packlets/worker/worker-session.d.ts.map +1 -1
  89. package/dist/types/src/version.d.ts +1 -1
  90. package/dist/types/tsconfig.tsbuildinfo +1 -1
  91. package/package.json +70 -48
  92. package/src/packlets/devtools/devtools.ts +2 -2
  93. package/src/packlets/diagnostics/index.ts +1 -1
  94. package/src/packlets/identity/authenticator.ts +2 -2
  95. package/src/packlets/identity/default-space-state-machine.ts +2 -2
  96. package/src/packlets/identity/identity-manager.ts +6 -6
  97. package/src/packlets/identity/identity-recovery-manager.ts +2 -2
  98. package/src/packlets/identity/identity.ts +2 -2
  99. package/src/packlets/invitations/device-invitation-protocol.ts +5 -5
  100. package/src/packlets/invitations/invitation-guest-extenstion.ts +6 -4
  101. package/src/packlets/invitations/invitation-host-extension.ts +6 -4
  102. package/src/packlets/invitations/invitation-protocol.ts +2 -3
  103. package/src/packlets/invitations/invitations-handler.ts +7 -7
  104. package/src/packlets/invitations/space-invitation-protocol.ts +7 -13
  105. package/src/packlets/locks/index.ts +1 -1
  106. package/src/packlets/logging/logging-service.ts +1 -1
  107. package/src/packlets/services/client-rpc-server.ts +4 -4
  108. package/src/packlets/services/service-context.ts +30 -19
  109. package/src/packlets/services/service-host.ts +56 -16
  110. package/src/packlets/space-export/space-archive-reader.ts +1 -1
  111. package/src/packlets/space-export/space-archive-writer.ts +3 -1
  112. package/src/packlets/spaces/data-space-manager.ts +43 -20
  113. package/src/packlets/spaces/data-space.ts +7 -6
  114. package/src/packlets/spaces/edge-feed-replicator.ts +2 -2
  115. package/src/packlets/spaces/epoch-migrations.ts +2 -2
  116. package/src/packlets/spaces/notarization-plugin.test.ts +2 -2
  117. package/src/packlets/spaces/notarization-plugin.ts +8 -8
  118. package/src/packlets/spaces/spaces-service.ts +10 -7
  119. package/src/packlets/storage/storage.ts +4 -4
  120. package/src/packlets/testing/invitation-utils.ts +7 -4
  121. package/src/packlets/testing/test-builder.ts +36 -10
  122. package/src/packlets/worker/worker-runtime.ts +141 -11
  123. package/src/packlets/worker/worker-session.ts +4 -4
  124. package/src/version.ts +1 -1
  125. package/dist/lib/browser/chunk-KPYVJG6G.mjs.map +0 -7
  126. package/dist/lib/node-esm/chunk-BBBSS6UL.mjs.map +0 -7
@@ -0,0 +1,93 @@
1
+ import "@dxos/node-std/globals";
2
+ import "../../chunk-QCWEHHJW.mjs";
3
+
4
+ // src/packlets/diagnostics/browser-diagnostics-broadcast.ts
5
+ import { Trigger } from "@dxos/async";
6
+ import { log } from "@dxos/log";
7
+ var __dxlog_file = "/__w/dxos/dxos/packages/sdk/client-services/src/packlets/diagnostics/browser-diagnostics-broadcast.ts";
8
+ var CHANNEL_NAME = "dxos.diagnostics.broadcast";
9
+ var createCollectDiagnosticsBroadcastSender = () => {
10
+ return {
11
+ broadcastDiagnosticsRequest: async () => {
12
+ let expectedResponse = "probe-ack";
13
+ let channel;
14
+ try {
15
+ const trigger = new Trigger();
16
+ channel = new BroadcastChannel(CHANNEL_NAME);
17
+ channel.onmessage = (msg) => {
18
+ if (expectedResponse === msg.data.type) {
19
+ trigger.wake(msg.data);
20
+ }
21
+ };
22
+ channel.postMessage({
23
+ type: "probe"
24
+ });
25
+ await trigger.wait({
26
+ timeout: 200
27
+ });
28
+ expectedResponse = "receive-diagnostics";
29
+ trigger.reset();
30
+ channel.postMessage({
31
+ type: "request-diagnostics"
32
+ });
33
+ const diagnostics = await trigger.wait({
34
+ timeout: 5e3
35
+ });
36
+ return diagnostics.payload;
37
+ } catch (e) {
38
+ const errorDescription = e instanceof Error ? e.message : JSON.stringify(e);
39
+ return {
40
+ expectedResponse,
41
+ errorDescription
42
+ };
43
+ } finally {
44
+ safeClose(channel);
45
+ }
46
+ }
47
+ };
48
+ };
49
+ var createCollectDiagnosticsBroadcastHandler = (systemService) => {
50
+ let channel;
51
+ return {
52
+ start: () => {
53
+ channel = new BroadcastChannel(CHANNEL_NAME);
54
+ channel.onmessage = async (message) => {
55
+ try {
56
+ if (message.data.type === "probe") {
57
+ channel?.postMessage({
58
+ type: "probe-ack"
59
+ });
60
+ } else if (message.data.type === "request-diagnostics") {
61
+ const diagnostics = await systemService.getDiagnostics({});
62
+ channel?.postMessage({
63
+ type: "receive-diagnostics",
64
+ payload: diagnostics
65
+ });
66
+ }
67
+ } catch (error) {
68
+ log.catch(error, void 0, {
69
+ F: __dxlog_file,
70
+ L: 77,
71
+ S: void 0,
72
+ C: (f, a) => f(...a)
73
+ });
74
+ }
75
+ };
76
+ },
77
+ stop: () => {
78
+ safeClose(channel);
79
+ channel = void 0;
80
+ }
81
+ };
82
+ };
83
+ var safeClose = (channel) => {
84
+ try {
85
+ channel?.close();
86
+ } catch (e) {
87
+ }
88
+ };
89
+ export {
90
+ createCollectDiagnosticsBroadcastHandler,
91
+ createCollectDiagnosticsBroadcastSender
92
+ };
93
+ //# sourceMappingURL=browser-diagnostics-broadcast.mjs.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../../../src/packlets/diagnostics/browser-diagnostics-broadcast.ts"],
4
+ "sourcesContent": ["//\n// Copyright 2024 DXOS.org\n//\n\nimport { Trigger } from '@dxos/async';\nimport { log } from '@dxos/log';\nimport { type SystemService } from '@dxos/protocols/proto/dxos/client/services';\n\nimport {\n type CollectDiagnosticsBroadcastHandler,\n type CollectDiagnosticsBroadcastSender,\n} from './diagnostics-collector';\n\nconst CHANNEL_NAME = 'dxos.diagnostics.broadcast';\n\nenum MessageType {\n PROBE = 'probe',\n PROBE_ACK = 'probe-ack',\n REQUEST_DIAGNOSTICS = 'request-diagnostics',\n RECEIVE_DIAGNOSTICS = 'receive-diagnostics',\n}\n\ninterface Message {\n type: MessageType;\n payload?: any;\n}\n\nexport const createCollectDiagnosticsBroadcastSender = (): CollectDiagnosticsBroadcastSender => {\n return {\n broadcastDiagnosticsRequest: async () => {\n let expectedResponse = MessageType.PROBE_ACK;\n let channel: BroadcastChannel | undefined;\n try {\n const trigger = new Trigger<Message>();\n channel = new BroadcastChannel(CHANNEL_NAME);\n channel.onmessage = (msg) => {\n if (expectedResponse === msg.data.type) {\n trigger.wake(msg.data);\n }\n };\n channel.postMessage({ type: MessageType.PROBE });\n await trigger.wait({ timeout: 200 });\n expectedResponse = MessageType.RECEIVE_DIAGNOSTICS;\n trigger.reset();\n channel.postMessage({ type: MessageType.REQUEST_DIAGNOSTICS });\n const diagnostics = await trigger.wait({ timeout: 5000 });\n return diagnostics.payload;\n } catch (e) {\n const errorDescription = e instanceof Error ? e.message : JSON.stringify(e);\n return { expectedResponse, errorDescription };\n } finally {\n safeClose(channel);\n }\n },\n };\n};\n\nexport const createCollectDiagnosticsBroadcastHandler = (\n systemService: SystemService,\n): CollectDiagnosticsBroadcastHandler => {\n let channel: BroadcastChannel | undefined;\n return {\n start: () => {\n channel = new BroadcastChannel(CHANNEL_NAME);\n channel.onmessage = async (message) => {\n try {\n if (message.data.type === MessageType.PROBE) {\n channel?.postMessage({ type: MessageType.PROBE_ACK });\n } else if (message.data.type === MessageType.REQUEST_DIAGNOSTICS) {\n const diagnostics = await systemService.getDiagnostics({});\n channel?.postMessage({\n type: MessageType.RECEIVE_DIAGNOSTICS,\n payload: diagnostics,\n });\n }\n } catch (error) {\n log.catch(error);\n }\n };\n },\n stop: () => {\n safeClose(channel);\n channel = undefined;\n },\n };\n};\n\nconst safeClose = (channel?: BroadcastChannel) => {\n try {\n channel?.close();\n } catch (e) {\n // ignored\n }\n};\n"],
5
+ "mappings": ";;;;AAIA,SAASA,eAAe;AACxB,SAASC,WAAW;;AAQpB,IAAMC,eAAe;AAcd,IAAMC,0CAA0C,MAAA;AACrD,SAAO;IACLC,6BAA6B,YAAA;AAC3B,UAAIC,mBAAAA;AACJ,UAAIC;AACJ,UAAI;AACF,cAAMC,UAAU,IAAIC,QAAAA;AACpBF,kBAAU,IAAIG,iBAAiBC,YAAAA;AAC/BJ,gBAAQK,YAAY,CAACC,QAAAA;AACnB,cAAIP,qBAAqBO,IAAIC,KAAKC,MAAM;AACtCP,oBAAQQ,KAAKH,IAAIC,IAAI;UACvB;QACF;AACAP,gBAAQU,YAAY;UAAEF,MAAI;QAAoB,CAAA;AAC9C,cAAMP,QAAQU,KAAK;UAAEC,SAAS;QAAI,CAAA;AAClCb,2BAAAA;AACAE,gBAAQY,MAAK;AACbb,gBAAQU,YAAY;UAAEF,MAAI;QAAkC,CAAA;AAC5D,cAAMM,cAAc,MAAMb,QAAQU,KAAK;UAAEC,SAAS;QAAK,CAAA;AACvD,eAAOE,YAAYC;MACrB,SAASC,GAAG;AACV,cAAMC,mBAAmBD,aAAaE,QAAQF,EAAEG,UAAUC,KAAKC,UAAUL,CAAAA;AACzE,eAAO;UAAEjB;UAAkBkB;QAAiB;MAC9C,UAAA;AACEK,kBAAUtB,OAAAA;MACZ;IACF;EACF;AACF;AAEO,IAAMuB,2CAA2C,CACtDC,kBAAAA;AAEA,MAAIxB;AACJ,SAAO;IACLyB,OAAO,MAAA;AACLzB,gBAAU,IAAIG,iBAAiBC,YAAAA;AAC/BJ,cAAQK,YAAY,OAAOc,YAAAA;AACzB,YAAI;AACF,cAAIA,QAAQZ,KAAKC,SAAI,SAAwB;AAC3CR,qBAASU,YAAY;cAAEF,MAAI;YAAwB,CAAA;UACrD,WAAWW,QAAQZ,KAAKC,SAAI,uBAAsC;AAChE,kBAAMM,cAAc,MAAMU,cAAcE,eAAe,CAAC,CAAA;AACxD1B,qBAASU,YAAY;cACnBF,MAAI;cACJO,SAASD;YACX,CAAA;UACF;QACF,SAASa,OAAO;AACdC,cAAIC,MAAMF,OAAAA,QAAAA;;;;;;QACZ;MACF;IACF;IACAG,MAAM,MAAA;AACJR,gBAAUtB,OAAAA;AACVA,gBAAU+B;IACZ;EACF;AACF;AAEA,IAAMT,YAAY,CAACtB,YAAAA;AACjB,MAAI;AACFA,aAASgC,MAAAA;EACX,SAAShB,GAAG;EAEZ;AACF;",
6
+ "names": ["Trigger", "log", "CHANNEL_NAME", "createCollectDiagnosticsBroadcastSender", "broadcastDiagnosticsRequest", "expectedResponse", "channel", "trigger", "Trigger", "BroadcastChannel", "CHANNEL_NAME", "onmessage", "msg", "data", "type", "wake", "postMessage", "wait", "timeout", "reset", "diagnostics", "payload", "e", "errorDescription", "Error", "message", "JSON", "stringify", "safeClose", "createCollectDiagnosticsBroadcastHandler", "systemService", "start", "getDiagnostics", "error", "log", "catch", "stop", "undefined", "close"]
7
+ }
@@ -0,0 +1,11 @@
1
+ import "@dxos/node-std/globals";
2
+ import {
3
+ createCollectDiagnosticsBroadcastHandler,
4
+ createCollectDiagnosticsBroadcastSender
5
+ } from "../../chunk-NQSC7HOE.mjs";
6
+ import "../../chunk-QCWEHHJW.mjs";
7
+ export {
8
+ createCollectDiagnosticsBroadcastHandler,
9
+ createCollectDiagnosticsBroadcastSender
10
+ };
11
+ //# sourceMappingURL=diagnostics-broadcast.mjs.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": [],
4
+ "sourcesContent": [],
5
+ "mappings": "",
6
+ "names": []
7
+ }
@@ -0,0 +1,126 @@
1
+ import "@dxos/node-std/globals";
2
+ import "../../chunk-QCWEHHJW.mjs";
3
+
4
+ // src/packlets/locks/browser.ts
5
+ import { Trigger, asyncTimeout } from "@dxos/async";
6
+ import { RESOURCE_LOCK_TIMEOUT } from "@dxos/client-protocol";
7
+ import { log, logInfo } from "@dxos/log";
8
+ function _ts_decorate(decorators, target, key, desc) {
9
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
10
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
11
+ else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
12
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
13
+ }
14
+ var __dxlog_file = "/__w/dxos/dxos/packages/sdk/client-services/src/packlets/locks/browser.ts";
15
+ var Lock = class {
16
+ _broadcastChannel = new BroadcastChannel("vault-resource-lock");
17
+ _lockKey;
18
+ _onAcquire;
19
+ _onRelease;
20
+ _releaseTrigger = new Trigger();
21
+ constructor({ lockKey, onAcquire, onRelease }) {
22
+ this._lockKey = lockKey;
23
+ this._onAcquire = onAcquire;
24
+ this._onRelease = onRelease;
25
+ this._broadcastChannel.onmessage = this._onMessage.bind(this);
26
+ }
27
+ get lockKey() {
28
+ return this._lockKey;
29
+ }
30
+ async acquire() {
31
+ this._broadcastChannel.postMessage({
32
+ message: "acquiring"
33
+ });
34
+ try {
35
+ log("aquiring lock...", void 0, {
36
+ F: __dxlog_file,
37
+ L: 42,
38
+ S: this,
39
+ C: (f, a) => f(...a)
40
+ });
41
+ await asyncTimeout(this._requestLock(), RESOURCE_LOCK_TIMEOUT);
42
+ log("acquired lock", void 0, {
43
+ F: __dxlog_file,
44
+ L: 44,
45
+ S: this,
46
+ C: (f, a) => f(...a)
47
+ });
48
+ } catch {
49
+ log("stealing lock...", void 0, {
50
+ F: __dxlog_file,
51
+ L: 46,
52
+ S: this,
53
+ C: (f, a) => f(...a)
54
+ });
55
+ await this._requestLock(true);
56
+ log("stolen lock", void 0, {
57
+ F: __dxlog_file,
58
+ L: 48,
59
+ S: this,
60
+ C: (f, a) => f(...a)
61
+ });
62
+ }
63
+ }
64
+ async release() {
65
+ this._releaseTrigger.wake();
66
+ }
67
+ _onMessage(event) {
68
+ if (event.data.message === "acquiring") {
69
+ this._releaseTrigger.wake();
70
+ }
71
+ }
72
+ async _requestLock(steal = false) {
73
+ log("requesting lock...", {
74
+ steal
75
+ }, {
76
+ F: __dxlog_file,
77
+ L: 63,
78
+ S: this,
79
+ C: (f, a) => f(...a)
80
+ });
81
+ const acquired = new Trigger();
82
+ void navigator.locks.request(this._lockKey, {
83
+ steal
84
+ }, async () => {
85
+ await this._onAcquire?.();
86
+ acquired.wake();
87
+ this._releaseTrigger = new Trigger();
88
+ await this._releaseTrigger.wait();
89
+ log("releasing lock...", void 0, {
90
+ F: __dxlog_file,
91
+ L: 72,
92
+ S: this,
93
+ C: (f, a) => f(...a)
94
+ });
95
+ await this._onRelease?.();
96
+ log("released lock", void 0, {
97
+ F: __dxlog_file,
98
+ L: 74,
99
+ S: this,
100
+ C: (f, a) => f(...a)
101
+ });
102
+ }).catch(async () => {
103
+ await this._onRelease?.();
104
+ });
105
+ await acquired.wait();
106
+ log("recieved lock", {
107
+ steal
108
+ }, {
109
+ F: __dxlog_file,
110
+ L: 81,
111
+ S: this,
112
+ C: (f, a) => f(...a)
113
+ });
114
+ }
115
+ };
116
+ _ts_decorate([
117
+ logInfo
118
+ ], Lock.prototype, "lockKey", null);
119
+ var isLocked = (lockPath) => {
120
+ throw new Error("Not implemented");
121
+ };
122
+ export {
123
+ Lock,
124
+ isLocked
125
+ };
126
+ //# sourceMappingURL=browser.mjs.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../../../src/packlets/locks/browser.ts"],
4
+ "sourcesContent": ["//\n// Copyright 2023 DXOS.org\n//\n\nimport { Trigger, asyncTimeout } from '@dxos/async';\nimport { RESOURCE_LOCK_TIMEOUT } from '@dxos/client-protocol';\nimport { log, logInfo } from '@dxos/log';\n\nimport { type ResourceLock, type ResourceLockOptions } from './resource-lock';\n\nenum Message {\n ACQUIRING = 'acquiring',\n}\n\n// TODO(mykola): Factor out.\n// TODO(burdon): Extend to support locking for web and NodeJS (use npm lockfile). Use to lock agents.\nexport class Lock implements ResourceLock {\n private readonly _broadcastChannel = new BroadcastChannel('vault-resource-lock');\n private readonly _lockKey: string;\n private readonly _onAcquire: ResourceLockOptions['onAcquire'];\n private readonly _onRelease: ResourceLockOptions['onRelease'];\n private _releaseTrigger = new Trigger();\n\n constructor({ lockKey, onAcquire, onRelease }: ResourceLockOptions) {\n this._lockKey = lockKey;\n this._onAcquire = onAcquire;\n this._onRelease = onRelease;\n this._broadcastChannel.onmessage = this._onMessage.bind(this);\n }\n\n @logInfo\n get lockKey() {\n return this._lockKey;\n }\n\n async acquire(): Promise<void> {\n this._broadcastChannel.postMessage({\n message: Message.ACQUIRING,\n });\n\n try {\n log('aquiring lock...');\n await asyncTimeout(this._requestLock(), RESOURCE_LOCK_TIMEOUT);\n log('acquired lock');\n } catch {\n log('stealing lock...');\n await this._requestLock(true);\n log('stolen lock');\n }\n }\n\n async release(): Promise<void> {\n this._releaseTrigger.wake();\n }\n\n private _onMessage(event: MessageEvent<any>): void {\n if (event.data.message === Message.ACQUIRING) {\n this._releaseTrigger.wake();\n }\n }\n\n private async _requestLock(steal = false): Promise<void> {\n log('requesting lock...', { steal });\n const acquired = new Trigger();\n\n void navigator.locks\n .request(this._lockKey, { steal }, async () => {\n await this._onAcquire?.();\n acquired.wake();\n this._releaseTrigger = new Trigger();\n await this._releaseTrigger.wait();\n log('releasing lock...');\n await this._onRelease?.();\n log('released lock');\n })\n .catch(async () => {\n await this._onRelease?.();\n });\n\n await acquired.wait();\n log('recieved lock', { steal });\n }\n}\n\n// TODO(mykola): Implement.\nexport const isLocked = (lockPath: string) => {\n throw new Error('Not implemented');\n};\n"],
5
+ "mappings": ";;;;AAIA,SAASA,SAASC,oBAAoB;AACtC,SAASC,6BAA6B;AACtC,SAASC,KAAKC,eAAe;;;;;;;;AAUtB,IAAMC,OAAN,MAAMA;EACMC,oBAAoB,IAAIC,iBAAiB,qBAAA;EACzCC;EACAC;EACAC;EACTC,kBAAkB,IAAIC,QAAAA;EAE9B,YAAY,EAAEC,SAASC,WAAWC,UAAS,GAAyB;AAClE,SAAKP,WAAWK;AAChB,SAAKJ,aAAaK;AAClB,SAAKJ,aAAaK;AAClB,SAAKT,kBAAkBU,YAAY,KAAKC,WAAWC,KAAK,IAAI;EAC9D;EAEA,IACIL,UAAU;AACZ,WAAO,KAAKL;EACd;EAEA,MAAMW,UAAyB;AAC7B,SAAKb,kBAAkBc,YAAY;MACjCC,SAAO;IACT,CAAA;AAEA,QAAI;AACFC,UAAI,oBAAA,QAAA;;;;;;AACJ,YAAMC,aAAa,KAAKC,aAAY,GAAIC,qBAAAA;AACxCH,UAAI,iBAAA,QAAA;;;;;;IACN,QAAQ;AACNA,UAAI,oBAAA,QAAA;;;;;;AACJ,YAAM,KAAKE,aAAa,IAAA;AACxBF,UAAI,eAAA,QAAA;;;;;;IACN;EACF;EAEA,MAAMI,UAAyB;AAC7B,SAAKf,gBAAgBgB,KAAI;EAC3B;EAEQV,WAAWW,OAAgC;AACjD,QAAIA,MAAMC,KAAKR,YAAO,aAAwB;AAC5C,WAAKV,gBAAgBgB,KAAI;IAC3B;EACF;EAEA,MAAcH,aAAaM,QAAQ,OAAsB;AACvDR,QAAI,sBAAsB;MAAEQ;IAAM,GAAA;;;;;;AAClC,UAAMC,WAAW,IAAInB,QAAAA;AAErB,SAAKoB,UAAUC,MACZC,QAAQ,KAAK1B,UAAU;MAAEsB;IAAM,GAAG,YAAA;AACjC,YAAM,KAAKrB,aAAU;AACrBsB,eAASJ,KAAI;AACb,WAAKhB,kBAAkB,IAAIC,QAAAA;AAC3B,YAAM,KAAKD,gBAAgBwB,KAAI;AAC/Bb,UAAI,qBAAA,QAAA;;;;;;AACJ,YAAM,KAAKZ,aAAU;AACrBY,UAAI,iBAAA,QAAA;;;;;;IACN,CAAA,EACCc,MAAM,YAAA;AACL,YAAM,KAAK1B,aAAU;IACvB,CAAA;AAEF,UAAMqB,SAASI,KAAI;AACnBb,QAAI,iBAAiB;MAAEQ;IAAM,GAAA;;;;;;EAC/B;AACF;;;;AAGO,IAAMO,WAAW,CAACC,aAAAA;AACvB,QAAM,IAAIC,MAAM,iBAAA;AAClB;",
6
+ "names": ["Trigger", "asyncTimeout", "RESOURCE_LOCK_TIMEOUT", "log", "logInfo", "Lock", "_broadcastChannel", "BroadcastChannel", "_lockKey", "_onAcquire", "_onRelease", "_releaseTrigger", "Trigger", "lockKey", "onAcquire", "onRelease", "onmessage", "_onMessage", "bind", "acquire", "postMessage", "message", "log", "asyncTimeout", "_requestLock", "RESOURCE_LOCK_TIMEOUT", "release", "wake", "event", "data", "steal", "acquired", "navigator", "locks", "request", "wait", "catch", "isLocked", "lockPath", "Error"]
7
+ }
@@ -0,0 +1,66 @@
1
+ import "@dxos/node-std/globals";
2
+ import "../../chunk-QCWEHHJW.mjs";
3
+
4
+ // src/packlets/locks/node.ts
5
+ import { invariant } from "@dxos/invariant";
6
+ import { LockFile } from "@dxos/lock-file";
7
+ import { log, logInfo } from "@dxos/log";
8
+ function _ts_decorate(decorators, target, key, desc) {
9
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
10
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
11
+ else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
12
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
13
+ }
14
+ var __dxlog_file = "/__w/dxos/dxos/packages/sdk/client-services/src/packlets/locks/node.ts";
15
+ var Lock = class {
16
+ _lockPath;
17
+ _onAcquire;
18
+ _onRelease;
19
+ _fileHandle;
20
+ constructor({ lockKey: lockPath, onAcquire, onRelease }) {
21
+ this._lockPath = lockPath;
22
+ this._onAcquire = onAcquire;
23
+ this._onRelease = onRelease;
24
+ }
25
+ get lockKey() {
26
+ return this._lockPath;
27
+ }
28
+ async acquire() {
29
+ log("acquiring lock...", void 0, {
30
+ F: __dxlog_file,
31
+ L: 32,
32
+ S: this,
33
+ C: (f, a) => f(...a)
34
+ });
35
+ this._fileHandle = await LockFile.acquire(this._lockPath);
36
+ await this._onAcquire?.();
37
+ log("acquired lock", void 0, {
38
+ F: __dxlog_file,
39
+ L: 37,
40
+ S: this,
41
+ C: (f, a) => f(...a)
42
+ });
43
+ }
44
+ async release() {
45
+ await this._onRelease?.();
46
+ invariant(this._fileHandle, "Lock is not acquired", {
47
+ F: __dxlog_file,
48
+ L: 42,
49
+ S: this,
50
+ A: [
51
+ "this._fileHandle",
52
+ "'Lock is not acquired'"
53
+ ]
54
+ });
55
+ await LockFile.release(this._fileHandle);
56
+ }
57
+ };
58
+ _ts_decorate([
59
+ logInfo
60
+ ], Lock.prototype, "lockKey", null);
61
+ var isLocked = (lockPath) => LockFile.isLocked(lockPath);
62
+ export {
63
+ Lock,
64
+ isLocked
65
+ };
66
+ //# sourceMappingURL=node.mjs.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../../../src/packlets/locks/node.ts"],
4
+ "sourcesContent": ["//\n// Copyright 2023 DXOS.org\n//\n\nimport { type FileHandle } from 'node:fs/promises';\n\nimport { invariant } from '@dxos/invariant';\nimport { LockFile } from '@dxos/lock-file';\nimport { log, logInfo } from '@dxos/log';\n\nimport { type ResourceLock, type ResourceLockOptions } from './resource-lock';\n\n// TODO(mykola): Factor out.\nexport class Lock implements ResourceLock {\n private readonly _lockPath: string;\n private readonly _onAcquire: ResourceLockOptions['onAcquire'];\n private readonly _onRelease: ResourceLockOptions['onRelease'];\n private _fileHandle?: FileHandle;\n\n constructor({ lockKey: lockPath, onAcquire, onRelease }: ResourceLockOptions) {\n this._lockPath = lockPath;\n this._onAcquire = onAcquire;\n this._onRelease = onRelease;\n }\n\n @logInfo\n get lockKey() {\n return this._lockPath;\n }\n\n async acquire(): Promise<void> {\n log('acquiring lock...');\n this._fileHandle = await LockFile.acquire(this._lockPath);\n\n await this._onAcquire?.();\n\n log('acquired lock');\n }\n\n async release(): Promise<void> {\n await this._onRelease?.();\n invariant(this._fileHandle, 'Lock is not acquired');\n await LockFile.release(this._fileHandle);\n }\n}\n\nexport const isLocked = (lockPath: string) => LockFile.isLocked(lockPath);\n"],
5
+ "mappings": ";;;;AAMA,SAASA,iBAAiB;AAC1B,SAASC,gBAAgB;AACzB,SAASC,KAAKC,eAAe;;;;;;;;AAKtB,IAAMC,OAAN,MAAMA;EACMC;EACAC;EACAC;EACTC;EAER,YAAY,EAAEC,SAASC,UAAUC,WAAWC,UAAS,GAAyB;AAC5E,SAAKP,YAAYK;AACjB,SAAKJ,aAAaK;AAClB,SAAKJ,aAAaK;EACpB;EAEA,IACIH,UAAU;AACZ,WAAO,KAAKJ;EACd;EAEA,MAAMQ,UAAyB;AAC7BX,QAAI,qBAAA,QAAA;;;;;;AACJ,SAAKM,cAAc,MAAMP,SAASY,QAAQ,KAAKR,SAAS;AAExD,UAAM,KAAKC,aAAU;AAErBJ,QAAI,iBAAA,QAAA;;;;;;EACN;EAEA,MAAMY,UAAyB;AAC7B,UAAM,KAAKP,aAAU;AACrBP,cAAU,KAAKQ,aAAa,wBAAA;;;;;;;;;AAC5B,UAAMP,SAASa,QAAQ,KAAKN,WAAW;EACzC;AACF;;;;AAEO,IAAMO,WAAW,CAACL,aAAqBT,SAASc,SAASL,QAAAA;",
6
+ "names": ["invariant", "LockFile", "log", "logInfo", "Lock", "_lockPath", "_onAcquire", "_onRelease", "_fileHandle", "lockKey", "lockPath", "onAcquire", "onRelease", "acquire", "release", "isLocked"]
7
+ }
@@ -6,7 +6,9 @@ import {
6
6
  InvitationsManager,
7
7
  ServiceContext,
8
8
  SpaceInvitationProtocol
9
- } from "../chunk-KPYVJG6G.mjs";
9
+ } from "../chunk-J33W6T4Q.mjs";
10
+ import "../chunk-NQSC7HOE.mjs";
11
+ import "../chunk-QCWEHHJW.mjs";
10
12
 
11
13
  // src/packlets/testing/credential-utils.ts
12
14
  import { createCredential } from "@dxos/credentials";
@@ -33,7 +35,7 @@ var __dxlog_file = "/__w/dxos/dxos/packages/sdk/client-services/src/packlets/tes
33
35
  var sanitizeInvitation = (invitation) => {
34
36
  return InvitationEncoder.decode(InvitationEncoder.encode(invitation));
35
37
  };
36
- var performInvitation = ({ host, guest, options, hooks, guestDeviceProfile, codeInputDelay }) => {
38
+ var performInvitation = ({ host, guest, guestDeviceProfile, options, hooks, codeInputDelay }) => {
37
39
  let guestError = false;
38
40
  let guestConnected = false;
39
41
  let wereConnected = false;
@@ -65,7 +67,7 @@ var performInvitation = ({ host, guest, options, hooks, guestDeviceProfile, code
65
67
  }
66
68
  invariant(hostInvitation.swarmKey.equals(guestInvitation.swarmKey), void 0, {
67
69
  F: __dxlog_file,
68
- L: 95,
70
+ L: 98,
69
71
  S: void 0,
70
72
  A: [
71
73
  "hostInvitation.swarmKey!.equals(guestInvitation.swarmKey!)",
@@ -221,6 +223,9 @@ var acceptInvitation = (guest, invitation, guestDeviceProfile) => {
221
223
  };
222
224
 
223
225
  // src/packlets/testing/test-builder.ts
226
+ import * as Reactivity from "@effect/experimental/Reactivity";
227
+ import * as Layer from "effect/Layer";
228
+ import * as ManagedRuntime from "effect/ManagedRuntime";
224
229
  import { Context } from "@dxos/context";
225
230
  import { CredentialGenerator, createCredentialSignerWithChain } from "@dxos/credentials";
226
231
  import { failUndefined } from "@dxos/debug";
@@ -232,13 +237,16 @@ import { MemorySignalManager, MemorySignalManagerContext } from "@dxos/messaging
232
237
  import { MemoryTransportFactory, SwarmNetworkManager } from "@dxos/network-manager";
233
238
  import { Invitation as Invitation2 } from "@dxos/protocols/proto/dxos/client/services";
234
239
  import { StorageType, createStorage } from "@dxos/random-access-storage";
240
+ import { layerMemory as sqliteLayerMemory } from "@dxos/sql-sqlite/platform";
241
+ import * as SqlTransaction from "@dxos/sql-sqlite/SqlTransaction";
235
242
  import { BlobStore } from "@dxos/teleport-extension-object-sync";
236
243
  var __dxlog_file2 = "/__w/dxos/dxos/packages/sdk/client-services/src/packlets/testing/test-builder.ts";
237
244
  var createServiceHost = (config, signalManagerContext) => {
238
245
  return new ClientServicesHost({
239
246
  config,
240
247
  signalManager: new MemorySignalManager(signalManagerContext),
241
- transportFactory: MemoryTransportFactory
248
+ transportFactory: MemoryTransportFactory,
249
+ runtime: ManagedRuntime.make(SqlTransaction.layer.pipe(Layer.provideMerge(sqliteLayerMemory), Layer.provideMerge(Reactivity.layer)).pipe(Layer.orDie)).runtimeEffect
242
250
  });
243
251
  };
244
252
  var createServiceContext = async ({ signalManagerFactory = async () => {
@@ -246,7 +254,7 @@ var createServiceContext = async ({ signalManagerFactory = async () => {
246
254
  return new MemorySignalManager(signalContext);
247
255
  }, storage = createStorage({
248
256
  type: StorageType.RAM
249
- }), runtimeParams } = {}) => {
257
+ }), runtimeProps } = {}) => {
250
258
  const signalManager = await signalManagerFactory();
251
259
  const networkManager = new SwarmNetworkManager({
252
260
  signalManager,
@@ -254,13 +262,14 @@ var createServiceContext = async ({ signalManagerFactory = async () => {
254
262
  });
255
263
  const level = createTestLevel();
256
264
  await level.open();
257
- return new ServiceContext(storage, level, networkManager, signalManager, void 0, void 0, {
258
- invitationConnectionDefaultParams: {
265
+ const runtime = ManagedRuntime.make(SqlTransaction.layer.pipe(Layer.provideMerge(sqliteLayerMemory), Layer.provideMerge(Reactivity.layer)).pipe(Layer.orDie)).runtimeEffect;
266
+ return new ServiceContext(storage, level, networkManager, signalManager, void 0, void 0, runtime, {
267
+ invitationConnectionDefaultProps: {
259
268
  teleport: {
260
269
  controlHeartbeatInterval: 200
261
270
  }
262
271
  },
263
- ...runtimeParams
272
+ ...runtimeProps
264
273
  });
265
274
  };
266
275
  var createPeers = async (numPeers, signalManagerFactory) => {
@@ -274,7 +283,7 @@ var createPeers = async (numPeers, signalManagerFactory) => {
274
283
  });
275
284
  await peer.open(new Context(void 0, {
276
285
  F: __dxlog_file2,
277
- L: 70
286
+ L: 87
278
287
  }));
279
288
  return peer;
280
289
  }));
@@ -287,7 +296,7 @@ var TestBuilder = class {
287
296
  signalContext = new MemorySignalManagerContext();
288
297
  _ctx = new Context(void 0, {
289
298
  F: __dxlog_file2,
290
- L: 83
299
+ L: 100
291
300
  });
292
301
  createPeer(peerOptions) {
293
302
  const peer = new TestPeer(this.signalContext, peerOptions);
@@ -302,6 +311,7 @@ var TestPeer = class {
302
311
  _signalContext;
303
312
  _opts;
304
313
  _props = {};
314
+ _runtime = ManagedRuntime.make(SqlTransaction.layer.pipe(Layer.provideMerge(sqliteLayerMemory), Layer.provideMerge(Reactivity.layer)).pipe(Layer.orDie));
305
315
  constructor(_signalContext, _opts = {
306
316
  dataStore: StorageType.RAM
307
317
  }) {
@@ -358,7 +368,8 @@ var TestPeer = class {
358
368
  }
359
369
  get echoHost() {
360
370
  return this._props.echoHost ??= new EchoHost({
361
- kv: this.level
371
+ kv: this.level,
372
+ runtime: this._runtime.runtimeEffect
362
373
  });
363
374
  }
364
375
  get meshEchoReplicator() {
@@ -376,7 +387,7 @@ var TestPeer = class {
376
387
  edgeConnection: void 0,
377
388
  meshReplicator: this.meshEchoReplicator,
378
389
  echoEdgeReplicator: void 0,
379
- runtimeParams: this._opts.dataSpaceParams
390
+ runtimeProps: this._opts.dataSpaceProps
380
391
  });
381
392
  }
382
393
  get invitationsManager() {
@@ -398,6 +409,7 @@ var TestPeer = class {
398
409
  async destroy() {
399
410
  await this.level.close();
400
411
  await this.storage.reset();
412
+ await this._runtime.dispose();
401
413
  }
402
414
  };
403
415
  var createSigningContext = async (keyring) => {