@multiplayer-app/sandbox 0.0.31 → 0.0.32

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 (186) hide show
  1. package/dist/agents/html-generator.agent.d.ts +3 -1
  2. package/dist/agents/html-generator.agent.d.ts.map +1 -1
  3. package/dist/agents/html-generator.agent.js +90 -4
  4. package/dist/agents/html-generator.agent.js.map +1 -1
  5. package/dist/agents/markdown-generator.agent.d.ts.map +1 -1
  6. package/dist/agents/markdown-generator.agent.js +5 -10
  7. package/dist/agents/markdown-generator.agent.js.map +1 -1
  8. package/dist/agents/shared/app-vm.tools.d.ts +4 -0
  9. package/dist/agents/shared/app-vm.tools.d.ts.map +1 -0
  10. package/dist/agents/shared/app-vm.tools.js +105 -0
  11. package/dist/agents/shared/app-vm.tools.js.map +1 -0
  12. package/dist/agents/shared/build-plan.tools.d.ts +5 -0
  13. package/dist/agents/shared/build-plan.tools.d.ts.map +1 -0
  14. package/dist/agents/shared/build-plan.tools.js +176 -0
  15. package/dist/agents/shared/build-plan.tools.js.map +1 -0
  16. package/dist/agents/shared/session-quality-report.tool.d.ts +7 -0
  17. package/dist/agents/shared/session-quality-report.tool.d.ts.map +1 -0
  18. package/dist/agents/shared/session-quality-report.tool.js +97 -0
  19. package/dist/agents/shared/session-quality-report.tool.js.map +1 -0
  20. package/dist/agents/shared/session-vm-bridge.d.ts +49 -0
  21. package/dist/agents/shared/session-vm-bridge.d.ts.map +1 -0
  22. package/dist/agents/shared/session-vm-bridge.js +9 -0
  23. package/dist/agents/shared/session-vm-bridge.js.map +1 -0
  24. package/dist/agents/skills/a11y.skill.d.ts +3 -0
  25. package/dist/agents/skills/a11y.skill.d.ts.map +1 -0
  26. package/dist/agents/skills/a11y.skill.js +23 -0
  27. package/dist/agents/skills/a11y.skill.js.map +1 -0
  28. package/dist/agents/skills/account-skill-loader.d.ts +13 -0
  29. package/dist/agents/skills/account-skill-loader.d.ts.map +1 -0
  30. package/dist/agents/skills/account-skill-loader.js +42 -0
  31. package/dist/agents/skills/account-skill-loader.js.map +1 -0
  32. package/dist/agents/skills/app-scaffold.skill.d.ts +3 -0
  33. package/dist/agents/skills/app-scaffold.skill.d.ts.map +1 -0
  34. package/dist/agents/skills/app-scaffold.skill.js +30 -0
  35. package/dist/agents/skills/app-scaffold.skill.js.map +1 -0
  36. package/dist/agents/skills/copywriting.skill.d.ts +3 -0
  37. package/dist/agents/skills/copywriting.skill.d.ts.map +1 -0
  38. package/dist/agents/skills/copywriting.skill.js +35 -0
  39. package/dist/agents/skills/copywriting.skill.js.map +1 -0
  40. package/dist/agents/skills/custom-skill-repository.d.ts +40 -0
  41. package/dist/agents/skills/custom-skill-repository.d.ts.map +1 -0
  42. package/dist/agents/skills/custom-skill-repository.js +3 -0
  43. package/dist/agents/skills/custom-skill-repository.js.map +1 -0
  44. package/dist/agents/skills/data-viz.skill.d.ts +3 -0
  45. package/dist/agents/skills/data-viz.skill.d.ts.map +1 -0
  46. package/dist/agents/skills/data-viz.skill.js +42 -0
  47. package/dist/agents/skills/data-viz.skill.js.map +1 -0
  48. package/dist/agents/skills/designer.skill.d.ts +3 -0
  49. package/dist/agents/skills/designer.skill.d.ts.map +1 -0
  50. package/dist/agents/skills/designer.skill.js +139 -0
  51. package/dist/agents/skills/designer.skill.js.map +1 -0
  52. package/dist/agents/skills/forms.skill.d.ts +3 -0
  53. package/dist/agents/skills/forms.skill.d.ts.map +1 -0
  54. package/dist/agents/skills/forms.skill.js +37 -0
  55. package/dist/agents/skills/forms.skill.js.map +1 -0
  56. package/dist/agents/skills/index.d.ts +6 -0
  57. package/dist/agents/skills/index.d.ts.map +1 -0
  58. package/dist/agents/skills/index.js +18 -0
  59. package/dist/agents/skills/index.js.map +1 -0
  60. package/dist/agents/skills/interactions.skill.d.ts +3 -0
  61. package/dist/agents/skills/interactions.skill.d.ts.map +1 -0
  62. package/dist/agents/skills/interactions.skill.js +31 -0
  63. package/dist/agents/skills/interactions.skill.js.map +1 -0
  64. package/dist/agents/skills/registry.d.ts +23 -0
  65. package/dist/agents/skills/registry.d.ts.map +1 -0
  66. package/dist/agents/skills/registry.js +75 -0
  67. package/dist/agents/skills/registry.js.map +1 -0
  68. package/dist/agents/skills/skill-injection.d.ts +52 -0
  69. package/dist/agents/skills/skill-injection.d.ts.map +1 -0
  70. package/dist/agents/skills/skill-injection.js +210 -0
  71. package/dist/agents/skills/skill-injection.js.map +1 -0
  72. package/dist/agents/skills/types.d.ts +12 -0
  73. package/dist/agents/skills/types.d.ts.map +1 -0
  74. package/dist/agents/skills/types.js +3 -0
  75. package/dist/agents/skills/types.js.map +1 -0
  76. package/dist/builder-api-config.d.ts +7 -0
  77. package/dist/builder-api-config.d.ts.map +1 -1
  78. package/dist/builder-api-config.js.map +1 -1
  79. package/dist/context.d.ts +7 -0
  80. package/dist/context.d.ts.map +1 -1
  81. package/dist/context.js +19 -0
  82. package/dist/context.js.map +1 -1
  83. package/dist/create-builder-api.d.ts +2 -3
  84. package/dist/create-builder-api.d.ts.map +1 -1
  85. package/dist/create-builder-api.js +18 -0
  86. package/dist/create-builder-api.js.map +1 -1
  87. package/dist/index.d.ts +2 -1
  88. package/dist/index.d.ts.map +1 -1
  89. package/dist/index.js +2 -1
  90. package/dist/index.js.map +1 -1
  91. package/dist/lib/library/list-library-items.d.ts +2 -2
  92. package/dist/lib/library/list-library-items.d.ts.map +1 -1
  93. package/dist/lib/library/list-library-items.js +49 -7
  94. package/dist/lib/library/list-library-items.js.map +1 -1
  95. package/dist/lib/object-storage/index.d.ts +3 -0
  96. package/dist/lib/object-storage/index.d.ts.map +1 -0
  97. package/dist/lib/object-storage/index.js +19 -0
  98. package/dist/lib/object-storage/index.js.map +1 -0
  99. package/dist/lib/object-storage/keys.d.ts +10 -0
  100. package/dist/lib/object-storage/keys.d.ts.map +1 -0
  101. package/dist/lib/object-storage/keys.js +51 -0
  102. package/dist/lib/object-storage/keys.js.map +1 -0
  103. package/dist/lib/object-storage/s3-object-store.d.ts +14 -0
  104. package/dist/lib/object-storage/s3-object-store.d.ts.map +1 -0
  105. package/dist/lib/object-storage/s3-object-store.js +64 -0
  106. package/dist/lib/object-storage/s3-object-store.js.map +1 -0
  107. package/dist/lib/session-pages/artifact-quality-audit.d.ts +16 -0
  108. package/dist/lib/session-pages/artifact-quality-audit.d.ts.map +1 -0
  109. package/dist/lib/session-pages/artifact-quality-audit.js +293 -0
  110. package/dist/lib/session-pages/artifact-quality-audit.js.map +1 -0
  111. package/dist/lib/session-pages/artifact-storage.d.ts +3 -0
  112. package/dist/lib/session-pages/artifact-storage.d.ts.map +1 -1
  113. package/dist/lib/session-pages/artifact-storage.js +94 -85
  114. package/dist/lib/session-pages/artifact-storage.js.map +1 -1
  115. package/dist/lib/session-pages/audit-session-html.d.ts +23 -0
  116. package/dist/lib/session-pages/audit-session-html.d.ts.map +1 -0
  117. package/dist/lib/session-pages/audit-session-html.js +82 -0
  118. package/dist/lib/session-pages/audit-session-html.js.map +1 -0
  119. package/dist/lib/session-pages/contrast-check.d.ts +25 -0
  120. package/dist/lib/session-pages/contrast-check.d.ts.map +1 -0
  121. package/dist/lib/session-pages/contrast-check.js +290 -0
  122. package/dist/lib/session-pages/contrast-check.js.map +1 -0
  123. package/dist/lib/session-pages/deferred-quality-rules.d.ts +7 -0
  124. package/dist/lib/session-pages/deferred-quality-rules.d.ts.map +1 -0
  125. package/dist/lib/session-pages/deferred-quality-rules.js +25 -0
  126. package/dist/lib/session-pages/deferred-quality-rules.js.map +1 -0
  127. package/dist/lib/session-pages/delete-session-artifact.d.ts.map +1 -1
  128. package/dist/lib/session-pages/delete-session-artifact.js +12 -41
  129. package/dist/lib/session-pages/delete-session-artifact.js.map +1 -1
  130. package/dist/lib/session-pages/delete-session-artifacts.d.ts +0 -6
  131. package/dist/lib/session-pages/delete-session-artifacts.d.ts.map +1 -1
  132. package/dist/lib/session-pages/delete-session-artifacts.js +51 -15
  133. package/dist/lib/session-pages/delete-session-artifacts.js.map +1 -1
  134. package/dist/lib/session-pages/list-session-artifacts.d.ts.map +1 -1
  135. package/dist/lib/session-pages/list-session-artifacts.js +48 -48
  136. package/dist/lib/session-pages/list-session-artifacts.js.map +1 -1
  137. package/dist/lib/session-pages/read-session-artifacts.d.ts.map +1 -1
  138. package/dist/lib/session-pages/read-session-artifacts.js +4 -26
  139. package/dist/lib/session-pages/read-session-artifacts.js.map +1 -1
  140. package/dist/lib/session-pages/resolve-session-account-id.d.ts +3 -0
  141. package/dist/lib/session-pages/resolve-session-account-id.d.ts.map +1 -0
  142. package/dist/lib/session-pages/resolve-session-account-id.js +31 -0
  143. package/dist/lib/session-pages/resolve-session-account-id.js.map +1 -0
  144. package/dist/lib/session-pages/write-session-artifacts.d.ts +0 -2
  145. package/dist/lib/session-pages/write-session-artifacts.d.ts.map +1 -1
  146. package/dist/lib/session-pages/write-session-artifacts.js +8 -0
  147. package/dist/lib/session-pages/write-session-artifacts.js.map +1 -1
  148. package/dist/lib/session-plans/build-plan.d.ts +64 -0
  149. package/dist/lib/session-plans/build-plan.d.ts.map +1 -0
  150. package/dist/lib/session-plans/build-plan.js +134 -0
  151. package/dist/lib/session-plans/build-plan.js.map +1 -0
  152. package/dist/lib/yjs-pending/flush-lock.d.ts +6 -0
  153. package/dist/lib/yjs-pending/flush-lock.d.ts.map +1 -0
  154. package/dist/lib/yjs-pending/flush-lock.js +43 -0
  155. package/dist/lib/yjs-pending/flush-lock.js.map +1 -0
  156. package/dist/lib/yjs-pending/flush-worker.d.ts +5 -0
  157. package/dist/lib/yjs-pending/flush-worker.d.ts.map +1 -0
  158. package/dist/lib/yjs-pending/flush-worker.js +75 -0
  159. package/dist/lib/yjs-pending/flush-worker.js.map +1 -0
  160. package/dist/lib/yjs-pending/yjs-pending-updates-repository.d.ts +22 -0
  161. package/dist/lib/yjs-pending/yjs-pending-updates-repository.d.ts.map +1 -0
  162. package/dist/lib/yjs-pending/yjs-pending-updates-repository.js +3 -0
  163. package/dist/lib/yjs-pending/yjs-pending-updates-repository.js.map +1 -0
  164. package/dist/lib/yjs-pending/yjs-persistence.d.ts +23 -0
  165. package/dist/lib/yjs-pending/yjs-persistence.d.ts.map +1 -0
  166. package/dist/lib/yjs-pending/yjs-persistence.js +222 -0
  167. package/dist/lib/yjs-pending/yjs-persistence.js.map +1 -0
  168. package/dist/realtime/reset-session-artifact-y-docs.d.ts.map +1 -1
  169. package/dist/realtime/reset-session-artifact-y-docs.js +1 -6
  170. package/dist/realtime/reset-session-artifact-y-docs.js.map +1 -1
  171. package/dist/realtime/session-artifact-y-socket-io.d.ts +0 -5
  172. package/dist/realtime/session-artifact-y-socket-io.d.ts.map +1 -1
  173. package/dist/realtime/session-artifact-y-socket-io.js +5 -69
  174. package/dist/realtime/session-artifact-y-socket-io.js.map +1 -1
  175. package/dist/realtime/session-artifact-yjs-store.d.ts +3 -35
  176. package/dist/realtime/session-artifact-yjs-store.d.ts.map +1 -1
  177. package/dist/realtime/session-artifact-yjs-store.js +75 -235
  178. package/dist/realtime/session-artifact-yjs-store.js.map +1 -1
  179. package/dist/routes/sessions.d.ts.map +1 -1
  180. package/dist/routes/sessions.js +26 -6
  181. package/dist/routes/sessions.js.map +1 -1
  182. package/dist/routes/skills.d.ts +2 -0
  183. package/dist/routes/skills.d.ts.map +1 -0
  184. package/dist/routes/skills.js +140 -0
  185. package/dist/routes/skills.js.map +1 -0
  186. package/package.json +2 -2
