@powerhousedao/reactor-api 4.1.0-dev.1 → 4.1.0-dev.100

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 (203) hide show
  1. package/README.md +16 -10
  2. package/dist/codegen.d.ts +4 -0
  3. package/dist/codegen.d.ts.map +1 -0
  4. package/dist/codegen.js +38 -0
  5. package/dist/codegen.js.map +1 -0
  6. package/dist/index.d.ts +5 -2
  7. package/dist/index.d.ts.map +1 -1
  8. package/dist/index.js +5 -2
  9. package/dist/index.js.map +1 -1
  10. package/dist/src/config.d.ts +3 -0
  11. package/dist/src/config.d.ts.map +1 -1
  12. package/dist/src/config.js +6 -0
  13. package/dist/src/config.js.map +1 -1
  14. package/dist/src/graphql/analytics-subgraph.d.ts +14 -0
  15. package/dist/src/graphql/analytics-subgraph.d.ts.map +1 -0
  16. package/dist/src/graphql/{analytics/index.js → analytics-subgraph.js} +4 -4
  17. package/dist/src/graphql/analytics-subgraph.js.map +1 -0
  18. package/dist/src/graphql/base-subgraph.d.ts +17 -0
  19. package/dist/src/graphql/base-subgraph.d.ts.map +1 -0
  20. package/dist/src/graphql/{base/index.js → base-subgraph.js} +4 -2
  21. package/dist/src/graphql/base-subgraph.js.map +1 -0
  22. package/dist/src/graphql/drive-subgraph.d.ts +13 -0
  23. package/dist/src/graphql/drive-subgraph.d.ts.map +1 -0
  24. package/dist/src/graphql/{drive/index.js → drive-subgraph.js} +41 -20
  25. package/dist/src/graphql/drive-subgraph.js.map +1 -0
  26. package/dist/src/graphql/graphql-manager.d.ts +17 -14
  27. package/dist/src/graphql/graphql-manager.d.ts.map +1 -1
  28. package/dist/src/graphql/graphql-manager.js +137 -67
  29. package/dist/src/graphql/graphql-manager.js.map +1 -1
  30. package/dist/src/graphql/index.d.ts +7 -8
  31. package/dist/src/graphql/index.d.ts.map +1 -1
  32. package/dist/src/graphql/index.js +7 -19
  33. package/dist/src/graphql/index.js.map +1 -1
  34. package/dist/src/graphql/reactor/adapters.d.ts +28 -0
  35. package/dist/src/graphql/reactor/adapters.d.ts.map +1 -0
  36. package/dist/src/graphql/reactor/adapters.js +92 -0
  37. package/dist/src/graphql/reactor/adapters.js.map +1 -0
  38. package/dist/src/graphql/reactor/factory.d.ts +84 -0
  39. package/dist/src/graphql/reactor/factory.d.ts.map +1 -0
  40. package/dist/src/graphql/reactor/factory.js +7 -0
  41. package/dist/src/graphql/reactor/factory.js.map +1 -0
  42. package/dist/src/graphql/reactor/gen/graphql.d.ts +979 -0
  43. package/dist/src/graphql/reactor/gen/graphql.d.ts.map +1 -0
  44. package/dist/src/graphql/reactor/gen/graphql.js +383 -0
  45. package/dist/src/graphql/reactor/gen/graphql.js.map +1 -0
  46. package/dist/src/graphql/reactor/index.d.ts +4 -0
  47. package/dist/src/graphql/reactor/index.d.ts.map +1 -0
  48. package/dist/src/graphql/reactor/index.js +4 -0
  49. package/dist/src/graphql/reactor/index.js.map +1 -0
  50. package/dist/src/graphql/reactor/requester.d.ts +4 -0
  51. package/dist/src/graphql/reactor/requester.d.ts.map +1 -0
  52. package/dist/src/graphql/reactor/requester.js +22 -0
  53. package/dist/src/graphql/reactor/requester.js.map +1 -0
  54. package/dist/src/graphql/reactor/requester.with-zod.d.ts +4 -0
  55. package/dist/src/graphql/reactor/requester.with-zod.d.ts.map +1 -0
  56. package/dist/src/graphql/reactor/requester.with-zod.js +53 -0
  57. package/dist/src/graphql/reactor/requester.with-zod.js.map +1 -0
  58. package/dist/src/graphql/reactor/resolvers.d.ts +60 -0
  59. package/dist/src/graphql/reactor/resolvers.d.ts.map +1 -0
  60. package/dist/src/graphql/reactor/resolvers.js +173 -0
  61. package/dist/src/graphql/reactor/resolvers.js.map +1 -0
  62. package/dist/src/graphql/reactor/subgraph.d.ts +12 -0
  63. package/dist/src/graphql/reactor/subgraph.d.ts.map +1 -0
  64. package/dist/src/graphql/reactor/subgraph.js +159 -0
  65. package/dist/src/graphql/reactor/subgraph.js.map +1 -0
  66. package/dist/src/graphql/reactor/validation.d.ts +374 -0
  67. package/dist/src/graphql/reactor/validation.d.ts.map +1 -0
  68. package/dist/src/graphql/reactor/validation.js +73 -0
  69. package/dist/src/graphql/reactor/validation.js.map +1 -0
  70. package/dist/src/graphql/system/index.d.ts +2 -27
  71. package/dist/src/graphql/system/index.d.ts.map +1 -1
  72. package/dist/src/graphql/system/index.js +2 -80
  73. package/dist/src/graphql/system/index.js.map +1 -1
  74. package/dist/src/graphql/system/system-subgraph.d.ts +33 -0
  75. package/dist/src/graphql/system/system-subgraph.d.ts.map +1 -0
  76. package/dist/src/graphql/system/system-subgraph.js +96 -0
  77. package/dist/src/graphql/system/system-subgraph.js.map +1 -0
  78. package/dist/src/graphql/system/types.d.ts +1 -2
  79. package/dist/src/graphql/system/types.d.ts.map +1 -1
  80. package/dist/src/graphql/{drive/temp-hack-rwa-type-defs.d.ts → temp-hack-rwa-type-defs.d.ts} +2 -2
  81. package/dist/src/graphql/temp-hack-rwa-type-defs.d.ts.map +1 -0
  82. package/dist/src/graphql/temp-hack-rwa-type-defs.js.map +1 -0
  83. package/dist/src/graphql/types.d.ts +8 -5
  84. package/dist/src/graphql/types.d.ts.map +1 -1
  85. package/dist/src/graphql/utils.d.ts +3 -0
  86. package/dist/src/graphql/utils.d.ts.map +1 -0
  87. package/dist/src/graphql/utils.js +13 -0
  88. package/dist/src/graphql/utils.js.map +1 -0
  89. package/dist/src/packages/import-loader.d.ts +4 -4
  90. package/dist/src/packages/import-loader.d.ts.map +1 -1
  91. package/dist/src/packages/import-loader.js +7 -6
  92. package/dist/src/packages/import-loader.js.map +1 -1
  93. package/dist/src/packages/import-resolver.d.ts +5 -0
  94. package/dist/src/packages/import-resolver.d.ts.map +1 -0
  95. package/dist/src/packages/import-resolver.js +127 -0
  96. package/dist/src/packages/import-resolver.js.map +1 -0
  97. package/dist/src/packages/package-manager.d.ts +9 -3
  98. package/dist/src/packages/package-manager.d.ts.map +1 -1
  99. package/dist/src/packages/package-manager.js +98 -23
  100. package/dist/src/packages/package-manager.js.map +1 -1
  101. package/dist/src/packages/types.d.ts +11 -3
  102. package/dist/src/packages/types.d.ts.map +1 -1
  103. package/dist/src/packages/util.d.ts +21 -2
  104. package/dist/src/packages/util.d.ts.map +1 -1
  105. package/dist/src/packages/util.js +54 -5
  106. package/dist/src/packages/util.js.map +1 -1
  107. package/dist/src/packages/vite-loader.d.ts +22 -0
  108. package/dist/src/packages/vite-loader.d.ts.map +1 -0
  109. package/dist/src/packages/vite-loader.js +147 -0
  110. package/dist/src/packages/vite-loader.js.map +1 -0
  111. package/dist/src/server.d.ts +13 -7
  112. package/dist/src/server.d.ts.map +1 -1
  113. package/dist/src/server.js +59 -88
  114. package/dist/src/server.js.map +1 -1
  115. package/dist/src/services/auth.service.d.ts +64 -0
  116. package/dist/src/services/auth.service.d.ts.map +1 -0
  117. package/dist/src/services/auth.service.js +154 -0
  118. package/dist/src/services/auth.service.js.map +1 -0
  119. package/dist/src/sync/types.d.ts +10 -0
  120. package/dist/src/sync/types.d.ts.map +1 -0
  121. package/dist/src/sync/types.js +2 -0
  122. package/dist/src/sync/types.js.map +1 -0
  123. package/dist/src/sync/utils.d.ts +2 -10
  124. package/dist/src/sync/utils.d.ts.map +1 -1
  125. package/dist/src/sync/utils.js +1 -1
  126. package/dist/src/sync/utils.js.map +1 -1
  127. package/dist/src/types.d.ts +5 -6
  128. package/dist/src/types.d.ts.map +1 -1
  129. package/dist/src/utils/create-schema.d.ts +3 -3
  130. package/dist/src/utils/create-schema.d.ts.map +1 -1
  131. package/dist/src/utils/create-schema.js +29 -9
  132. package/dist/src/utils/create-schema.js.map +1 -1
  133. package/dist/src/utils/db.d.ts +1 -1
  134. package/dist/src/utils/db.d.ts.map +1 -1
  135. package/dist/src/utils/db.js +2 -1
  136. package/dist/src/utils/db.js.map +1 -1
  137. package/dist/test/benchmarks/load.bench.d.ts +2 -0
  138. package/dist/test/benchmarks/load.bench.d.ts.map +1 -0
  139. package/dist/test/benchmarks/load.bench.js +73 -0
  140. package/dist/test/benchmarks/load.bench.js.map +1 -0
  141. package/dist/test/benchmarks/sync.bench.d.ts +2 -0
  142. package/dist/test/benchmarks/sync.bench.d.ts.map +1 -0
  143. package/dist/test/benchmarks/sync.bench.js +119 -0
  144. package/dist/test/benchmarks/sync.bench.js.map +1 -0
  145. package/dist/test/drive-handlers.d.ts +4 -0
  146. package/dist/test/drive-handlers.d.ts.map +1 -0
  147. package/dist/test/drive-handlers.js +39 -0
  148. package/dist/test/drive-handlers.js.map +1 -0
  149. package/dist/test/drive.test.d.ts +2 -0
  150. package/dist/test/drive.test.d.ts.map +1 -0
  151. package/dist/test/drive.test.js +142 -0
  152. package/dist/test/drive.test.js.map +1 -0
  153. package/dist/test/index.d.ts +3 -0
  154. package/dist/test/index.d.ts.map +1 -0
  155. package/dist/test/index.js +3 -0
  156. package/dist/test/index.js.map +1 -0
  157. package/dist/test/pull-responder-transmitter.test.d.ts +2 -0
  158. package/dist/test/pull-responder-transmitter.test.d.ts.map +1 -0
  159. package/dist/test/pull-responder-transmitter.test.js +220 -0
  160. package/dist/test/pull-responder-transmitter.test.js.map +1 -0
  161. package/dist/test/push-transmitter.test.d.ts +2 -0
  162. package/dist/test/push-transmitter.test.d.ts.map +1 -0
  163. package/dist/test/push-transmitter.test.js +179 -0
  164. package/dist/test/push-transmitter.test.js.map +1 -0
  165. package/dist/test/reactor-client.test.d.ts +2 -0
  166. package/dist/test/reactor-client.test.d.ts.map +1 -0
  167. package/dist/test/reactor-client.test.js +212 -0
  168. package/dist/test/reactor-client.test.js.map +1 -0
  169. package/dist/test/reactor-resolvers.test.d.ts +2 -0
  170. package/dist/test/reactor-resolvers.test.d.ts.map +1 -0
  171. package/dist/test/reactor-resolvers.test.js +523 -0
  172. package/dist/test/reactor-resolvers.test.js.map +1 -0
  173. package/dist/test/router.test.d.ts +2 -0
  174. package/dist/test/router.test.d.ts.map +1 -0
  175. package/dist/test/router.test.js +38 -0
  176. package/dist/test/router.test.js.map +1 -0
  177. package/dist/test/system.test.d.ts +2 -0
  178. package/dist/test/system.test.d.ts.map +1 -0
  179. package/dist/test/system.test.js +211 -0
  180. package/dist/test/system.test.js.map +1 -0
  181. package/dist/test/utils.d.ts +10 -0
  182. package/dist/test/utils.d.ts.map +1 -0
  183. package/dist/test/utils.js +23 -0
  184. package/dist/test/utils.js.map +1 -0
  185. package/dist/tsconfig.tsbuildinfo +1 -0
  186. package/dist/vitest.config.d.ts +3 -0
  187. package/dist/vitest.config.d.ts.map +1 -0
  188. package/dist/vitest.config.js +24 -0
  189. package/dist/vitest.config.js.map +1 -0
  190. package/package.json +42 -25
  191. package/dist/src/graphql/analytics/index.d.ts +0 -14
  192. package/dist/src/graphql/analytics/index.d.ts.map +0 -1
  193. package/dist/src/graphql/analytics/index.js.map +0 -1
  194. package/dist/src/graphql/base/index.d.ts +0 -17
  195. package/dist/src/graphql/base/index.d.ts.map +0 -1
  196. package/dist/src/graphql/base/index.js.map +0 -1
  197. package/dist/src/graphql/drive/index.d.ts +0 -13
  198. package/dist/src/graphql/drive/index.d.ts.map +0 -1
  199. package/dist/src/graphql/drive/index.js.map +0 -1
  200. package/dist/src/graphql/drive/temp-hack-rwa-type-defs.d.ts.map +0 -1
  201. package/dist/src/graphql/drive/temp-hack-rwa-type-defs.js.map +0 -1
  202. package/dist/tsconfig.lib.tsbuildinfo +0 -1
  203. /package/dist/src/graphql/{drive/temp-hack-rwa-type-defs.js → temp-hack-rwa-type-defs.js} +0 -0