@@ -0,0 +1,43 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.flushLockKey = flushLockKey;
4
+ exports.acquireFlushLock = acquireFlushLock;
5
+ exports.releaseFlushLock = releaseFlushLock;
6
+ exports.withFlushLock = withFlushLock;
7
+ const node_crypto_1 = require("node:crypto");
8
+ const UNLOCK_LUA = `
9
+ if redis.call("get", KEYS[1]) == ARGV[1] then
10
+ return redis.call("del", KEYS[1])
11
+ end
12
+ return 0
13
+ `;
14
+ function flushLockKey(documentId) {
15
+ return `yjs:flush-lock:${documentId}`;
16
+ }
17
+ async function acquireFlushLock(redis, documentId, ttlSeconds = 30) {
18
+ const token = (0, node_crypto_1.randomUUID)();
19
+ const result = await redis.set(flushLockKey(documentId), token, {
20
+ NX: true,
21
+ EX: ttlSeconds,
22
+ });
23
+ return result === 'OK' ? token : null;
24
+ }
25
+ async function releaseFlushLock(redis, documentId, token) {
26
+ await redis.eval(UNLOCK_LUA, {
27
+ keys: [flushLockKey(documentId)],
28
+ arguments: [token],
29
+ });
30
+ }
31
+ async function withFlushLock(redis, documentId, fn, ttlSeconds = 30) {
32
+ const token = await acquireFlushLock(redis, documentId, ttlSeconds);
33
+ if (!token) {
34
+ return null;
35
+ }
36
+ try {
37
+ return await fn();
38
+ }
39
+ finally {
40
+ await releaseFlushLock(redis, documentId, token);
41
+ }
42
+ }
43
+ //# sourceMappingURL=flush-lock.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"flush-lock.js","sourceRoot":"","sources":["../../../src/lib/yjs-pending/flush-lock.ts"],"names":[],"mappings":";;AAUA,oCAEC;AAED,4CAWC;AAED,4CASC;AAED,sCAeC;AArDD,6CAAwC;AAGxC,MAAM,UAAU,GAAG;;;;;CAKlB,CAAA;AAED,SAAgB,YAAY,CAAC,UAAkB;IAC7C,OAAO,kBAAkB,UAAU,EAAE,CAAA;AACvC,CAAC;AAEM,KAAK,UAAU,gBAAgB,CACpC,KAAsB,EACtB,UAAkB,EAClB,UAAU,GAAG,EAAE;IAEf,MAAM,KAAK,GAAG,IAAA,wBAAU,GAAE,CAAA;IAC1B,MAAM,MAAM,GAAG,MAAM,KAAK,CAAC,GAAG,CAAC,YAAY,CAAC,UAAU,CAAC,EAAE,KAAK,EAAE;QAC9D,EAAE,EAAE,IAAI;QACR,EAAE,EAAE,UAAU;KACf,CAAC,CAAA;IACF,OAAO,MAAM,KAAK,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,CAAA;AACvC,CAAC;AAEM,KAAK,UAAU,gBAAgB,CACpC,KAAsB,EACtB,UAAkB,EAClB,KAAa;IAEb,MAAM,KAAK,CAAC,IAAI,CAAC,UAAU,EAAE;QAC3B,IAAI,EAAE,CAAC,YAAY,CAAC,UAAU,CAAC,CAAC;QAChC,SAAS,EAAE,CAAC,KAAK,CAAC;KACnB,CAAC,CAAA;AACJ,CAAC;AAEM,KAAK,UAAU,aAAa,CACjC,KAAsB,EACtB,UAAkB,EAClB,EAAoB,EACpB,UAAU,GAAG,EAAE;IAEf,MAAM,KAAK,GAAG,MAAM,gBAAgB,CAAC,KAAK,EAAE,UAAU,EAAE,UAAU,CAAC,CAAA;IACnE,IAAI,CAAC,KAAK,EAAE,CAAC;QACX,OAAO,IAAI,CAAA;IACb,CAAC;IACD,IAAI,CAAC;QACH,OAAO,MAAM,EAAE,EAAE,CAAA;IACnB,CAAC;YAAS,CAAC;QACT,MAAM,gBAAgB,CAAC,KAAK,EAAE,UAAU,EAAE,KAAK,CAAC,CAAA;IAClD,CAAC;AACH,CAAC"}
@@ -0,0 +1,5 @@
1
+ export declare function runYjsFlushTick(): Promise<void>;
2
+ export declare function sweepExpiredNamedSnapshotsForPrefix(prefix: string): Promise<number>;
3
+ export declare function startYjsFlushWorker(): void;
4
+ export declare function stopYjsFlushWorker(): void;
5
+ //# sourceMappingURL=flush-worker.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"flush-worker.d.ts","sourceRoot":"","sources":["../../../src/lib/yjs-pending/flush-worker.ts"],"names":[],"mappings":"AAyBA,wBAAsB,eAAe,IAAI,OAAO,CAAC,IAAI,CAAC,CAYrD;AAED,wBAAsB,mCAAmC,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAczF;AAED,wBAAgB,mBAAmB,IAAI,IAAI,CAU1C;AAED,wBAAgB,kBAAkB,IAAI,IAAI,CAKzC"}
@@ -0,0 +1,75 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.runYjsFlushTick = runYjsFlushTick;
4
+ exports.sweepExpiredNamedSnapshotsForPrefix = sweepExpiredNamedSnapshotsForPrefix;
5
+ exports.startYjsFlushWorker = startYjsFlushWorker;
6
+ exports.stopYjsFlushWorker = stopYjsFlushWorker;
7
+ const context_1 = require("../../context");
8
+ const logger_1 = require("../../logger");
9
+ const artifact_storage_paths_1 = require("../session-pages/artifact-storage-paths");
10
+ const s3_object_store_1 = require("../object-storage/s3-object-store");
11
+ const yjs_persistence_1 = require("./yjs-persistence");
12
+ const SNAPSHOT_RETENTION_MS = 7 * 24 * 60 * 60 * 1000;
13
+ const SNAPSHOT_SEGMENT = '.snapshot-';
14
+ let flushTimer = null;
15
+ function parseSnapshotTimestamp(key) {
16
+ const idx = key.lastIndexOf(SNAPSHOT_SEGMENT);
17
+ if (idx < 0) {
18
+ return null;
19
+ }
20
+ const stamp = key.slice(idx + SNAPSHOT_SEGMENT.length);
21
+ const match = /^(\d{4}-\d{2}-\d{2})T(\d{2})-(\d{2})-(\d{2})-(\d{3})Z$/.exec(stamp);
22
+ if (!match) {
23
+ return null;
24
+ }
25
+ const ms = Date.parse(`${match[1]}T${match[2]}:${match[3]}:${match[4]}.${match[5]}Z`);
26
+ return Number.isFinite(ms) ? ms : null;
27
+ }
28
+ async function runYjsFlushTick() {
29
+ if (!(0, context_1.getSharedRedisClient)()) {
30
+ return;
31
+ }
32
+ const documentIds = await (0, context_1.getYjsPendingUpdatesRepository)().listDocumentIdsWithPending(100);
33
+ for (const documentId of documentIds) {
34
+ try {
35
+ await (0, yjs_persistence_1.flushDocumentToS3)(documentId);
36
+ }
37
+ catch (error) {
38
+ (0, logger_1.getBuilderApiLogger)().warn({ err: error, documentId }, 'Yjs S3 flush failed');
39
+ }
40
+ }
41
+ }
42
+ async function sweepExpiredNamedSnapshotsForPrefix(prefix) {
43
+ const cutoff = Date.now() - SNAPSHOT_RETENTION_MS;
44
+ let deleted = 0;
45
+ for (const { key } of await (0, s3_object_store_1.listKeysByPrefix)(prefix)) {
46
+ if (!(0, artifact_storage_paths_1.isArtifactSnapshotPath)(key.slice(prefix.length))) {
47
+ continue;
48
+ }
49
+ const ts = parseSnapshotTimestamp(key);
50
+ if (ts !== null && ts < cutoff) {
51
+ await (0, s3_object_store_1.deleteObject)(key);
52
+ deleted += 1;
53
+ }
54
+ }
55
+ return deleted;
56
+ }
57
+ function startYjsFlushWorker() {
58
+ var _a, _b, _c;
59
+ if (flushTimer) {
60
+ return;
61
+ }
62
+ const intervalMs = (_b = (_a = (0, context_1.getBuilderApiContext)().config.contentStorage) === null || _a === void 0 ? void 0 : _a.flushIntervalMs) !== null && _b !== void 0 ? _b : 5000;
63
+ flushTimer = setInterval(() => {
64
+ void runYjsFlushTick();
65
+ }, intervalMs);
66
+ (_c = flushTimer.unref) === null || _c === void 0 ? void 0 : _c.call(flushTimer);
67
+ (0, logger_1.getBuilderApiLogger)().info({ intervalMs }, 'Yjs S3 flush worker started');
68
+ }
69
+ function stopYjsFlushWorker() {
70
+ if (flushTimer) {
71
+ clearInterval(flushTimer);
72
+ flushTimer = null;
73
+ }
74
+ }
75
+ //# sourceMappingURL=flush-worker.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"flush-worker.js","sourceRoot":"","sources":["../../../src/lib/yjs-pending/flush-worker.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,22 @@
1
+ export interface YjsPendingUpdate {
2
+ id: string;
3
+ documentId: string;
4
+ accountId: string;
5
+ update: Uint8Array;
6
+ createdAt: string;
7
+ }
8
+ export interface AppendYjsPendingUpdateInput {
9
+ documentId: string;
10
+ accountId: string;
11
+ update: Uint8Array;
12
+ }
13
+ export interface YjsPendingUpdatesRepository {
14
+ append(input: AppendYjsPendingUpdateInput): Promise<YjsPendingUpdate>;
15
+ listByDocumentId(documentId: string): Promise<YjsPendingUpdate[]>;
16
+ countByDocumentId(documentId: string): Promise<number>;
17
+ deleteByIds(ids: string[]): Promise<void>;
18
+ deleteByDocumentId(documentId: string): Promise<void>;
19
+ deleteByDocumentIdPrefix(documentIdPrefix: string): Promise<void>;
20
+ listDocumentIdsWithPending(limit?: number): Promise<string[]>;
21
+ }
22
+ //# sourceMappingURL=yjs-pending-updates-repository.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"yjs-pending-updates-repository.d.ts","sourceRoot":"","sources":["../../../src/lib/yjs-pending/yjs-pending-updates-repository.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,gBAAgB;IAC/B,EAAE,EAAE,MAAM,CAAA;IACV,UAAU,EAAE,MAAM,CAAA;IAClB,SAAS,EAAE,MAAM,CAAA;IACjB,MAAM,EAAE,UAAU,CAAA;IAClB,SAAS,EAAE,MAAM,CAAA;CAClB;AAED,MAAM,WAAW,2BAA2B;IAC1C,UAAU,EAAE,MAAM,CAAA;IAClB,SAAS,EAAE,MAAM,CAAA;IACjB,MAAM,EAAE,UAAU,CAAA;CACnB;AAED,MAAM,WAAW,2BAA2B;IAC1C,MAAM,CAAC,KAAK,EAAE,2BAA2B,GAAG,OAAO,CAAC,gBAAgB,CAAC,CAAA;IACrE,gBAAgB,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,gBAAgB,EAAE,CAAC,CAAA;IACjE,iBAAiB,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAAA;IACtD,WAAW,CAAC,GAAG,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CAAA;IACzC,kBAAkB,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAA;IACrD,wBAAwB,CAAC,gBAAgB,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAA;IACjE,0BAA0B,CAAC,KAAK,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC,CAAA;CAC9D"}
@@ -0,0 +1,3 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ //# sourceMappingURL=yjs-pending-updates-repository.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"yjs-pending-updates-repository.js","sourceRoot":"","sources":["../../../src/lib/yjs-pending/yjs-pending-updates-repository.ts"],"names":[],"mappings":""}
@@ -0,0 +1,23 @@
1
+ import * as Y from 'yjs';
2
+ export type ParsedDocumentTarget = {
3
+ kind: 'session-artifact';
4
+ sessionId: string;
5
+ artifactPath: string;
6
+ } | {
7
+ kind: 'notebook';
8
+ accountId: string;
9
+ notebookId: string;
10
+ };
11
+ export declare function parseDocumentTarget(documentIdentifier: string): ParsedDocumentTarget | null;
12
+ export declare function readCommittedYjsState(parsed: ParsedDocumentTarget): Promise<Uint8Array | null>;
13
+ export declare function writeCommittedYjsState(parsed: ParsedDocumentTarget, state: Uint8Array): Promise<void>;
14
+ export declare function writeCommittedContentSnapshot(parsed: ParsedDocumentTarget, content: string): Promise<void>;
15
+ export declare function writeNamedSessionSnapshot(sessionId: string, artifactPath: string, content: string, at?: Date): Promise<string>;
16
+ export declare function docTextContent(doc: Y.Doc): string;
17
+ export declare function loadMergedState(documentIdentifier: string): Promise<Uint8Array | null>;
18
+ export declare function hydrateEphemeralDoc(documentIdentifier: string): Promise<Y.Doc | null>;
19
+ export declare function appendIncrementalUpdate(documentIdentifier: string, accountId: string, update: Uint8Array, options?: {
20
+ treatAsPossiblyFullState?: boolean;
21
+ }): Promise<void>;
22
+ export declare function flushDocumentToS3(documentIdentifier: string): Promise<boolean>;
23
+ //# sourceMappingURL=yjs-persistence.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"yjs-persistence.d.ts","sourceRoot":"","sources":["../../../src/lib/yjs-pending/yjs-persistence.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,CAAC,MAAM,KAAK,CAAA;AAuBxB,MAAM,MAAM,oBAAoB,GAC5B;IAAE,IAAI,EAAE,kBAAkB,CAAC;IAAC,SAAS,EAAE,MAAM,CAAC;IAAC,YAAY,EAAE,MAAM,CAAA;CAAE,GACrE;IAAE,IAAI,EAAE,UAAU,CAAC;IAAC,SAAS,EAAE,MAAM,CAAC;IAAC,UAAU,EAAE,MAAM,CAAA;CAAE,CAAA;AAE/D,wBAAgB,mBAAmB,CAAC,kBAAkB,EAAE,MAAM,GAAG,oBAAoB,GAAG,IAAI,CAc3F;AAQD,wBAAsB,qBAAqB,CAAC,MAAM,EAAE,oBAAoB,GAAG,OAAO,CAAC,UAAU,GAAG,IAAI,CAAC,CAQpG;AAED,wBAAsB,sBAAsB,CAC1C,MAAM,EAAE,oBAAoB,EAC5B,KAAK,EAAE,UAAU,GAChB,OAAO,CAAC,IAAI,CAAC,CAUf;AAED,wBAAsB,6BAA6B,CACjD,MAAM,EAAE,oBAAoB,EAC5B,OAAO,EAAE,MAAM,GACd,OAAO,CAAC,IAAI,CAAC,CAUf;AAED,wBAAsB,yBAAyB,CAC7C,SAAS,EAAE,MAAM,EACjB,YAAY,EAAE,MAAM,EACpB,OAAO,EAAE,MAAM,EACf,EAAE,GAAE,IAAiB,GACpB,OAAO,CAAC,MAAM,CAAC,CAKjB;AAED,wBAAgB,cAAc,CAAC,GAAG,EAAE,CAAC,CAAC,GAAG,GAAG,MAAM,CAEjD;AAED,wBAAsB,eAAe,CAAC,kBAAkB,EAAE,MAAM,GAAG,OAAO,CAAC,UAAU,GAAG,IAAI,CAAC,CAoB5F;AAED,wBAAsB,mBAAmB,CAAC,kBAAkB,EAAE,MAAM,GAAG,OAAO,CAAC,CAAC,CAAC,GAAG,GAAG,IAAI,CAAC,CAmB3F;AAED,wBAAsB,uBAAuB,CAC3C,kBAAkB,EAAE,MAAM,EAC1B,SAAS,EAAE,MAAM,EACjB,MAAM,EAAE,UAAU,EAClB,OAAO,CAAC,EAAE;IAAE,wBAAwB,CAAC,EAAE,OAAO,CAAA;CAAE,GAC/C,OAAO,CAAC,IAAI,CAAC,CAgCf;AAED,wBAAsB,iBAAiB,CAAC,kBAAkB,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAoDpF"}
@@ -0,0 +1,222 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || (function () {
19
+ var ownKeys = function(o) {
20
+ ownKeys = Object.getOwnPropertyNames || function (o) {
21
+ var ar = [];
22
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
23
+ return ar;
24
+ };
25
+ return ownKeys(o);
26
+ };
27
+ return function (mod) {
28
+ if (mod && mod.__esModule) return mod;
29
+ var result = {};
30
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
31
+ __setModuleDefault(result, mod);
32
+ return result;
33
+ };
34
+ })();
35
+ Object.defineProperty(exports, "__esModule", { value: true });
36
+ exports.parseDocumentTarget = parseDocumentTarget;
37
+ exports.readCommittedYjsState = readCommittedYjsState;
38
+ exports.writeCommittedYjsState = writeCommittedYjsState;
39
+ exports.writeCommittedContentSnapshot = writeCommittedContentSnapshot;
40
+ exports.writeNamedSessionSnapshot = writeNamedSessionSnapshot;
41
+ exports.docTextContent = docTextContent;
42
+ exports.loadMergedState = loadMergedState;
43
+ exports.hydrateEphemeralDoc = hydrateEphemeralDoc;
44
+ exports.appendIncrementalUpdate = appendIncrementalUpdate;
45
+ exports.flushDocumentToS3 = flushDocumentToS3;
46
+ const Y = __importStar(require("yjs"));
47
+ const logger_1 = require("../../logger");
48
+ const context_1 = require("../../context");
49
+ const keys_1 = require("../object-storage/keys");
50
+ const s3 = __importStar(require("../object-storage/s3-object-store"));
51
+ const flush_lock_1 = require("./flush-lock");
52
+ const resolve_session_account_id_1 = require("../session-pages/resolve-session-account-id");
53
+ const session_artifact_document_id_1 = require("../../realtime/session-artifact-document-id");
54
+ const notebook_document_id_1 = require("../../realtime/notebook-document-id");
55
+ const YTEXT_FIELD = 'content';
56
+ const DEFAULT_PENDING_LIMIT = 200;
57
+ function parseDocumentTarget(documentIdentifier) {
58
+ const sessionArtifact = (0, session_artifact_document_id_1.parseSessionArtifactDocumentId)(documentIdentifier);
59
+ if (sessionArtifact) {
60
+ return {
61
+ kind: 'session-artifact',
62
+ sessionId: sessionArtifact.sessionId,
63
+ artifactPath: sessionArtifact.artifactPath,
64
+ };
65
+ }
66
+ const notebook = (0, notebook_document_id_1.parseNotebookDocumentId)(documentIdentifier);
67
+ if (notebook) {
68
+ return { kind: 'notebook', accountId: notebook.accountId, notebookId: notebook.notebookId };
69
+ }
70
+ return null;
71
+ }
72
+ async function resolveAccountId(parsed) {
73
+ return parsed.kind === 'notebook'
74
+ ? parsed.accountId
75
+ : (0, resolve_session_account_id_1.resolveSessionAccountId)(parsed.sessionId);
76
+ }
77
+ async function readCommittedYjsState(parsed) {
78
+ const accountId = await resolveAccountId(parsed);
79
+ if (parsed.kind === 'session-artifact') {
80
+ return s3.getBytes((0, keys_1.sessionArtifactLatestStateKey)(accountId, parsed.sessionId, parsed.artifactPath));
81
+ }
82
+ return s3.getBytes((0, keys_1.notebookYjsStateKey)(accountId, parsed.notebookId));
83
+ }
84
+ async function writeCommittedYjsState(parsed, state) {
85
+ const accountId = await resolveAccountId(parsed);
86
+ if (parsed.kind === 'session-artifact') {
87
+ await s3.putBytes((0, keys_1.sessionArtifactLatestStateKey)(accountId, parsed.sessionId, parsed.artifactPath), state);
88
+ return;
89
+ }
90
+ await s3.putBytes((0, keys_1.notebookYjsStateKey)(accountId, parsed.notebookId), state);
91
+ }
92
+ async function writeCommittedContentSnapshot(parsed, content) {
93
+ const accountId = await resolveAccountId(parsed);
94
+ if (parsed.kind === 'session-artifact') {
95
+ await s3.putString((0, keys_1.sessionArtifactContentKey)(accountId, parsed.sessionId, parsed.artifactPath), content);
96
+ return;
97
+ }
98
+ await s3.putString((0, keys_1.notebookContentKey)(accountId, parsed.notebookId), content);
99
+ }
100
+ async function writeNamedSessionSnapshot(sessionId, artifactPath, content, at = new Date()) {
101
+ const accountId = await (0, resolve_session_account_id_1.resolveSessionAccountId)(sessionId);
102
+ const key = (0, keys_1.sessionArtifactNamedSnapshotKey)(accountId, sessionId, artifactPath, at);
103
+ await s3.putString(key, content);
104
+ return key;
105
+ }
106
+ function docTextContent(doc) {
107
+ return doc.getText(YTEXT_FIELD).toJSON();
108
+ }
109
+ async function loadMergedState(documentIdentifier) {
110
+ const parsed = parseDocumentTarget(documentIdentifier);
111
+ if (!parsed) {
112
+ return null;
113
+ }
114
+ const committed = await readCommittedYjsState(parsed);
115
+ const pending = await (0, context_1.getYjsPendingUpdatesRepository)().listByDocumentId(documentIdentifier);
116
+ const parts = [];
117
+ if (committed === null || committed === void 0 ? void 0 : committed.byteLength) {
118
+ parts.push(committed);
119
+ }
120
+ for (const row of pending) {
121
+ if (row.update.byteLength) {
122
+ parts.push(row.update);
123
+ }
124
+ }
125
+ if (parts.length === 0) {
126
+ return null;
127
+ }
128
+ return parts.length === 1 ? parts[0] : Y.mergeUpdates(parts);
129
+ }
130
+ async function hydrateEphemeralDoc(documentIdentifier) {
131
+ const parsed = parseDocumentTarget(documentIdentifier);
132
+ if (!parsed) {
133
+ return null;
134
+ }
135
+ const doc = new Y.Doc();
136
+ const merged = await loadMergedState(documentIdentifier);
137
+ if (merged === null || merged === void 0 ? void 0 : merged.byteLength) {
138
+ Y.applyUpdate(doc, merged);
139
+ }
140
+ else if (parsed.kind === 'session-artifact') {
141
+ const accountId = await (0, resolve_session_account_id_1.resolveSessionAccountId)(parsed.sessionId);
142
+ const content = await s3.getString((0, keys_1.sessionArtifactContentKey)(accountId, parsed.sessionId, parsed.artifactPath));
143
+ if (content) {
144
+ doc.getText(YTEXT_FIELD).insert(0, content);
145
+ }
146
+ }
147
+ return doc;
148
+ }
149
+ async function appendIncrementalUpdate(documentIdentifier, accountId, update, options) {
150
+ var _a, _b;
151
+ if (!update.byteLength) {
152
+ return;
153
+ }
154
+ let toStore = update;
155
+ if (options === null || options === void 0 ? void 0 : options.treatAsPossiblyFullState) {
156
+ const baseline = await loadMergedState(documentIdentifier);
157
+ if (baseline === null || baseline === void 0 ? void 0 : baseline.byteLength) {
158
+ try {
159
+ toStore = Y.diffUpdate(update, Y.encodeStateVectorFromUpdate(baseline));
160
+ }
161
+ catch (error) {
162
+ (0, logger_1.getBuilderApiLogger)().warn({ err: error, documentIdentifier }, 'Failed to diff full Yjs state; storing update as-is');
163
+ toStore = update;
164
+ }
165
+ }
166
+ }
167
+ if (!toStore.byteLength) {
168
+ return;
169
+ }
170
+ const pendingRepo = (0, context_1.getYjsPendingUpdatesRepository)();
171
+ const limit = (_b = (_a = (0, context_1.getBuilderApiContext)().config.contentStorage) === null || _a === void 0 ? void 0 : _a.pendingUpdatesLimit) !== null && _b !== void 0 ? _b : DEFAULT_PENDING_LIMIT;
172
+ if ((await pendingRepo.countByDocumentId(documentIdentifier)) >= limit) {
173
+ await flushDocumentToS3(documentIdentifier);
174
+ }
175
+ await pendingRepo.append({ documentId: documentIdentifier, accountId, update: toStore });
176
+ }
177
+ async function flushDocumentToS3(documentIdentifier) {
178
+ const parsed = parseDocumentTarget(documentIdentifier);
179
+ if (!parsed) {
180
+ return false;
181
+ }
182
+ const redis = (0, context_1.getSharedRedisClient)();
183
+ if (!redis) {
184
+ (0, logger_1.getBuilderApiLogger)().warn({ documentIdentifier }, 'Skipping Yjs S3 flush — shared Redis client unavailable');
185
+ return false;
186
+ }
187
+ const flushed = await (0, flush_lock_1.withFlushLock)(redis, documentIdentifier, async () => {
188
+ const pendingRepo = (0, context_1.getYjsPendingUpdatesRepository)();
189
+ const pending = await pendingRepo.listByDocumentId(documentIdentifier);
190
+ if (pending.length === 0) {
191
+ return false;
192
+ }
193
+ const committed = await readCommittedYjsState(parsed);
194
+ const parts = [];
195
+ if (committed === null || committed === void 0 ? void 0 : committed.byteLength) {
196
+ parts.push(committed);
197
+ }
198
+ for (const row of pending) {
199
+ if (row.update.byteLength) {
200
+ parts.push(row.update);
201
+ }
202
+ }
203
+ const merged = parts.length === 1 ? parts[0] : Y.mergeUpdates(parts);
204
+ await writeCommittedYjsState(parsed, merged);
205
+ if (parsed.kind === 'session-artifact') {
206
+ const doc = new Y.Doc();
207
+ try {
208
+ Y.applyUpdate(doc, merged);
209
+ const text = docTextContent(doc);
210
+ await writeCommittedContentSnapshot(parsed, text);
211
+ await writeNamedSessionSnapshot(parsed.sessionId, parsed.artifactPath, text);
212
+ }
213
+ finally {
214
+ doc.destroy();
215
+ }
216
+ }
217
+ await pendingRepo.deleteByIds(pending.map((row) => row.id));
218
+ return true;
219
+ });
220
+ return Boolean(flushed);
221
+ }
222
+ //# sourceMappingURL=yjs-persistence.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"yjs-persistence.js","sourceRoot":"","sources":["../../../src/lib/yjs-pending/yjs-persistence.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"reset-session-artifact-y-docs.d.ts","sourceRoot":"","sources":["../../src/realtime/reset-session-artifact-y-docs.ts"],"names":[],"mappings":"AAGA,wBAAsB,yBAAyB,CAC7C,SAAS,EAAE,MAAM,EACjB,aAAa,EAAE,MAAM,EAAE,GACtB,OAAO,CAAC,IAAI,CAAC,CAQf"}
1
+ {"version":3,"file":"reset-session-artifact-y-docs.d.ts","sourceRoot":"","sources":["../../src/realtime/reset-session-artifact-y-docs.ts"],"names":[],"mappings":"AAEA,wBAAsB,yBAAyB,CAC7C,SAAS,EAAE,MAAM,EACjB,aAAa,EAAE,MAAM,EAAE,GACtB,OAAO,CAAC,IAAI,CAAC,CAKf"}
@@ -1,14 +1,9 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.resetSessionArtifactYDocs = resetSessionArtifactYDocs;
4
- const artifact_storage_1 = require("../lib/session-pages/artifact-storage");
5
4
  const session_artifact_yjs_store_1 = require("./session-artifact-yjs-store");
6
5
  async function resetSessionArtifactYDocs(sessionId, artifactPaths) {
7
6
  const store = (0, session_artifact_yjs_store_1.getSessionArtifactYjsStore)();
8
- await Promise.all(artifactPaths.map(async (artifactPath) => {
9
- var _a;
10
- const content = (_a = (await (0, artifact_storage_1.readArtifactContentSnapshot)(sessionId, artifactPath))) !== null && _a !== void 0 ? _a : '';
11
- await store.initializeFromContent(sessionId, artifactPath, content);
12
- }));
7
+ await Promise.all(artifactPaths.map((artifactPath) => store.resetFromFileContent(sessionId, artifactPath)));
13
8
  }
14
9
  //# sourceMappingURL=reset-session-artifact-y-docs.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"reset-session-artifact-y-docs.js","sourceRoot":"","sources":["../../src/realtime/reset-session-artifact-y-docs.ts"],"names":[],"mappings":";;AAGA,8DAWC;AAdD,4EAAmF;AACnF,6EAAyE;AAElE,KAAK,UAAU,yBAAyB,CAC7C,SAAiB,EACjB,aAAuB;IAEvB,MAAM,KAAK,GAAG,IAAA,uDAA0B,GAAE,CAAA;IAC1C,MAAM,OAAO,CAAC,GAAG,CACf,aAAa,CAAC,GAAG,CAAC,KAAK,EAAE,YAAY,EAAE,EAAE;;QACvC,MAAM,OAAO,GAAG,MAAA,CAAC,MAAM,IAAA,8CAA2B,EAAC,SAAS,EAAE,YAAY,CAAC,CAAC,mCAAI,EAAE,CAAA;QAClF,MAAM,KAAK,CAAC,qBAAqB,CAAC,SAAS,EAAE,YAAY,EAAE,OAAO,CAAC,CAAA;IACrE,CAAC,CAAC,CACH,CAAA;AACH,CAAC"}