@@ -0,0 +1,220 @@
1
+ import { createDriveHandlers, expectUUID, getDocumentScopeIndexes, testSetupReactor, } from "@powerhousedao/reactor-api/test";
2
+ import { PullResponderTransmitter, addFile, addFolder } from "document-drive";
3
+ import { documentModelCreateDocument, setAuthorName } from "document-model";
4
+ import { generateId } from "document-model/core";
5
+ import { setupServer } from "msw/node";
6
+ import { afterEach, beforeEach, describe, expect, it, vi } from "vitest";
7
+ const remoteUrl = "http://test.com/d/test";
8
+ describe("Pull Responder Transmitter", () => {
9
+ let server;
10
+ let remoteReactor;
11
+ const driveId = generateId();
12
+ const remoteDrive = {
13
+ id: driveId,
14
+ global: {
15
+ name: "Test Drive",
16
+ },
17
+ };
18
+ const triggerOptions = {
19
+ pullFilter: {
20
+ branch: ["main"],
21
+ documentId: ["*"],
22
+ documentType: ["*"],
23
+ scope: ["global"],
24
+ },
25
+ pullInterval: 50,
26
+ };
27
+ async function setupTrigger() {
28
+ const { listenerManager } = await testSetupReactor();
29
+ return PullResponderTransmitter.createPullResponderTrigger(driveId, remoteUrl, triggerOptions, listenerManager);
30
+ }
31
+ beforeEach(async () => {
32
+ const { reactor } = await testSetupReactor();
33
+ const drive = await reactor.addDrive(remoteDrive);
34
+ remoteReactor = reactor;
35
+ server = setupServer(...createDriveHandlers(reactor, drive.header.id));
36
+ server.listen({ onUnhandledRequest: "error" });
37
+ });
38
+ afterEach(() => {
39
+ server.resetHandlers(); // Reset any handlers overridden during a test
40
+ server.close();
41
+ });
42
+ it("should register listener and create trigger", async () => {
43
+ const trigger = await setupTrigger();
44
+ expect(trigger).toStrictEqual({
45
+ driveId: driveId,
46
+ filter: triggerOptions.pullFilter,
47
+ type: "PullResponder",
48
+ id: expectUUID(expect),
49
+ data: {
50
+ interval: triggerOptions.pullInterval.toString(),
51
+ listenerId: expectUUID(expect),
52
+ url: remoteUrl,
53
+ },
54
+ });
55
+ const remoteListener = remoteReactor.listeners.getListenerState(driveId, trigger.data.listenerId);
56
+ expect(remoteListener).toMatchObject({
57
+ listener: {
58
+ driveId: driveId,
59
+ listenerId: trigger.data.listenerId,
60
+ filter: triggerOptions.pullFilter,
61
+ },
62
+ });
63
+ });
64
+ it("should pull drive operation from remote reactor", async () => {
65
+ const { reactor } = await testSetupReactor();
66
+ const trigger = await setupTrigger();
67
+ await reactor.addDrive({
68
+ id: driveId,
69
+ global: remoteDrive.global,
70
+ local: {
71
+ availableOffline: true,
72
+ triggers: [trigger],
73
+ },
74
+ });
75
+ const result = await remoteReactor.queueAction(driveId, addFolder({ id: generateId(), name: "test" }));
76
+ await vi.waitFor(async () => {
77
+ const drive = await reactor.getDrive(driveId);
78
+ expect(getDocumentScopeIndexes(drive)).toStrictEqual({
79
+ global: 0,
80
+ local: -1,
81
+ });
82
+ const resultDrive = result.document;
83
+ expect(drive.state.global).toStrictEqual(resultDrive.state.global);
84
+ }, {
85
+ timeout: 1000,
86
+ });
87
+ await reactor.deleteDrive(driveId);
88
+ });
89
+ it("should push new document to remote reactor", async () => {
90
+ const { reactor } = await testSetupReactor();
91
+ const trigger = await setupTrigger();
92
+ await reactor.addDrive({
93
+ id: driveId,
94
+ global: remoteDrive.global,
95
+ local: {
96
+ availableOffline: true,
97
+ triggers: [trigger],
98
+ },
99
+ });
100
+ const newDocument = documentModelCreateDocument();
101
+ const documentId = newDocument.header.id;
102
+ const document = await remoteReactor.addDocument(newDocument);
103
+ const result = await remoteReactor.queueAction(driveId, addFile({
104
+ id: documentId,
105
+ name: "test",
106
+ documentType: document.header.documentType,
107
+ }));
108
+ await vi.waitFor(async () => {
109
+ const drive = await reactor.getDrive(driveId);
110
+ expect(getDocumentScopeIndexes(drive)).toStrictEqual({
111
+ global: 0,
112
+ local: -1,
113
+ });
114
+ const resultDrive = result.document;
115
+ expect(drive.state.global).toStrictEqual(resultDrive.state.global);
116
+ });
117
+ await vi.waitFor(async () => {
118
+ const document = (await reactor.getDocument(documentId));
119
+ expect(getDocumentScopeIndexes(document)).toStrictEqual({
120
+ global: -1,
121
+ local: -1,
122
+ });
123
+ const remoteDocument = (await remoteReactor.getDocument(documentId));
124
+ expect(document.state.global).toStrictEqual(remoteDocument.state.global);
125
+ });
126
+ await reactor.deleteDrive(driveId);
127
+ });
128
+ it("should push new document with operations to remote reactor", async () => {
129
+ const { reactor } = await testSetupReactor();
130
+ const trigger = await setupTrigger();
131
+ await reactor.addDrive({
132
+ id: driveId,
133
+ global: remoteDrive.global,
134
+ local: {
135
+ availableOffline: true,
136
+ triggers: [trigger],
137
+ },
138
+ });
139
+ const newDocument = documentModelCreateDocument();
140
+ const documentId = newDocument.header.id;
141
+ const document = await remoteReactor.addDocument(newDocument);
142
+ const result = await remoteReactor.queueAction(documentId, setAuthorName({
143
+ authorName: "test",
144
+ }));
145
+ await remoteReactor.queueAction(driveId, addFile({
146
+ id: documentId,
147
+ name: "test",
148
+ documentType: document.header.documentType,
149
+ }));
150
+ await vi.waitFor(async () => {
151
+ const document = (await reactor.getDocument(documentId));
152
+ expect(getDocumentScopeIndexes(document)).toStrictEqual({
153
+ global: 0,
154
+ local: -1,
155
+ });
156
+ const resultDocument = result.document;
157
+ expect(document.state.global).toStrictEqual(resultDocument.state.global);
158
+ });
159
+ await reactor.deleteDrive(driveId);
160
+ });
161
+ it("should persist triggers in drive storage and retrieve them correctly", async () => {
162
+ const { reactor } = await testSetupReactor();
163
+ const trigger = await setupTrigger();
164
+ // Create a drive with triggers and listeners
165
+ const testListeners = [
166
+ {
167
+ listenerId: "test-listener-1",
168
+ label: "Test Listener",
169
+ version: "1.0.0",
170
+ url: "https://example.com/listener",
171
+ system: false,
172
+ status: "CONNECTING",
173
+ block: false,
174
+ callInfo: {
175
+ data: "",
176
+ name: "Test Listener",
177
+ transmitterType: "PullResponder",
178
+ },
179
+ filter: {
180
+ documentType: ["*"],
181
+ documentId: ["*"],
182
+ scope: ["global"],
183
+ branch: ["main"],
184
+ },
185
+ },
186
+ ];
187
+ const createdDrive = await reactor.addDrive({
188
+ id: generateId(),
189
+ global: {
190
+ name: "Test Drive with Triggers",
191
+ icon: null,
192
+ },
193
+ local: {
194
+ availableOffline: true,
195
+ triggers: [trigger],
196
+ listeners: testListeners,
197
+ sharingType: "private",
198
+ },
199
+ });
200
+ const createdDriveId = createdDrive.header.id;
201
+ // Verify initial state has triggers and listeners
202
+ expect(createdDrive.state.local.triggers).toHaveLength(1);
203
+ expect(createdDrive.state.local.triggers[0].id).toBe(trigger.id);
204
+ expect(createdDrive.state.local.listeners).toHaveLength(1);
205
+ expect(createdDrive.state.local.listeners[0].listenerId).toBe(testListeners[0].listenerId);
206
+ // Now retrieve the drive from storage (simulating a restart)
207
+ const retrievedDrive = await reactor.getDrive(createdDriveId);
208
+ // Verify that triggers and listeners are preserved after retrieval
209
+ expect(retrievedDrive.state.local.triggers).toHaveLength(1);
210
+ expect(retrievedDrive.state.local.triggers[0]).toStrictEqual(trigger);
211
+ expect(retrievedDrive.state.local.listeners).toHaveLength(1);
212
+ expect(retrievedDrive.state.local.listeners[0]).toStrictEqual(testListeners[0]);
213
+ // Verify other local state is also preserved
214
+ expect(retrievedDrive.state.local.availableOffline).toBe(true);
215
+ expect(retrievedDrive.state.local.sharingType).toBe("private");
216
+ // Clean up
217
+ await reactor.deleteDrive(createdDriveId);
218
+ });
219
+ });
220
+ //# sourceMappingURL=pull-responder-transmitter.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pull-responder-transmitter.test.js","sourceRoot":"","sources":["../../test/pull-responder-transmitter.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=push-transmitter.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"push-transmitter.test.d.ts","sourceRoot":"","sources":["../../test/push-transmitter.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,179 @@
1
+ import { createDriveHandlers, expectUTCTimestamp, getDocumentScopeIndexes, testSetupReactor, } from "@powerhousedao/reactor-api/test";
2
+ import { addFile, addFolder, requestPublicDrive, SwitchboardPushTransmitter, } from "document-drive";
3
+ import { documentModelCreateDocument, setAuthorName } from "document-model";
4
+ import { generateId } from "document-model/core";
5
+ import { setupServer } from "msw/node";
6
+ import { afterEach, beforeEach, describe, expect, it, vi } from "vitest";
7
+ const remoteUrl = "http://test.com/d/test";
8
+ describe("Push Transmitter", () => {
9
+ let server;
10
+ let remoteReactor;
11
+ const remoteDrive = {
12
+ id: generateId(),
13
+ global: {
14
+ name: "Test Drive",
15
+ },
16
+ };
17
+ async function setupListener(listenerManager) {
18
+ const uuid = generateId();
19
+ const listener = {
20
+ driveId: remoteDrive.id,
21
+ listenerId: uuid,
22
+ block: false,
23
+ filter: {
24
+ branch: ["main"],
25
+ documentId: ["*"],
26
+ documentType: ["*"],
27
+ scope: ["global"],
28
+ },
29
+ system: false,
30
+ label: `SwitchboardPush #${uuid}`,
31
+ callInfo: {
32
+ data: remoteUrl,
33
+ name: "SwitchboardPush",
34
+ transmitterType: "SwitchboardPush",
35
+ },
36
+ };
37
+ // TODO: circular reference
38
+ listener.transmitter = new SwitchboardPushTransmitter(remoteUrl);
39
+ await listenerManager.setListener(remoteDrive.id, listener);
40
+ return listener;
41
+ }
42
+ beforeEach(async () => {
43
+ const { reactor } = await testSetupReactor();
44
+ const drive = await reactor.addDrive(remoteDrive);
45
+ remoteReactor = reactor;
46
+ server = setupServer(...createDriveHandlers(reactor, drive.header.id));
47
+ server.listen({ onUnhandledRequest: "error" });
48
+ });
49
+ afterEach(() => {
50
+ server.resetHandlers(); // Reset any handlers overridden during a test
51
+ server.close();
52
+ });
53
+ it("should return drive data", async () => {
54
+ const driveInfo = await requestPublicDrive(remoteUrl);
55
+ expect(driveInfo).toStrictEqual({
56
+ id: remoteDrive.id,
57
+ slug: remoteDrive.id,
58
+ name: remoteDrive.global.name,
59
+ meta: {},
60
+ });
61
+ });
62
+ it("should push drive operation to remote reactor", async () => {
63
+ const { reactor, listenerManager } = await testSetupReactor();
64
+ const { id: driveId, name } = await requestPublicDrive(remoteUrl);
65
+ await reactor.addDrive({ id: driveId, global: { name } });
66
+ const listener = await setupListener(listenerManager);
67
+ const result = await reactor.queueAction(driveId, addFolder({ id: generateId(), name: "test" }));
68
+ await vi.waitFor(async () => {
69
+ const remoteDrive = await remoteReactor.getDrive(driveId);
70
+ expect(getDocumentScopeIndexes(remoteDrive)).toStrictEqual({
71
+ global: 0,
72
+ local: -1,
73
+ });
74
+ const resultDrive = result.document;
75
+ expect(remoteDrive.state.global).toStrictEqual(resultDrive.state.global);
76
+ });
77
+ const syncUnits = listenerManager?.getListenerState(driveId, listener.listenerId).syncUnits;
78
+ expect(syncUnits.get({
79
+ documentId: driveId,
80
+ scope: "global",
81
+ branch: "main",
82
+ })).toStrictEqual({
83
+ listenerRev: 1,
84
+ lastUpdated: expectUTCTimestamp(expect),
85
+ });
86
+ expect(syncUnits.get({
87
+ documentId: driveId,
88
+ scope: "local",
89
+ branch: "main",
90
+ })).toBeUndefined();
91
+ });
92
+ it("should push new document to remote reactor", async () => {
93
+ const { reactor, listenerManager } = await testSetupReactor();
94
+ const { id: driveId, name } = await requestPublicDrive(remoteUrl);
95
+ await reactor.addDrive({ id: driveId, global: { name } });
96
+ const listener = await setupListener(listenerManager);
97
+ const newDocument = documentModelCreateDocument();
98
+ const documentId = newDocument.header.id;
99
+ const document = await reactor.addDocument(newDocument);
100
+ const result = await reactor.queueAction(driveId, addFile({
101
+ id: documentId,
102
+ name: "test",
103
+ documentType: document.header.documentType,
104
+ }));
105
+ await vi.waitFor(async () => {
106
+ const remoteDrive = await remoteReactor.getDrive(driveId);
107
+ expect(getDocumentScopeIndexes(remoteDrive)).toStrictEqual({
108
+ global: 0,
109
+ local: -1,
110
+ });
111
+ const resultDrive = result.document;
112
+ expect(remoteDrive.state.global).toStrictEqual(resultDrive.state.global);
113
+ });
114
+ await vi.waitFor(async () => {
115
+ const remoteDocument = (await remoteReactor.getDocument(documentId));
116
+ expect(getDocumentScopeIndexes(remoteDocument)).toStrictEqual({
117
+ global: -1,
118
+ local: -1,
119
+ });
120
+ const resultDocument = document;
121
+ expect(remoteDocument.state.global).toStrictEqual(resultDocument.state.global);
122
+ });
123
+ const syncUnits = listenerManager?.getListenerState(driveId, listener.listenerId).syncUnits;
124
+ expect(syncUnits.get({
125
+ documentId,
126
+ scope: "global",
127
+ branch: "main",
128
+ })).toStrictEqual({
129
+ listenerRev: 0,
130
+ lastUpdated: expectUTCTimestamp(expect),
131
+ });
132
+ expect(syncUnits.get({
133
+ documentId,
134
+ scope: "local",
135
+ branch: "main",
136
+ })).toBeUndefined();
137
+ });
138
+ it("should push new document with operations to remote reactor", async () => {
139
+ const { reactor, listenerManager } = await testSetupReactor();
140
+ const { id: driveId, name } = await requestPublicDrive(remoteUrl);
141
+ await reactor.addDrive({ id: driveId, global: { name } });
142
+ const listener = await setupListener(listenerManager);
143
+ const newDocument = documentModelCreateDocument();
144
+ const documentId = newDocument.header.id;
145
+ const document = await reactor.addDocument(newDocument);
146
+ const result = await reactor.queueAction(documentId, setAuthorName({
147
+ authorName: "test",
148
+ }));
149
+ await reactor.queueAction(driveId, addFile({
150
+ id: documentId,
151
+ name: "test",
152
+ documentType: document.header.documentType,
153
+ }));
154
+ await vi.waitFor(async () => {
155
+ const remoteDocument = (await remoteReactor.getDocument(documentId));
156
+ expect(getDocumentScopeIndexes(remoteDocument)).toStrictEqual({
157
+ global: 0,
158
+ local: -1,
159
+ });
160
+ const resultDocument = result.document;
161
+ expect(remoteDocument.state.global).toStrictEqual(resultDocument.state.global);
162
+ });
163
+ const syncUnits = listenerManager?.getListenerState(driveId, listener.listenerId).syncUnits;
164
+ expect(syncUnits.get({
165
+ documentId,
166
+ scope: "global",
167
+ branch: "main",
168
+ })).toStrictEqual({
169
+ listenerRev: 1,
170
+ lastUpdated: expectUTCTimestamp(expect),
171
+ });
172
+ expect(syncUnits.get({
173
+ documentId,
174
+ scope: "local",
175
+ branch: "main",
176
+ })).toBeUndefined();
177
+ });
178
+ });
179
+ //# sourceMappingURL=push-transmitter.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"push-transmitter.test.js","sourceRoot":"","sources":["../../test/push-transmitter.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=reactor-client.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"reactor-client.test.d.ts","sourceRoot":"","sources":["../../test/reactor-client.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,212 @@
1
+ import { print } from "graphql";
2
+ import { beforeEach, describe, expect, it, vi } from "vitest";
3
+ import { createReactorClient } from "../src/graphql/reactor/factory.js";
4
+ import { GetDocumentDocument } from "../src/graphql/reactor/gen/graphql.js";
5
+ import { createFetchRequester } from "../src/graphql/reactor/requester.js";
6
+ import { createValidatingRequester } from "../src/graphql/reactor/requester.with-zod.js";
7
+ describe("ReactorSDK", () => {
8
+ describe("createFetchRequester", () => {
9
+ let mockFetch;
10
+ beforeEach(() => {
11
+ mockFetch = vi.fn();
12
+ });
13
+ it("should make a POST request with correct headers and body", async () => {
14
+ const mockResponse = {
15
+ ok: true,
16
+ json: vi.fn().mockResolvedValue({
17
+ data: { test: "result" },
18
+ }),
19
+ };
20
+ mockFetch.mockResolvedValue(mockResponse);
21
+ const requester = createFetchRequester("https://api.test.com/graphql", mockFetch, { Authorization: "Bearer token123" });
22
+ const variables = { identifier: "doc-123", view: { branch: "main" } };
23
+ const result = await requester(GetDocumentDocument, variables, {});
24
+ // Verify fetch was called correctly
25
+ expect(mockFetch).toHaveBeenCalledWith("https://api.test.com/graphql", {
26
+ method: "POST",
27
+ headers: {
28
+ "content-type": "application/json",
29
+ Authorization: "Bearer token123",
30
+ },
31
+ body: JSON.stringify({
32
+ query: print(GetDocumentDocument),
33
+ variables,
34
+ }),
35
+ });
36
+ expect(result).toEqual({ test: "result" });
37
+ });
38
+ it("should handle HTTP errors", async () => {
39
+ const mockResponse = {
40
+ ok: false,
41
+ status: 500,
42
+ };
43
+ mockFetch.mockResolvedValue(mockResponse);
44
+ const requester = createFetchRequester("https://api.test.com/graphql", mockFetch);
45
+ await expect(requester(GetDocumentDocument, {}, {})).rejects.toThrow("GraphQL HTTP 500");
46
+ });
47
+ it("should handle GraphQL errors", async () => {
48
+ const mockResponse = {
49
+ ok: true,
50
+ json: vi.fn().mockResolvedValue({
51
+ errors: [{ message: "Field not found" }],
52
+ }),
53
+ };
54
+ mockFetch.mockResolvedValue(mockResponse);
55
+ const requester = createFetchRequester("https://api.test.com/graphql", mockFetch);
56
+ await expect(requester(GetDocumentDocument, {}, {})).rejects.toThrow('[{"message":"Field not found"}]');
57
+ });
58
+ it("should work without custom headers", async () => {
59
+ const mockResponse = {
60
+ ok: true,
61
+ json: vi.fn().mockResolvedValue({
62
+ data: { test: "result" },
63
+ }),
64
+ };
65
+ mockFetch.mockResolvedValue(mockResponse);
66
+ const requester = createFetchRequester("https://api.test.com/graphql", mockFetch);
67
+ await requester(GetDocumentDocument, {}, {});
68
+ expect(mockFetch).toHaveBeenCalledWith("https://api.test.com/graphql", {
69
+ method: "POST",
70
+ headers: {
71
+ "content-type": "application/json",
72
+ },
73
+ body: expect.any(String),
74
+ });
75
+ });
76
+ });
77
+ describe("createValidatingRequester", () => {
78
+ let mockFetch;
79
+ beforeEach(() => {
80
+ mockFetch = vi.fn();
81
+ });
82
+ it("should validate successful GetDocument response", async () => {
83
+ const validDocumentResponse = {
84
+ document: {
85
+ document: {
86
+ id: "doc-123",
87
+ slug: "test-document",
88
+ name: "Test Document",
89
+ documentType: "powerhouse/document-model",
90
+ state: {},
91
+ revision: 1,
92
+ created: "2023-01-01T00:00:00Z",
93
+ lastModified: "2023-01-01T00:00:00Z",
94
+ parentId: null,
95
+ },
96
+ childIds: [],
97
+ },
98
+ };
99
+ const mockResponse = {
100
+ ok: true,
101
+ json: vi.fn().mockResolvedValue({
102
+ data: validDocumentResponse,
103
+ }),
104
+ };
105
+ mockFetch.mockResolvedValue(mockResponse);
106
+ const requester = createValidatingRequester("https://api.test.com/graphql", mockFetch);
107
+ const result = await requester(GetDocumentDocument, { identifier: "doc-123" }, {});
108
+ expect(result).toEqual(validDocumentResponse);
109
+ });
110
+ it("should reject malformed GetDocument response", async () => {
111
+ const malformedResponse = {
112
+ document: {
113
+ document: {
114
+ id: "doc-123",
115
+ // Missing required fields like name, documentType, etc.
116
+ },
117
+ childIds: "not-an-array", // Should be array
118
+ },
119
+ };
120
+ const mockResponse = {
121
+ ok: true,
122
+ json: vi.fn().mockResolvedValue({
123
+ data: malformedResponse,
124
+ }),
125
+ };
126
+ mockFetch.mockResolvedValue(mockResponse);
127
+ const requester = createValidatingRequester("https://api.test.com/graphql", mockFetch);
128
+ await expect(requester(GetDocumentDocument, { identifier: "doc-123" }, {})).rejects.toThrow(); // Should throw Zod validation error
129
+ });
130
+ it("should handle null document response", async () => {
131
+ const nullDocumentResponse = {
132
+ document: null,
133
+ };
134
+ const mockResponse = {
135
+ ok: true,
136
+ json: vi.fn().mockResolvedValue({
137
+ data: nullDocumentResponse,
138
+ }),
139
+ };
140
+ mockFetch.mockResolvedValue(mockResponse);
141
+ const requester = createValidatingRequester("https://api.test.com/graphql", mockFetch);
142
+ const result = await requester(GetDocumentDocument, { identifier: "nonexistent" }, {});
143
+ expect(result).toEqual(nullDocumentResponse);
144
+ });
145
+ });
146
+ describe("createReactorClient integration", () => {
147
+ let mockFetch;
148
+ beforeEach(() => {
149
+ mockFetch = vi.fn();
150
+ });
151
+ it("should create client with typed methods", async () => {
152
+ const validDocumentResponse = {
153
+ document: {
154
+ document: {
155
+ id: "doc-123",
156
+ slug: "test-document",
157
+ name: "Test Document",
158
+ documentType: "powerhouse/document-model",
159
+ state: {},
160
+ revision: 1,
161
+ created: "2023-01-01T00:00:00Z",
162
+ lastModified: "2023-01-01T00:00:00Z",
163
+ parentId: null,
164
+ },
165
+ childIds: [],
166
+ },
167
+ };
168
+ const mockResponse = {
169
+ ok: true,
170
+ json: vi.fn().mockResolvedValue({
171
+ data: validDocumentResponse,
172
+ }),
173
+ };
174
+ mockFetch.mockResolvedValue(mockResponse);
175
+ const sdk = createReactorClient("https://api.test.com/graphql", mockFetch, { Authorization: "Bearer token123" });
176
+ // Test actual call
177
+ const result = await sdk.GetDocument({
178
+ identifier: "doc-123",
179
+ view: { branch: "main" },
180
+ });
181
+ expect(result).toEqual(validDocumentResponse);
182
+ // Verify the underlying fetch was called correctly
183
+ expect(mockFetch).toHaveBeenCalledWith("https://api.test.com/graphql", {
184
+ method: "POST",
185
+ headers: {
186
+ "content-type": "application/json",
187
+ Authorization: "Bearer token123",
188
+ },
189
+ body: expect.stringContaining("GetDocument"),
190
+ });
191
+ });
192
+ it("should work without custom headers", async () => {
193
+ const mockResponse = {
194
+ ok: true,
195
+ json: vi.fn().mockResolvedValue({
196
+ data: { document: null },
197
+ }),
198
+ };
199
+ mockFetch.mockResolvedValue(mockResponse);
200
+ const sdk = createReactorClient("https://api.test.com/graphql", mockFetch);
201
+ await sdk.GetDocument({ identifier: "test" });
202
+ expect(mockFetch).toHaveBeenCalledWith("https://api.test.com/graphql", {
203
+ method: "POST",
204
+ headers: {
205
+ "content-type": "application/json",
206
+ },
207
+ body: expect.any(String),
208
+ });
209
+ });
210
+ });
211
+ });
212
+ //# sourceMappingURL=reactor-client.test.js.map