1
+ {"version":3,"file":"reset-session-artifact-y-docs.js","sourceRoot":"","sources":["../../src/realtime/reset-session-artifact-y-docs.ts"],"names":[],"mappings":";;AAEA,8DAQC;AAVD,6EAAyE;AAElE,KAAK,UAAU,yBAAyB,CAC7C,SAAiB,EACjB,aAAuB;IAEvB,MAAM,KAAK,GAAG,IAAA,uDAA0B,GAAE,CAAA;IAC1C,MAAM,OAAO,CAAC,GAAG,CACf,aAAa,CAAC,GAAG,CAAC,CAAC,YAAY,EAAE,EAAE,CAAC,KAAK,CAAC,oBAAoB,CAAC,SAAS,EAAE,YAAY,CAAC,CAAC,CACzF,CAAA;AACH,CAAC"}
@@ -1,9 +1,4 @@
1
1
  import { PersistedYSocketIO, type GenericYSocketConnection, type PersistedYSocketIOSyncOptions } from '@multiplayer-app/realtime-server';
2
- /**
3
- * Yjs relay for session artifact files. Loads initial state from disk and persists edits back.
4
- * Cross-replica convergence (pub/sub fan-out + merge-persist) is handled by the
5
- * base PersistedYSocketIO when `sync` is provided.
6
- */
7
2
  export declare class SessionArtifactYSocketIO extends PersistedYSocketIO {
8
3
  private readonly store;
9
4
  constructor(namespace: GenericYSocketConnection, sync?: PersistedYSocketIOSyncOptions);
@@ -1 +1 @@
1
- {"version":3,"file":"session-artifact-y-socket-io.d.ts","sourceRoot":"","sources":["../../src/realtime/session-artifact-y-socket-io.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,kBAAkB,EAElB,KAAK,wBAAwB,EAC7B,KAAK,6BAA6B,EAEnC,MAAM,kCAAkC,CAAA;AAKzC;;;;GAIG;AACH,qBAAa,wBAAyB,SAAQ,kBAAkB;IAC9D,OAAO,CAAC,QAAQ,CAAC,KAAK,CAA+B;gBAEzC,SAAS,EAAE,wBAAwB,EAAE,IAAI,CAAC,EAAE,6BAA6B;IA6B5E,UAAU,IAAI,IAAI;CA+B5B"}
1
+ {"version":3,"file":"session-artifact-y-socket-io.d.ts","sourceRoot":"","sources":["../../src/realtime/session-artifact-y-socket-io.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,kBAAkB,EAElB,KAAK,wBAAwB,EAC7B,KAAK,6BAA6B,EAEnC,MAAM,kCAAkC,CAAA;AAIzC,qBAAa,wBAAyB,SAAQ,kBAAkB;IAC9D,OAAO,CAAC,QAAQ,CAAC,KAAK,CAA+B;gBAEzC,SAAS,EAAE,wBAAwB,EAAE,IAAI,CAAC,EAAE,6BAA6B;IAgB5E,UAAU,IAAI,IAAI;CAa5B"}
@@ -1,70 +1,20 @@
1
1
  "use strict";
2
- var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
- if (k2 === undefined) k2 = k;
4
- var desc = Object.getOwnPropertyDescriptor(m, k);
5
- if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
- desc = { enumerable: true, get: function() { return m[k]; } };
7
- }
8
- Object.defineProperty(o, k2, desc);
9
- }) : (function(o, m, k, k2) {
10
- if (k2 === undefined) k2 = k;
11
- o[k2] = m[k];
12
- }));
13
- var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
- Object.defineProperty(o, "default", { enumerable: true, value: v });
15
- }) : function(o, v) {
16
- o["default"] = v;
17
- });
18
- var __importStar = (this && this.__importStar) || (function () {
19
- var ownKeys = function(o) {
20
- ownKeys = Object.getOwnPropertyNames || function (o) {
21
- var ar = [];
22
- for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
23
- return ar;
24
- };
25
- return ownKeys(o);
26
- };
27
- return function (mod) {
28
- if (mod && mod.__esModule) return mod;
29
- var result = {};
30
- if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
31
- __setModuleDefault(result, mod);
32
- return result;
33
- };
34
- })();
35
2
  Object.defineProperty(exports, "__esModule", { value: true });
36
3
  exports.SessionArtifactYSocketIO = void 0;
37
4
  const realtime_server_1 = require("@multiplayer-app/realtime-server");
38
5
  const realtime_types_1 = require("@multiplayer-app/realtime-types");
39
- const Y = __importStar(require("yjs"));
40
6
  const session_artifact_yjs_store_1 = require("./session-artifact-yjs-store");
41
- /**
42
- * Yjs relay for session artifact files. Loads initial state from disk and persists edits back.
43
- * Cross-replica convergence (pub/sub fan-out + merge-persist) is handled by the
44
- * base PersistedYSocketIO when `sync` is provided.
45
- */
46
7
  class SessionArtifactYSocketIO extends realtime_server_1.PersistedYSocketIO {
47
8
  constructor(namespace, sync) {
48
9
  const store = (0, session_artifact_yjs_store_1.getSessionArtifactYjsStore)();
49
10
  const storageAdapter = {
50
11
  async getDocumentStateRecord(documentIdentifier) {
51
- var _a;
52
- const persisted = await store.getPersistedStateRecord(documentIdentifier);
53
- if ((_a = persisted === null || persisted === void 0 ? void 0 : persisted.state) === null || _a === void 0 ? void 0 : _a.byteLength) {
54
- return persisted;
55
- }
56
- // Artifact may exist as UTF-8 on disk without a `.yjs` state file yet.
57
- const doc = await store.getOrLoadDoc(documentIdentifier);
58
- if (!doc) {
59
- return undefined;
60
- }
61
- const state = Y.encodeStateAsUpdate(doc);
62
- if (!state.byteLength) {
63
- return undefined;
64
- }
65
- return { id: { toString: () => documentIdentifier }, state };
12
+ return store.getPersistedStateRecord(documentIdentifier);
66
13
  },
67
14
  async saveDocumentState(documentIdentifier, state) {
15
+ if (!state.byteLength || !(0, realtime_server_1.isValidYjsUpdate)(state)) {
16
+ return;
17
+ }
68
18
  await store.persistBinaryState(documentIdentifier, state);
69
19
  },
70
20
  };
@@ -72,30 +22,16 @@ class SessionArtifactYSocketIO extends realtime_server_1.PersistedYSocketIO {
72
22
  this.store = (0, session_artifact_yjs_store_1.getSessionArtifactYjsStore)();
73
23
  }
74
24
  initialize() {
75
- // Agent/tooling writes go through SessionArtifactYjsStore: emit to the doc
76
- // room (the Socket.IO adapter fans this out to clients on every replica)
77
- // and hand the update to the relay, which merges it into its own cache and
78
- // forwards it to other replicas' server-side caches over the sync channel.
79
25
  this.store.registerBroadcast((documentIdentifier, update) => {
80
26
  if (!update.byteLength || !(0, realtime_server_1.isValidYjsUpdate)(update)) {
81
27
  return;
82
28
  }
83
- this.io
84
- .to(this.getDocumentRoom(documentIdentifier))
85
- .emit(realtime_types_1.YjsEvents.SYNC_UPDATE, {
29
+ this.io.to(this.getDocumentRoom(documentIdentifier)).emit(realtime_types_1.YjsEvents.SYNC_UPDATE, {
86
30
  documentIdentifier,
87
31
  update: Buffer.from(update),
88
32
  });
89
33
  this.publishAppUpdate(documentIdentifier, update);
90
34
  });
91
- // Keep the store's agent-facing doc cache converged with everything the
92
- // relay ingests: local client edits and remote-replica updates. 'app'
93
- // updates originate from the store itself, so they're already applied.
94
- this.onDocUpdate((documentIdentifier, update, origin) => {
95
- if (origin !== 'app') {
96
- this.store.applyExternalUpdate(documentIdentifier, update);
97
- }
98
- });
99
35
  super.initialize();
100
36
  }
101
37
  }
@@ -1 +1 @@
1
- {"version":3,"file":"session-artifact-y-socket-io.js","sourceRoot":"","sources":["../../src/realtime/session-artifact-y-socket-io.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,sEAMyC;AACzC,oEAA2D;AAC3D,uCAAwB;AACxB,6EAAyE;AAEzE;;;;GAIG;AACH,MAAa,wBAAyB,SAAQ,oCAAkB;IAG9D,YAAY,SAAmC,EAAE,IAAoC;QACnF,MAAM,KAAK,GAAG,IAAA,uDAA0B,GAAE,CAAA;QAC1C,MAAM,cAAc,GAA+B;YACjD,KAAK,CAAC,sBAAsB,CAAC,kBAA0B;;gBACrD,MAAM,SAAS,GAAG,MAAM,KAAK,CAAC,uBAAuB,CAAC,kBAAkB,CAAC,CAAA;gBACzE,IAAI,MAAA,SAAS,aAAT,SAAS,uBAAT,SAAS,CAAE,KAAK,0CAAE,UAAU,EAAE,CAAC;oBACjC,OAAO,SAAS,CAAA;gBAClB,CAAC;gBAED,uEAAuE;gBACvE,MAAM,GAAG,GAAG,MAAM,KAAK,CAAC,YAAY,CAAC,kBAAkB,CAAC,CAAA;gBACxD,IAAI,CAAC,GAAG,EAAE,CAAC;oBACT,OAAO,SAAS,CAAA;gBAClB,CAAC;gBAED,MAAM,KAAK,GAAG,CAAC,CAAC,mBAAmB,CAAC,GAAG,CAAC,CAAA;gBACxC,IAAI,CAAC,KAAK,CAAC,UAAU,EAAE,CAAC;oBACtB,OAAO,SAAS,CAAA;gBAClB,CAAC;gBAED,OAAO,EAAE,EAAE,EAAE,EAAE,QAAQ,EAAE,GAAG,EAAE,CAAC,kBAAkB,EAAE,EAAE,KAAK,EAAE,CAAA;YAC9D,CAAC;YACD,KAAK,CAAC,iBAAiB,CAAC,kBAA0B,EAAE,KAAiB;gBACnE,MAAM,KAAK,CAAC,kBAAkB,CAAC,kBAAkB,EAAE,KAAK,CAAC,CAAA;YAC3D,CAAC;SACF,CAAA;QACD,KAAK,CAAC,SAAS,EAAE,cAAc,EAAE,IAAI,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,CAAA;QA5BvC,UAAK,GAAG,IAAA,uDAA0B,GAAE,CAAA;IA6BrD,CAAC;IAEQ,UAAU;QACjB,2EAA2E;QAC3E,yEAAyE;QACzE,2EAA2E;QAC3E,2EAA2E;QAC3E,IAAI,CAAC,KAAK,CAAC,iBAAiB,CAAC,CAAC,kBAAkB,EAAE,MAAM,EAAE,EAAE;YAC1D,IAAI,CAAC,MAAM,CAAC,UAAU,IAAI,CAAC,IAAA,kCAAgB,EAAC,MAAM,CAAC,EAAE,CAAC;gBACpD,OAAM;YACR,CAAC;YAED,IAAI,CAAC,EAAE;iBACJ,EAAE,CAAC,IAAI,CAAC,eAAe,CAAC,kBAAkB,CAAC,CAAC;iBAC5C,IAAI,CAAC,0BAAS,CAAC,WAAW,EAAE;gBAC3B,kBAAkB;gBAClB,MAAM,EAAE,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC;aAC5B,CAAC,CAAA;YAEJ,IAAI,CAAC,gBAAgB,CAAC,kBAAkB,EAAE,MAAM,CAAC,CAAA;QACnD,CAAC,CAAC,CAAA;QAEF,wEAAwE;QACxE,sEAAsE;QACtE,uEAAuE;QACvE,IAAI,CAAC,WAAW,CAAC,CAAC,kBAAkB,EAAE,MAAM,EAAE,MAAM,EAAE,EAAE;YACtD,IAAI,MAAM,KAAK,KAAK,EAAE,CAAC;gBACrB,IAAI,CAAC,KAAK,CAAC,mBAAmB,CAAC,kBAAkB,EAAE,MAAM,CAAC,CAAA;YAC5D,CAAC;QACH,CAAC,CAAC,CAAA;QAEF,KAAK,CAAC,UAAU,EAAE,CAAA;IACpB,CAAC;CACF;AA/DD,4DA+DC"}
1
+ {"version":3,"file":"session-artifact-y-socket-io.js","sourceRoot":"","sources":["../../src/realtime/session-artifact-y-socket-io.ts"],"names":[],"mappings":";;;AAAA,sEAMyC;AACzC,oEAA2D;AAC3D,6EAAyE;AAEzE,MAAa,wBAAyB,SAAQ,oCAAkB;IAG9D,YAAY,SAAmC,EAAE,IAAoC;QACnF,MAAM,KAAK,GAAG,IAAA,uDAA0B,GAAE,CAAA;QAC1C,MAAM,cAAc,GAA+B;YACjD,KAAK,CAAC,sBAAsB,CAAC,kBAA0B;gBACrD,OAAO,KAAK,CAAC,uBAAuB,CAAC,kBAAkB,CAAC,CAAA;YAC1D,CAAC;YACD,KAAK,CAAC,iBAAiB,CAAC,kBAA0B,EAAE,KAAiB;gBACnE,IAAI,CAAC,KAAK,CAAC,UAAU,IAAI,CAAC,IAAA,kCAAgB,EAAC,KAAK,CAAC,EAAE,CAAC;oBAClD,OAAM;gBACR,CAAC;gBACD,MAAM,KAAK,CAAC,kBAAkB,CAAC,kBAAkB,EAAE,KAAK,CAAC,CAAA;YAC3D,CAAC;SACF,CAAA;QACD,KAAK,CAAC,SAAS,EAAE,cAAc,EAAE,IAAI,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,CAAA;QAfvC,UAAK,GAAG,IAAA,uDAA0B,GAAE,CAAA;IAgBrD,CAAC;IAEQ,UAAU;QACjB,IAAI,CAAC,KAAK,CAAC,iBAAiB,CAAC,CAAC,kBAAkB,EAAE,MAAM,EAAE,EAAE;YAC1D,IAAI,CAAC,MAAM,CAAC,UAAU,IAAI,CAAC,IAAA,kCAAgB,EAAC,MAAM,CAAC,EAAE,CAAC;gBACpD,OAAM;YACR,CAAC;YACD,IAAI,CAAC,EAAE,CAAC,EAAE,CAAC,IAAI,CAAC,eAAe,CAAC,kBAAkB,CAAC,CAAC,CAAC,IAAI,CAAC,0BAAS,CAAC,WAAW,EAAE;gBAC/E,kBAAkB;gBAClB,MAAM,EAAE,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC;aAC5B,CAAC,CAAA;YACF,IAAI,CAAC,gBAAgB,CAAC,kBAAkB,EAAE,MAAM,CAAC,CAAA;QACnD,CAAC,CAAC,CAAA;QACF,KAAK,CAAC,UAAU,EAAE,CAAA;IACpB,CAAC;CACF;AAhCD,4DAgCC"}