@powerhousedao/reactor-api 6.0.0-dev.8 → 6.0.0-staging.1
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.
- package/dist/codegen.js +1 -1
- package/dist/codegen.js.map +1 -1
- package/dist/src/config.d.ts +1 -2
- package/dist/src/config.d.ts.map +1 -1
- package/dist/src/config.js +1 -5
- package/dist/src/config.js.map +1 -1
- package/dist/src/graphql/auth/subgraph.js +1 -1
- package/dist/src/graphql/auth/subgraph.js.map +1 -1
- package/dist/src/graphql/base-subgraph.d.ts +2 -2
- package/dist/src/graphql/base-subgraph.d.ts.map +1 -1
- package/dist/src/graphql/base-subgraph.js.map +1 -1
- package/dist/src/graphql/document-model-subgraph.d.ts +95 -43
- package/dist/src/graphql/document-model-subgraph.d.ts.map +1 -1
- package/dist/src/graphql/document-model-subgraph.js +570 -79
- package/dist/src/graphql/document-model-subgraph.js.map +1 -1
- package/dist/src/graphql/drive-subgraph.d.ts.map +1 -1
- package/dist/src/graphql/drive-subgraph.js +1 -0
- package/dist/src/graphql/drive-subgraph.js.map +1 -1
- package/dist/src/graphql/graphql-manager.d.ts +11 -5
- package/dist/src/graphql/graphql-manager.d.ts.map +1 -1
- package/dist/src/graphql/graphql-manager.js +202 -127
- package/dist/src/graphql/graphql-manager.js.map +1 -1
- package/dist/src/graphql/index.d.ts +1 -0
- package/dist/src/graphql/index.d.ts.map +1 -1
- package/dist/src/graphql/index.js +1 -0
- package/dist/src/graphql/index.js.map +1 -1
- package/dist/src/graphql/reactor/adapters.d.ts +10 -2
- package/dist/src/graphql/reactor/adapters.d.ts.map +1 -1
- package/dist/src/graphql/reactor/adapters.js +35 -1
- package/dist/src/graphql/reactor/adapters.js.map +1 -1
- package/dist/src/graphql/reactor/factory.d.ts +12 -1
- package/dist/src/graphql/reactor/factory.d.ts.map +1 -1
- package/dist/src/graphql/reactor/factory.js +1 -1
- package/dist/src/graphql/reactor/factory.js.map +1 -1
- package/dist/src/graphql/reactor/gen/graphql.d.ts +221 -76
- package/dist/src/graphql/reactor/gen/graphql.d.ts.map +1 -1
- package/dist/src/graphql/reactor/gen/graphql.js +129 -10
- package/dist/src/graphql/reactor/gen/graphql.js.map +1 -1
- package/dist/src/graphql/reactor/index.d.ts +1 -1
- package/dist/src/graphql/reactor/index.d.ts.map +1 -1
- package/dist/src/graphql/reactor/index.js +1 -1
- package/dist/src/graphql/reactor/index.js.map +1 -1
- package/dist/src/graphql/reactor/operations.graphql +84 -1
- package/dist/src/graphql/reactor/requester.with-zod.d.ts.map +1 -1
- package/dist/src/graphql/reactor/requester.with-zod.js +104 -38
- package/dist/src/graphql/reactor/requester.with-zod.js.map +1 -1
- package/dist/src/graphql/reactor/resolvers.d.ts +77 -25
- package/dist/src/graphql/reactor/resolvers.d.ts.map +1 -1
- package/dist/src/graphql/reactor/resolvers.js +164 -70
- package/dist/src/graphql/reactor/resolvers.js.map +1 -1
- package/dist/src/graphql/reactor/schema.graphql +70 -30
- package/dist/src/graphql/reactor/subgraph.d.ts.map +1 -1
- package/dist/src/graphql/reactor/subgraph.js +100 -112
- package/dist/src/graphql/reactor/subgraph.js.map +1 -1
- package/dist/src/graphql/reactor/validation.d.ts +23 -5
- package/dist/src/graphql/reactor/validation.d.ts.map +1 -1
- package/dist/src/graphql/reactor/validation.js +15 -1
- package/dist/src/graphql/reactor/validation.js.map +1 -1
- package/dist/src/graphql/system/index.d.ts +0 -1
- package/dist/src/graphql/system/index.d.ts.map +1 -1
- package/dist/src/graphql/system/index.js +0 -1
- package/dist/src/graphql/system/index.js.map +1 -1
- package/dist/src/graphql/types.d.ts +3 -3
- package/dist/src/graphql/types.d.ts.map +1 -1
- package/dist/src/graphql/utils.d.ts.map +1 -1
- package/dist/src/graphql/utils.js +7 -3
- package/dist/src/graphql/utils.js.map +1 -1
- package/dist/src/packages/import-loader.d.ts +5 -3
- package/dist/src/packages/import-loader.d.ts.map +1 -1
- package/dist/src/packages/import-loader.js +19 -10
- package/dist/src/packages/import-loader.js.map +1 -1
- package/dist/src/packages/package-manager.d.ts +2 -2
- package/dist/src/packages/package-manager.d.ts.map +1 -1
- package/dist/src/packages/package-manager.js.map +1 -1
- package/dist/src/packages/types.d.ts +9 -4
- package/dist/src/packages/types.d.ts.map +1 -1
- package/dist/src/packages/util.d.ts +3 -2
- package/dist/src/packages/util.d.ts.map +1 -1
- package/dist/src/packages/util.js +1 -1
- package/dist/src/packages/util.js.map +1 -1
- package/dist/src/packages/vite-loader.d.ts +10 -8
- package/dist/src/packages/vite-loader.d.ts.map +1 -1
- package/dist/src/packages/vite-loader.js +33 -10
- package/dist/src/packages/vite-loader.js.map +1 -1
- package/dist/src/server.d.ts +18 -8
- package/dist/src/server.d.ts.map +1 -1
- package/dist/src/server.js +123 -63
- package/dist/src/server.js.map +1 -1
- package/dist/src/services/auth.service.d.ts.map +1 -1
- package/dist/src/services/auth.service.js +11 -20
- package/dist/src/services/auth.service.js.map +1 -1
- package/dist/src/tracing.js +1 -1
- package/dist/src/tracing.js.map +1 -1
- package/dist/src/types.d.ts +5 -5
- package/dist/src/types.d.ts.map +1 -1
- package/dist/src/utils/create-schema.d.ts +21 -1
- package/dist/src/utils/create-schema.d.ts.map +1 -1
- package/dist/src/utils/create-schema.js +289 -16
- package/dist/src/utils/create-schema.js.map +1 -1
- package/dist/src/utils/drive-url.d.ts +2 -0
- package/dist/src/utils/drive-url.d.ts.map +1 -0
- package/dist/src/utils/drive-url.js +3 -0
- package/dist/src/utils/drive-url.js.map +1 -0
- package/dist/src/utils/index.d.ts +1 -0
- package/dist/src/utils/index.d.ts.map +1 -1
- package/dist/src/utils/index.js +1 -0
- package/dist/src/utils/index.js.map +1 -1
- package/dist/test/connect-switchboard-reshuffle-convergence.test.d.ts +2 -0
- package/dist/test/connect-switchboard-reshuffle-convergence.test.d.ts.map +1 -0
- package/dist/test/connect-switchboard-reshuffle-convergence.test.js +203 -0
- package/dist/test/connect-switchboard-reshuffle-convergence.test.js.map +1 -0
- package/dist/test/connect-switchboard-sync.test.d.ts +2 -0
- package/dist/test/connect-switchboard-sync.test.d.ts.map +1 -0
- package/dist/test/connect-switchboard-sync.test.js +581 -0
- package/dist/test/connect-switchboard-sync.test.js.map +1 -0
- package/dist/test/document-drive-subgraph.test.d.ts +2 -0
- package/dist/test/document-drive-subgraph.test.d.ts.map +1 -0
- package/dist/test/document-drive-subgraph.test.js +186 -0
- package/dist/test/document-drive-subgraph.test.js.map +1 -0
- package/dist/test/document-model-subgraph-legacy-permissions.test.d.ts +2 -0
- package/dist/test/document-model-subgraph-legacy-permissions.test.d.ts.map +1 -0
- package/dist/test/document-model-subgraph-legacy-permissions.test.js +518 -0
- package/dist/test/document-model-subgraph-legacy-permissions.test.js.map +1 -0
- package/dist/test/document-model-subgraph-permissions.test.d.ts +2 -0
- package/dist/test/document-model-subgraph-permissions.test.d.ts.map +1 -0
- package/dist/test/document-model-subgraph-permissions.test.js +635 -0
- package/dist/test/document-model-subgraph-permissions.test.js.map +1 -0
- package/dist/test/document-model-subgraph.test.d.ts +2 -0
- package/dist/test/document-model-subgraph.test.d.ts.map +1 -0
- package/dist/test/document-model-subgraph.test.js +441 -0
- package/dist/test/document-model-subgraph.test.js.map +1 -0
- package/dist/test/drive-info-endpoint.test.d.ts +2 -0
- package/dist/test/drive-info-endpoint.test.d.ts.map +1 -0
- package/dist/test/drive-info-endpoint.test.js +123 -0
- package/dist/test/drive-info-endpoint.test.js.map +1 -0
- package/dist/test/permissions-integration.test.js +4 -4
- package/dist/test/permissions-integration.test.js.map +1 -1
- package/dist/test/push-backfill.test.d.ts +2 -0
- package/dist/test/push-backfill.test.d.ts.map +1 -0
- package/dist/test/push-backfill.test.js +298 -0
- package/dist/test/push-backfill.test.js.map +1 -0
- package/dist/test/reactor-client.test.js +4 -4
- package/dist/test/reactor-client.test.js.map +1 -1
- package/dist/test/reactor-resolvers.test.js +8 -11
- package/dist/test/reactor-resolvers.test.js.map +1 -1
- package/dist/test/reactor-subgraph-permissions.test.js +4 -7
- package/dist/test/reactor-subgraph-permissions.test.js.map +1 -1
- package/dist/test/subscriptions.test.js +2 -0
- package/dist/test/subscriptions.test.js.map +1 -1
- package/dist/test/utils/gql-resolver-bridge.d.ts +4 -1
- package/dist/test/utils/gql-resolver-bridge.d.ts.map +1 -1
- package/dist/test/utils/gql-resolver-bridge.js +36 -7
- package/dist/test/utils/gql-resolver-bridge.js.map +1 -1
- package/dist/tsconfig.tsbuildinfo +1 -1
- package/package.json +44 -55
- package/dist/src/graphql/system/system-subgraph.d.ts +0 -49
- package/dist/src/graphql/system/system-subgraph.d.ts.map +0 -1
- package/dist/src/graphql/system/system-subgraph.js +0 -130
- package/dist/src/graphql/system/system-subgraph.js.map +0 -1
- package/dist/test/system.test.d.ts +0 -2
- package/dist/test/system.test.d.ts.map +0 -1
- package/dist/test/system.test.js +0 -211
- package/dist/test/system.test.js.map +0 -1
- package/dist/test/three-reactor-gql-sync.test.d.ts +0 -2
- package/dist/test/three-reactor-gql-sync.test.d.ts.map +0 -1
- package/dist/test/three-reactor-gql-sync.test.js +0 -368
- package/dist/test/three-reactor-gql-sync.test.js.map +0 -1
- package/dist/test/two-reactor-gql-sync.test.d.ts +0 -2
- package/dist/test/two-reactor-gql-sync.test.d.ts.map +0 -1
- package/dist/test/two-reactor-gql-sync.test.js +0 -348
- package/dist/test/two-reactor-gql-sync.test.js.map +0 -1
|
@@ -6,6 +6,16 @@ import { Kind, print } from "graphql";
|
|
|
6
6
|
import { gql } from "graphql-tag";
|
|
7
7
|
import { GraphQLJSONObject } from "graphql-type-json";
|
|
8
8
|
const logger = childLogger(["reactor-api", "create-schema"]);
|
|
9
|
+
/**
|
|
10
|
+
* Revision type - matches the definition in reactor/schema.graphql.
|
|
11
|
+
* Used by PHDocument and document mutation results.
|
|
12
|
+
*/
|
|
13
|
+
const RevisionType = `
|
|
14
|
+
type Revision {
|
|
15
|
+
scope: String!
|
|
16
|
+
revision: Int!
|
|
17
|
+
}
|
|
18
|
+
`;
|
|
9
19
|
/**
|
|
10
20
|
* Strip scalar definitions from a DocumentNode to avoid duplicates
|
|
11
21
|
* when combining with other schemas that define the same scalars.
|
|
@@ -58,12 +68,13 @@ export const getDocumentModelTypeDefs = (documentDriveServer, typeDefs) => {
|
|
|
58
68
|
.join("\n")};
|
|
59
69
|
|
|
60
70
|
\n`;
|
|
61
|
-
const found = tmpDmSchema.match(/(type|enum|union|interface)\s+(\w+)\s/g);
|
|
71
|
+
const found = tmpDmSchema.match(/(type|enum|union|interface)\s+(\w+)[\s{]/g);
|
|
62
72
|
const trimmedFound = found?.map((f) => f
|
|
63
73
|
.replaceAll("type ", "")
|
|
64
74
|
.replaceAll("enum ", "")
|
|
65
75
|
.replaceAll("union ", "")
|
|
66
76
|
.replaceAll("interface ", "")
|
|
77
|
+
.replaceAll("{", "")
|
|
67
78
|
.trim());
|
|
68
79
|
trimmedFound?.forEach((f) => {
|
|
69
80
|
// Create a regex that matches the type name with proper boundaries
|
|
@@ -181,7 +192,7 @@ export const getDocumentModelTypeDefs = (documentDriveServer, typeDefs) => {
|
|
|
181
192
|
* @returns {string[]} Array of type names
|
|
182
193
|
*/
|
|
183
194
|
function extractTypeNames(schema) {
|
|
184
|
-
const found = schema.match(/(type|enum|union|interface|input)\s+(\w+)\s/g);
|
|
195
|
+
const found = schema.match(/(type|enum|union|interface|input)\s+(\w+)[\s{]/g);
|
|
185
196
|
if (!found)
|
|
186
197
|
return [];
|
|
187
198
|
return found.map((f) => f
|
|
@@ -190,8 +201,31 @@ function extractTypeNames(schema) {
|
|
|
190
201
|
.replaceAll("union ", "")
|
|
191
202
|
.replaceAll("interface ", "")
|
|
192
203
|
.replaceAll("input ", "")
|
|
204
|
+
.replaceAll("{", "")
|
|
193
205
|
.trim());
|
|
194
206
|
}
|
|
207
|
+
/**
|
|
208
|
+
* Extract input type definitions from a GraphQL schema.
|
|
209
|
+
* @param {string} schema - GraphQL schema string
|
|
210
|
+
* @param {Set<string>} excludeTypeNames - Type names to exclude from extraction
|
|
211
|
+
* @returns {string} All input type definitions as a string
|
|
212
|
+
*/
|
|
213
|
+
function extractInputTypeDefinitions(schema, excludeTypeNames = new Set()) {
|
|
214
|
+
// Match input type blocks: input TypeName { ... }
|
|
215
|
+
const inputTypeRegex = /input\s+(\w+)\s*\{[^}]*\}/g;
|
|
216
|
+
const matches = [];
|
|
217
|
+
let match;
|
|
218
|
+
while ((match = inputTypeRegex.exec(schema)) !== null) {
|
|
219
|
+
const typeName = match[1];
|
|
220
|
+
// Skip if this type name is in the exclusion set
|
|
221
|
+
if (!excludeTypeNames.has(typeName)) {
|
|
222
|
+
matches.push(match[0]);
|
|
223
|
+
}
|
|
224
|
+
}
|
|
225
|
+
if (matches.length === 0)
|
|
226
|
+
return "";
|
|
227
|
+
return matches.join("\n\n");
|
|
228
|
+
}
|
|
195
229
|
/**
|
|
196
230
|
* Apply type prefixes to GraphQL schema to namespace types and avoid collisions.
|
|
197
231
|
* Inlined from @powerhousedao/common/utils to avoid ES module import issues.
|
|
@@ -230,11 +264,69 @@ function applyGraphQLTypePrefixes(schema, prefix, externalTypeNames = []) {
|
|
|
230
264
|
});
|
|
231
265
|
return processedSchema;
|
|
232
266
|
}
|
|
233
|
-
|
|
267
|
+
/**
|
|
268
|
+
* Generate a GraphQL schema for a document model.
|
|
269
|
+
*
|
|
270
|
+
* @param documentModel - The document model global state
|
|
271
|
+
* @param options - Schema generation options
|
|
272
|
+
* @returns GraphQL DocumentNode
|
|
273
|
+
*/
|
|
274
|
+
export function generateDocumentModelSchema(documentModel, options = {}) {
|
|
275
|
+
const { useNewApi = false } = options;
|
|
234
276
|
const specification = documentModel.specifications.at(-1);
|
|
235
277
|
const documentName = getDocumentModelSchemaName(documentModel);
|
|
236
|
-
const
|
|
237
|
-
const
|
|
278
|
+
const globalStateSchema = specification?.state.global.schema;
|
|
279
|
+
const localStateSchema = specification?.state.local.schema;
|
|
280
|
+
const globalStateTypeNames = extractTypeNames(globalStateSchema ?? "");
|
|
281
|
+
const localStateTypeNames = extractTypeNames(localStateSchema ?? "");
|
|
282
|
+
const stateTypeNames = [...globalStateTypeNames, ...localStateTypeNames];
|
|
283
|
+
// Collect ALL type names from all operations' schemas
|
|
284
|
+
const allOperationTypeNames = specification?.modules.flatMap((module) => module.operations.flatMap((op) => extractTypeNames(op.schema ?? ""))) ?? [];
|
|
285
|
+
// Combine state types and all operation types for prefixing
|
|
286
|
+
const allTypeNames = [
|
|
287
|
+
...new Set([...stateTypeNames, ...allOperationTypeNames]),
|
|
288
|
+
];
|
|
289
|
+
// Extract input type definitions from state schema, excluding operation-specific inputs
|
|
290
|
+
// (those are already defined in op.schema)
|
|
291
|
+
const operationInputTypeNames = new Set(allOperationTypeNames);
|
|
292
|
+
const stateInputTypes = extractInputTypeDefinitions(globalStateSchema ?? "", operationInputTypeNames);
|
|
293
|
+
const prefixedStateInputTypes = applyGraphQLTypePrefixes(stateInputTypes, documentName, allTypeNames);
|
|
294
|
+
// Helper to check if schema has actual GraphQL type definitions
|
|
295
|
+
const hasValidSchema = (schema) => !!(schema && /\b(input|type|enum|union|interface)\s+\w+/.test(schema));
|
|
296
|
+
// Process state schema types (remove input types, clean up, and prefix)
|
|
297
|
+
const stateSchemaTypes = globalStateSchema
|
|
298
|
+
? applyGraphQLTypePrefixes(globalStateSchema
|
|
299
|
+
.replaceAll("scalar DateTime", "")
|
|
300
|
+
.replaceAll(/input (.*?) {[\s\S]*?}/g, ""), documentName, allTypeNames)
|
|
301
|
+
: "";
|
|
302
|
+
if (useNewApi) {
|
|
303
|
+
// New API: flat queries, typed state, async mutations
|
|
304
|
+
return generateNewApiSchema(documentName, specification, stateSchemaTypes, prefixedStateInputTypes, allTypeNames, hasValidSchema);
|
|
305
|
+
}
|
|
306
|
+
// Legacy API
|
|
307
|
+
return generateLegacyApiSchema(documentName, specification, prefixedStateInputTypes, allTypeNames, hasValidSchema);
|
|
308
|
+
}
|
|
309
|
+
/**
|
|
310
|
+
* Generate legacy API schema with nested queries
|
|
311
|
+
*/
|
|
312
|
+
function generateLegacyApiSchema(documentName, specification, prefixedStateInputTypes, allTypeNames, hasValidSchema) {
|
|
313
|
+
const createDocumentMutation = `${documentName}_createDocument(name:String!, driveId:String): String`;
|
|
314
|
+
const operationMutations = specification?.modules
|
|
315
|
+
.flatMap((module) => module.operations
|
|
316
|
+
.filter((op) => op.name && hasValidSchema(op.schema))
|
|
317
|
+
.map((op) => `${documentName}_${camelCase(op.name)}(
|
|
318
|
+
driveId: String, docId: PHID, input: ${documentName}_${pascalCase(op.name)}Input): Int`))
|
|
319
|
+
.join("\n ") ?? "";
|
|
320
|
+
const moduleSchemas = specification?.modules
|
|
321
|
+
.filter((module) => module.operations.some((op) => hasValidSchema(op.schema)))
|
|
322
|
+
.map((module) => `"""
|
|
323
|
+
Module: ${pascalCase(module.name)}
|
|
324
|
+
"""
|
|
325
|
+
${module.operations
|
|
326
|
+
.filter((op) => hasValidSchema(op.schema))
|
|
327
|
+
.map((op) => applyGraphQLTypePrefixes(op.schema ?? "", documentName, allTypeNames))
|
|
328
|
+
.join("\n ")}`)
|
|
329
|
+
.join("\n") ?? "";
|
|
238
330
|
return gql `
|
|
239
331
|
"""
|
|
240
332
|
Queries: ${documentName} Document
|
|
@@ -253,23 +345,204 @@ export function generateDocumentModelSchemaLegacy(documentModel) {
|
|
|
253
345
|
Mutations: ${documentName}
|
|
254
346
|
"""
|
|
255
347
|
type Mutation {
|
|
256
|
-
${
|
|
348
|
+
${createDocumentMutation}
|
|
257
349
|
|
|
258
|
-
${
|
|
259
|
-
|
|
260
|
-
|
|
261
|
-
|
|
262
|
-
|
|
263
|
-
|
|
350
|
+
${operationMutations}
|
|
351
|
+
}
|
|
352
|
+
|
|
353
|
+
${prefixedStateInputTypes
|
|
354
|
+
? `"""
|
|
355
|
+
Input Types from State Schema
|
|
356
|
+
"""
|
|
357
|
+
${prefixedStateInputTypes}`
|
|
358
|
+
: ""}
|
|
359
|
+
|
|
360
|
+
${moduleSchemas}`;
|
|
361
|
+
}
|
|
362
|
+
/**
|
|
363
|
+
* Generate new API schema with flat queries, typed state, and async mutations.
|
|
364
|
+
* Note: State schema types are NOT included here because they are already defined
|
|
365
|
+
* in getDocumentModelTypeDefs() which is used during schema composition.
|
|
366
|
+
* Including them here would cause duplicate type definitions.
|
|
367
|
+
*
|
|
368
|
+
* Special case: DocumentModel type doesn't have a typed state defined in
|
|
369
|
+
* getDocumentModelTypeDefs(), so we use JSONObject for its state field.
|
|
370
|
+
*/
|
|
371
|
+
function generateNewApiSchema(documentName, specification, _stateSchemaTypes, prefixedStateInputTypes, allTypeNames, hasValidSchema) {
|
|
372
|
+
// Use full state type for all document models
|
|
373
|
+
const stateType = `${documentName}_FullState!`;
|
|
374
|
+
// Shared base types for document state structure (same for all document types)
|
|
375
|
+
const sharedBaseTypes = `
|
|
376
|
+
"""Hash configuration for document state"""
|
|
377
|
+
type ${documentName}_PHHashConfig {
|
|
378
|
+
algorithm: String!
|
|
379
|
+
encoding: String!
|
|
380
|
+
}
|
|
381
|
+
|
|
382
|
+
"""Document scope state (same for all document types)"""
|
|
383
|
+
type ${documentName}_PHDocumentScopeState {
|
|
384
|
+
version: Int!
|
|
385
|
+
hash: ${documentName}_PHHashConfig!
|
|
386
|
+
isDeleted: Boolean
|
|
387
|
+
deletedAtUtcIso: String
|
|
388
|
+
deletedBy: String
|
|
389
|
+
deletionReason: String
|
|
390
|
+
}
|
|
391
|
+
`;
|
|
392
|
+
// Full state type with all scopes (auth, document, global, local)
|
|
393
|
+
// Note: DocumentModel uses different naming convention (GlobalState suffix instead of State)
|
|
394
|
+
// For local state, check if the specification defines a local state type
|
|
395
|
+
const localSchema = specification?.state.local.schema ?? "";
|
|
396
|
+
const hasLocalStateType = localSchema.includes(`type ${documentName}LocalState`);
|
|
397
|
+
const globalStateType = documentName === "DocumentModel"
|
|
398
|
+
? `${documentName}_${documentName}GlobalState!`
|
|
399
|
+
: `${documentName}_${documentName}State!`;
|
|
400
|
+
const localStateType = !hasLocalStateType
|
|
401
|
+
? "JSONObject!"
|
|
402
|
+
: `${documentName}_${documentName}LocalState!`;
|
|
403
|
+
const fullStateType = `
|
|
404
|
+
"""Full state with all scopes for ${documentName}"""
|
|
405
|
+
type ${documentName}_FullState {
|
|
406
|
+
auth: JSONObject!
|
|
407
|
+
document: ${documentName}_PHDocumentScopeState!
|
|
408
|
+
global: ${globalStateType}
|
|
409
|
+
local: ${localStateType}
|
|
264
410
|
}
|
|
265
|
-
|
|
266
|
-
|
|
411
|
+
`;
|
|
412
|
+
// Common input types - use extend to avoid conflicts with other subgraphs
|
|
413
|
+
const commonInputTypes = `
|
|
414
|
+
input ${documentName}_ViewFilterInput {
|
|
415
|
+
branch: String
|
|
416
|
+
scopes: [String!]
|
|
417
|
+
}
|
|
418
|
+
|
|
419
|
+
input ${documentName}_PagingInput {
|
|
420
|
+
limit: Int
|
|
421
|
+
offset: Int
|
|
422
|
+
cursor: String
|
|
423
|
+
}
|
|
424
|
+
|
|
425
|
+
input ${documentName}_SearchFilterInput {
|
|
426
|
+
parentId: String
|
|
427
|
+
identifiers: [String!]
|
|
428
|
+
}
|
|
429
|
+
`;
|
|
430
|
+
// Revision type - imported from shared-schema.ts for consistency with ReactorSubgraph
|
|
431
|
+
// Must be defined in each subgraph for Apollo Federation
|
|
432
|
+
const revisionType = RevisionType;
|
|
433
|
+
// Result types with typed state (or JSONObject for DocumentModel)
|
|
434
|
+
// The state type (${documentName}_${documentName}State) is defined in getDocumentModelTypeDefs()
|
|
435
|
+
// Uses revisionsList with shared Revision type to match ReactorSubgraph pattern
|
|
436
|
+
const resultTypes = `
|
|
437
|
+
"""
|
|
438
|
+
Mutation result type for ${documentName} operations with typed state.
|
|
439
|
+
Matches ReactorSubgraph PHDocument pattern with revisionsList.
|
|
440
|
+
"""
|
|
441
|
+
type ${documentName}MutationResult {
|
|
442
|
+
id: String!
|
|
443
|
+
slug: String
|
|
444
|
+
name: String!
|
|
445
|
+
documentType: String!
|
|
446
|
+
state: ${stateType}
|
|
447
|
+
revisionsList: [Revision!]!
|
|
448
|
+
createdAtUtcIso: DateTime!
|
|
449
|
+
lastModifiedAtUtcIso: DateTime!
|
|
450
|
+
}
|
|
451
|
+
|
|
452
|
+
"""
|
|
453
|
+
Document with children for ${documentName}
|
|
454
|
+
"""
|
|
455
|
+
type ${documentName}_DocumentWithChildren {
|
|
456
|
+
document: ${documentName}MutationResult!
|
|
457
|
+
childIds: [String!]!
|
|
458
|
+
}
|
|
459
|
+
|
|
460
|
+
"""
|
|
461
|
+
Paginated result type for ${documentName} documents
|
|
462
|
+
"""
|
|
463
|
+
type ${documentName}_DocumentResultPage {
|
|
464
|
+
items: [${documentName}MutationResult!]!
|
|
465
|
+
totalCount: Int!
|
|
466
|
+
hasNextPage: Boolean!
|
|
467
|
+
hasPreviousPage: Boolean!
|
|
468
|
+
cursor: String
|
|
469
|
+
}
|
|
470
|
+
`;
|
|
471
|
+
// Flat queries (not nested) - prefixed input types to avoid conflicts
|
|
472
|
+
const queries = `
|
|
473
|
+
type Query {
|
|
474
|
+
"""Get a specific ${documentName} document by identifier"""
|
|
475
|
+
${documentName}_document(identifier: String!, view: ${documentName}_ViewFilterInput): ${documentName}_DocumentWithChildren
|
|
476
|
+
|
|
477
|
+
"""Find ${documentName} documents by search criteria"""
|
|
478
|
+
${documentName}_findDocuments(search: ${documentName}_SearchFilterInput!, view: ${documentName}_ViewFilterInput, paging: ${documentName}_PagingInput): ${documentName}_DocumentResultPage!
|
|
479
|
+
|
|
480
|
+
"""Get children of a ${documentName} document"""
|
|
481
|
+
${documentName}_documentChildren(parentIdentifier: String!, view: ${documentName}_ViewFilterInput, paging: ${documentName}_PagingInput): ${documentName}_DocumentResultPage!
|
|
482
|
+
|
|
483
|
+
"""Get parents of a ${documentName} document"""
|
|
484
|
+
${documentName}_documentParents(childIdentifier: String!, view: ${documentName}_ViewFilterInput, paging: ${documentName}_PagingInput): ${documentName}_DocumentResultPage!
|
|
485
|
+
}
|
|
486
|
+
`;
|
|
487
|
+
// Mutations: sync and async versions
|
|
488
|
+
const createDocumentMutation = `${documentName}_createDocument(name: String!, parentIdentifier: String): ${documentName}MutationResult!`;
|
|
489
|
+
const createEmptyDocumentMutation = `${documentName}_createEmptyDocument(parentIdentifier: String): ${documentName}MutationResult!`;
|
|
490
|
+
const operationMutations = specification?.modules
|
|
491
|
+
.flatMap((module) => module.operations
|
|
492
|
+
.filter((op) => op.name && hasValidSchema(op.schema))
|
|
493
|
+
.flatMap((op) => [
|
|
494
|
+
// Sync mutation
|
|
495
|
+
`${documentName}_${camelCase(op.name)}(docId: PHID!, input: ${documentName}_${pascalCase(op.name)}Input!): ${documentName}MutationResult!`,
|
|
496
|
+
// Async mutation
|
|
497
|
+
`${documentName}_${camelCase(op.name)}Async(docId: PHID!, input: ${documentName}_${pascalCase(op.name)}Input!): String!`,
|
|
498
|
+
]))
|
|
499
|
+
.join("\n ") ?? "";
|
|
500
|
+
const moduleSchemas = specification?.modules
|
|
501
|
+
.filter((module) => module.operations.some((op) => hasValidSchema(op.schema)))
|
|
267
502
|
.map((module) => `"""
|
|
268
503
|
Module: ${pascalCase(module.name)}
|
|
269
504
|
"""
|
|
270
505
|
${module.operations
|
|
271
|
-
.
|
|
506
|
+
.filter((op) => hasValidSchema(op.schema))
|
|
507
|
+
.map((op) => applyGraphQLTypePrefixes(op.schema ?? "", documentName, allTypeNames))
|
|
272
508
|
.join("\n ")}`)
|
|
273
|
-
.join("\n") ?? ""
|
|
509
|
+
.join("\n") ?? "";
|
|
510
|
+
return gql `
|
|
511
|
+
scalar DateTime
|
|
512
|
+
scalar JSONObject
|
|
513
|
+
|
|
514
|
+
${revisionType}
|
|
515
|
+
|
|
516
|
+
${sharedBaseTypes}
|
|
517
|
+
|
|
518
|
+
${fullStateType}
|
|
519
|
+
|
|
520
|
+
${commonInputTypes}
|
|
521
|
+
|
|
522
|
+
${resultTypes}
|
|
523
|
+
|
|
524
|
+
"""
|
|
525
|
+
Queries: ${documentName} Document
|
|
526
|
+
"""
|
|
527
|
+
${queries}
|
|
528
|
+
|
|
529
|
+
"""
|
|
530
|
+
Mutations: ${documentName}
|
|
531
|
+
"""
|
|
532
|
+
type Mutation {
|
|
533
|
+
${createDocumentMutation}
|
|
534
|
+
${createEmptyDocumentMutation}
|
|
535
|
+
|
|
536
|
+
${operationMutations}
|
|
537
|
+
}
|
|
538
|
+
|
|
539
|
+
${prefixedStateInputTypes
|
|
540
|
+
? `"""
|
|
541
|
+
Input Types from State Schema
|
|
542
|
+
"""
|
|
543
|
+
${prefixedStateInputTypes}`
|
|
544
|
+
: ""}
|
|
545
|
+
|
|
546
|
+
${moduleSchemas}`;
|
|
274
547
|
}
|
|
275
548
|
//# sourceMappingURL=create-schema.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"create-schema.js","sourceRoot":"","sources":["../../../src/utils/create-schema.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"create-schema.js","sourceRoot":"","sources":["../../../src/utils/create-schema.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,mBAAmB,EAAE,MAAM,kBAAkB,CAAC;AAKvD,OAAO,EAAE,QAAQ,IAAI,eAAe,EAAE,MAAM,6CAA6C,CAAC;AAE1F,OAAO,EAAE,SAAS,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AACpD,OAAO,EAAE,WAAW,EAA6B,MAAM,gBAAgB,CAAC;AAExE,OAAO,EAAqB,IAAI,EAAE,KAAK,EAAE,MAAM,SAAS,CAAC;AACzD,OAAO,EAAE,GAAG,EAAE,MAAM,aAAa,CAAC;AAClC,OAAO,EAAE,iBAAiB,EAAE,MAAM,mBAAmB,CAAC;AAEtD,MAAM,MAAM,GAAG,WAAW,CAAC,CAAC,aAAa,EAAE,eAAe,CAAC,CAAC,CAAC;AAE7D;;;GAGG;AACH,MAAM,YAAY,GAAG;;;;;CAKpB,CAAC;AAEF;;;GAGG;AACH,MAAM,sBAAsB,GAAG,CAAC,GAAiB,EAAU,EAAE;IAC3D,MAAM,mBAAmB,GAAG,GAAG,CAAC,WAAW,CAAC,MAAM,CAChD,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,CAAC,IAAI,KAAK,IAAI,CAAC,sBAAsB,CAClD,CAAC;IACF,OAAO,KAAK,CAAC,EAAE,IAAI,EAAE,IAAI,CAAC,QAAQ,EAAE,WAAW,EAAE,mBAAmB,EAAE,CAAC,CAAC;AAC1E,CAAC,CAAC;AAEF,MAAM,CAAC,MAAM,yBAAyB,GAAG,CACvC,mBAAyC,EACzC,SAAsC,EACtC,QAAsB,EACD,EAAE;IACvB,MAAM,YAAY,GAAG;QACnB,GAAG,SAAS;QACZ,UAAU,EAAE,iBAAiB;KAC9B,CAAC;IAEF,OAAO;QACL,QAAQ,EAAE,wBAAwB,CAAC,mBAAmB,EAAE,QAAQ,CAAC;QACjE,SAAS,EAAE,YAAY;KACxB,CAAC;AACJ,CAAC,CAAC;AACF,MAAM,CAAC,MAAM,YAAY,GAAG,CAC1B,mBAAyC,EACzC,SAAsC,EACtC,QAAsB,EACtB,EAAE;IACF,OAAO,mBAAmB,CACxB,yBAAyB,CAAC,mBAAmB,EAAE,SAAS,EAAE,QAAQ,CAAC,CACpE,CAAC;AACJ,CAAC,CAAC;AAEF,MAAM,UAAU,0BAA0B,CACxC,aAAuC;IAEvC,OAAO,UAAU,CAAC,aAAa,CAAC,IAAI,CAAC,UAAU,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC,CAAC;AAC7D,CAAC;AAED,MAAM,CAAC,MAAM,wBAAwB,GAAG,CACtC,mBAA0E,EAC1E,QAAsB,EACtB,EAAE;IACF,MAAM,cAAc,GAAG,mBAAmB,CAAC,uBAAuB,EAAE,CAAC;IACrE,IAAI,QAAQ,GAAG,EAAE,CAAC;IAElB,MAAM,mBAAmB,GAAG,IAAI,GAAG,EAAU,CAAC;IAC9C,cAAc,CAAC,OAAO,CAAC,CAAC,EAAE,aAAa,EAAE,EAAE,EAAE;QAC3C,MAAM,YAAY,GAAG,0BAA0B,CAAC,aAAa,CAAC,MAAM,CAAC,CAAC;QACtE,IAAI,mBAAmB,CAAC,GAAG,CAAC,YAAY,CAAC,EAAE,CAAC;YAC1C,MAAM,CAAC,KAAK,CACV,gDAAgD,YAAY,EAAE,CAC/D,CAAC;YACF,OAAO;QACT,CAAC;QACD,mBAAmB,CAAC,GAAG,CAAC,YAAY,CAAC,CAAC;QACtC,IAAI,WAAW,GAAG;YACV,aAAa,CAAC,MAAM,CAAC,cAAc;aAClC,GAAG,CAAC,CAAC,aAAa,EAAE,EAAE,CACrB,aAAa,CAAC,KAAK,CAAC,MAAM,CAAC,MAAM;aAC9B,UAAU,CAAC,iBAAiB,EAAE,EAAE,CAAC;aACjC,UAAU,CAAC,yBAAyB,EAAE,EAAE,CAAC,CAC7C;aACA,IAAI,CAAC,IAAI,CAAC;;YAEX,aAAa,CAAC,MAAM,CAAC,cAAc;aAClC,GAAG,CAAC,CAAC,aAAa,EAAE,EAAE,CACrB,aAAa,CAAC,KAAK,CAAC,KAAK,CAAC,MAAM;aAC7B,UAAU,CAAC,iBAAiB,EAAE,EAAE,CAAC;aACjC,UAAU,CAAC,yBAAyB,EAAE,EAAE,CAAC;aACzC,UAAU,CAAC,gCAAgC,EAAE,EAAE,CAAC;aAChD,UAAU,CAAC,gCAAgC,EAAE,EAAE,CAAC;aAChD,UAAU,CAAC,+BAA+B,EAAE,EAAE,CAAC,CACnD;aACA,IAAI,CAAC,IAAI,CAAC;;OAEhB,CAAC;QAEJ,MAAM,KAAK,GAAG,WAAW,CAAC,KAAK,CAC7B,2CAA2C,CAC5C,CAAC;QACF,MAAM,YAAY,GAAG,KAAK,EAAE,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CACpC,CAAC;aACE,UAAU,CAAC,OAAO,EAAE,EAAE,CAAC;aACvB,UAAU,CAAC,OAAO,EAAE,EAAE,CAAC;aACvB,UAAU,CAAC,QAAQ,EAAE,EAAE,CAAC;aACxB,UAAU,CAAC,YAAY,EAAE,EAAE,CAAC;aAC5B,UAAU,CAAC,GAAG,EAAE,EAAE,CAAC;aACnB,IAAI,EAAE,CACV,CAAC;QACF,YAAY,EAAE,OAAO,CAAC,CAAC,CAAC,EAAE,EAAE;YAC1B,mEAAmE;YACnE,MAAM,SAAS,GAAG,IAAI,MAAM;YAC1B,oDAAoD;YACpD,qBAAqB,CAAC,oBAAoB,GAAG,wBAAwB;gBACnE,OAAO,CAAC,OAAO,GAAG,kCAAkC;gBACpD,OAAO,CAAC,QAAQ,GAAG,0BAA0B;gBAC7C,OAAO,CAAC,QAAQ,GAAG,0BAA0B;gBAC7C,OAAO,CAAC,QAAQ,EAAE,mCAAmC;YACvD,GAAG,CACJ,CAAC;YAEF,WAAW,GAAG,WAAW,CAAC,OAAO,CAC/B,SAAS,EACT,CACE,KAAa,EACb,EAAU,EACV,EAAU,EACV,EAAU,EACV,EAAU,EACV,EAAU,EACV,EAAE;gBACF,mFAAmF;gBACnF,IAAI,KAAK,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC;oBAC1B,OAAO,KAAK,CAAC,OAAO,CAClB,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,EACpB,GAAG,YAAY,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,EAAE,CAC1C,CAAC;gBACJ,CAAC;gBACD,uBAAuB;gBACvB,OAAO,GAAG,YAAY,IAAI,EAAE,EAAE,CAAC;YACjC,CAAC,CACF,CAAC;QACJ,CAAC,CAAC,CAAC;QACH,QAAQ,IAAI,WAAW,CAAC;QACxB,QAAQ,IAAI;WACL,YAAY;;;;;;;;gBAQP,YAAY,KAAK,eAAe,CAAC,CAAC,CAAC,iBAAiB,YAAY,IAAI,YAAY,QAAQ,CAAC,CAAC,CAAC,EAAE;gBAC7F,YAAY,KAAK,eAAe,CAAC,CAAC,CAAC,UAAU,YAAY,IAAI,YAAY,QAAQ,CAAC,CAAC,CAAC,EAAE;;cAExF,CAAC;IACb,CAAC,CAAC,CAAC;IAEH,mCAAmC;IACnC,MAAM,MAAM,GAAG,GAAG,CAAA;;MAEd,eAAe,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,UAAU,CAAC,GAAG,EAAE,EAAE,CAAC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;MA6C9C,QAAQ,CAAC,UAAU,CAAC,GAAG,EAAE,EAAE,CAAC;;;;;;;;;;;;;;;;;;;;;;;;MAwB5B,sBAAsB,CAAC,QAAQ,CAAC;GACnC,CAAC;IAEF,OAAO,MAAM,CAAC;AAChB,CAAC,CAAC;AAEF;;;;GAIG;AACH,SAAS,gBAAgB,CAAC,MAAc;IACtC,MAAM,KAAK,GAAG,MAAM,CAAC,KAAK,CAAC,iDAAiD,CAAC,CAAC;IAC9E,IAAI,CAAC,KAAK;QAAE,OAAO,EAAE,CAAC;IACtB,OAAO,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CACrB,CAAC;SACE,UAAU,CAAC,OAAO,EAAE,EAAE,CAAC;SACvB,UAAU,CAAC,OAAO,EAAE,EAAE,CAAC;SACvB,UAAU,CAAC,QAAQ,EAAE,EAAE,CAAC;SACxB,UAAU,CAAC,YAAY,EAAE,EAAE,CAAC;SAC5B,UAAU,CAAC,QAAQ,EAAE,EAAE,CAAC;SACxB,UAAU,CAAC,GAAG,EAAE,EAAE,CAAC;SACnB,IAAI,EAAE,CACV,CAAC;AACJ,CAAC;AAED;;;;;GAKG;AACH,SAAS,2BAA2B,CAClC,MAAc,EACd,mBAAgC,IAAI,GAAG,EAAE;IAEzC,kDAAkD;IAClD,MAAM,cAAc,GAAG,4BAA4B,CAAC;IACpD,MAAM,OAAO,GAAa,EAAE,CAAC;IAC7B,IAAI,KAAK,CAAC;IACV,OAAO,CAAC,KAAK,GAAG,cAAc,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,KAAK,IAAI,EAAE,CAAC;QACtD,MAAM,QAAQ,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC;QAC1B,iDAAiD;QACjD,IAAI,CAAC,gBAAgB,CAAC,GAAG,CAAC,QAAQ,CAAC,EAAE,CAAC;YACpC,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;QACzB,CAAC;IACH,CAAC;IACD,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,EAAE,CAAC;IACpC,OAAO,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;AAC9B,CAAC;AAED;;;;;;;GAOG;AACH,SAAS,wBAAwB,CAC/B,MAAc,EACd,MAAc,EACd,oBAA8B,EAAE;IAEhC,IAAI,CAAC,MAAM,IAAI,CAAC,MAAM,CAAC,IAAI,EAAE,EAAE,CAAC;QAC9B,OAAO,MAAM,CAAC;IAChB,CAAC;IAED,IAAI,eAAe,GAAG,MAAM,CAAC;IAE7B,oCAAoC;IACpC,MAAM,cAAc,GAAG,gBAAgB,CAAC,MAAM,CAAC,CAAC;IAEhD,uDAAuD;IACvD,MAAM,YAAY,GAAG,CAAC,GAAG,IAAI,GAAG,CAAC,CAAC,GAAG,cAAc,EAAE,GAAG,iBAAiB,CAAC,CAAC,CAAC,CAAC;IAE7E,IAAI,YAAY,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAC9B,OAAO,MAAM,CAAC;IAChB,CAAC;IAED,YAAY,CAAC,OAAO,CAAC,CAAC,QAAQ,EAAE,EAAE;QAChC,MAAM,SAAS,GAAG,IAAI,MAAM;QAC1B,oDAAoD;QACpD,qBAAqB,QAAQ,oBAAoB;YAC/C,OAAO,QAAQ,OAAO;YACtB,OAAO,QAAQ,QAAQ;YACvB,OAAO,QAAQ,QAAQ;YACvB,OAAO,QAAQ,QAAQ,EACzB,GAAG,CACJ,CAAC;QAEF,eAAe,GAAG,eAAe,CAAC,OAAO,CACvC,SAAS,EACT,CAAC,KAAK,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE;YAC5B,IAAI,KAAK,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC;gBAC1B,OAAO,KAAK,CAAC,OAAO,CAClB,CAAC,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,CAAW,EAChC,GAAG,MAAM,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,EAAE,CACpC,CAAC;YACJ,CAAC;YACD,uBAAuB;YACvB,OAAO,GAAG,MAAM,IAAI,EAAE,EAAE,CAAC;QAC3B,CAAC,CACF,CAAC;IACJ,CAAC,CAAC,CAAC;IAEH,OAAO,eAAe,CAAC;AACzB,CAAC;AAgBD;;;;;;GAMG;AACH,MAAM,UAAU,2BAA2B,CACzC,aAAuC,EACvC,UAAsC,EAAE;IAExC,MAAM,EAAE,SAAS,GAAG,KAAK,EAAE,GAAG,OAAO,CAAC;IAEtC,MAAM,aAAa,GAAG,aAAa,CAAC,cAAc,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;IAC1D,MAAM,YAAY,GAAG,0BAA0B,CAAC,aAAa,CAAC,CAAC;IAC/D,MAAM,iBAAiB,GAAG,aAAa,EAAE,KAAK,CAAC,MAAM,CAAC,MAAM,CAAC;IAC7D,MAAM,gBAAgB,GAAG,aAAa,EAAE,KAAK,CAAC,KAAK,CAAC,MAAM,CAAC;IAC3D,MAAM,oBAAoB,GAAG,gBAAgB,CAAC,iBAAiB,IAAI,EAAE,CAAC,CAAC;IACvE,MAAM,mBAAmB,GAAG,gBAAgB,CAAC,gBAAgB,IAAI,EAAE,CAAC,CAAC;IACrE,MAAM,cAAc,GAAG,CAAC,GAAG,oBAAoB,EAAE,GAAG,mBAAmB,CAAC,CAAC;IAEzE,sDAAsD;IACtD,MAAM,qBAAqB,GACzB,aAAa,EAAE,OAAO,CAAC,OAAO,CAAC,CAAC,MAAM,EAAE,EAAE,CACxC,MAAM,CAAC,UAAU,CAAC,OAAO,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,gBAAgB,CAAC,EAAE,CAAC,MAAM,IAAI,EAAE,CAAC,CAAC,CACrE,IAAI,EAAE,CAAC;IAEV,4DAA4D;IAC5D,MAAM,YAAY,GAAG;QACnB,GAAG,IAAI,GAAG,CAAC,CAAC,GAAG,cAAc,EAAE,GAAG,qBAAqB,CAAC,CAAC;KAC1D,CAAC;IAEF,wFAAwF;IACxF,2CAA2C;IAC3C,MAAM,uBAAuB,GAAG,IAAI,GAAG,CAAC,qBAAqB,CAAC,CAAC;IAC/D,MAAM,eAAe,GAAG,2BAA2B,CACjD,iBAAiB,IAAI,EAAE,EACvB,uBAAuB,CACxB,CAAC;IACF,MAAM,uBAAuB,GAAG,wBAAwB,CACtD,eAAe,EACf,YAAY,EACZ,YAAY,CACb,CAAC;IAEF,gEAAgE;IAChE,MAAM,cAAc,GAAG,CAAC,MAAiC,EAAW,EAAE,CACpE,CAAC,CAAC,CAAC,MAAM,IAAI,2CAA2C,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC;IAEzE,wEAAwE;IACxE,MAAM,gBAAgB,GAAG,iBAAiB;QACxC,CAAC,CAAC,wBAAwB,CACtB,iBAAiB;aACd,UAAU,CAAC,iBAAiB,EAAE,EAAE,CAAC;aACjC,UAAU,CAAC,yBAAyB,EAAE,EAAE,CAAC,EAC5C,YAAY,EACZ,YAAY,CACb;QACH,CAAC,CAAC,EAAE,CAAC;IAEP,IAAI,SAAS,EAAE,CAAC;QACd,sDAAsD;QACtD,OAAO,oBAAoB,CACzB,YAAY,EACZ,aAAa,EACb,gBAAgB,EAChB,uBAAuB,EACvB,YAAY,EACZ,cAAc,CACf,CAAC;IACJ,CAAC;IAED,aAAa;IACb,OAAO,uBAAuB,CAC5B,YAAY,EACZ,aAAa,EACb,uBAAuB,EACvB,YAAY,EACZ,cAAc,CACf,CAAC;AACJ,CAAC;AAED;;GAEG;AACH,SAAS,uBAAuB,CAC9B,YAAoB,EACpB,aAAwE,EACxE,uBAA+B,EAC/B,YAAsB,EACtB,cAA8D;IAE9D,MAAM,sBAAsB,GAAG,GAAG,YAAY,uDAAuD,CAAC;IAEtG,MAAM,kBAAkB,GACtB,aAAa,EAAE,OAAO;SACnB,OAAO,CAAC,CAAC,MAAM,EAAE,EAAE,CAClB,MAAM,CAAC,UAAU;SACd,MAAM,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,CAAC,IAAI,IAAI,cAAc,CAAC,EAAE,CAAC,MAAM,CAAC,CAAC;SACpD,GAAG,CACF,CAAC,EAAE,EAAE,EAAE,CACL,GAAG,YAAY,IAAI,SAAS,CAAC,EAAE,CAAC,IAAK,CAAC;mDACD,YAAY,IAAI,UAAU,CAAC,EAAE,CAAC,IAAK,CAAC,aAAa,CACzF,CACJ;SACA,IAAI,CAAC,YAAY,CAAC,IAAI,EAAE,CAAC;IAE9B,MAAM,aAAa,GACjB,aAAa,EAAE,OAAO;SACnB,MAAM,CAAC,CAAC,MAAM,EAAE,EAAE,CACjB,MAAM,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,cAAc,CAAC,EAAE,CAAC,MAAM,CAAC,CAAC,CAC1D;SACA,GAAG,CACF,CAAC,MAAM,EAAE,EAAE,CACT;iBACO,UAAU,CAAC,MAAM,CAAC,IAAI,CAAC;;SAE/B,MAAM,CAAC,UAAU;SAChB,MAAM,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,cAAc,CAAC,EAAE,CAAC,MAAM,CAAC,CAAC;SACzC,GAAG,CAAC,CAAC,EAAE,EAAE,EAAE,CACV,wBAAwB,CACtB,EAAE,CAAC,MAAM,IAAI,EAAE,EACf,YAAY,EACZ,YAAY,CACb,CACF;SACA,IAAI,CAAC,MAAM,CAAC,EAAE,CACjB;SACA,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC;IAEtB,OAAO,GAAG,CAAA;;eAEG,YAAY;;;WAGhB,YAAY;oDAC6B,YAAY;2CACrB,YAAY;;;;UAI7C,YAAY,KAAK,YAAY;;;;iBAItB,YAAY;;;UAGnB,sBAAsB;;UAEtB,kBAAkB;;;MAItB,uBAAuB;QACrB,CAAC,CAAC;;;MAGJ,uBAAuB,EAAE;QACvB,CAAC,CAAC,EACN;;MAEE,aAAa,EAAE,CAAC;AACtB,CAAC;AAED;;;;;;;;GAQG;AACH,SAAS,oBAAoB,CAC3B,YAAoB,EACpB,aAAwE,EACxE,iBAAyB,EACzB,uBAA+B,EAC/B,YAAsB,EACtB,cAA8D;IAE9D,8CAA8C;IAC9C,MAAM,SAAS,GAAG,GAAG,YAAY,aAAa,CAAC;IAE/C,+EAA+E;IAC/E,MAAM,eAAe,GAAG;;WAEf,YAAY;;;;;;WAMZ,YAAY;;cAET,YAAY;;;;;;GAMvB,CAAC;IAEF,kEAAkE;IAClE,6FAA6F;IAC7F,yEAAyE;IACzE,MAAM,WAAW,GAAG,aAAa,EAAE,KAAK,CAAC,KAAK,CAAC,MAAM,IAAI,EAAE,CAAC;IAC5D,MAAM,iBAAiB,GAAG,WAAW,CAAC,QAAQ,CAC5C,QAAQ,YAAY,YAAY,CACjC,CAAC;IAEF,MAAM,eAAe,GACnB,YAAY,KAAK,eAAe;QAC9B,CAAC,CAAC,GAAG,YAAY,IAAI,YAAY,cAAc;QAC/C,CAAC,CAAC,GAAG,YAAY,IAAI,YAAY,QAAQ,CAAC;IAC9C,MAAM,cAAc,GAAG,CAAC,iBAAiB;QACvC,CAAC,CAAC,aAAa;QACf,CAAC,CAAC,GAAG,YAAY,IAAI,YAAY,aAAa,CAAC;IAEjD,MAAM,aAAa,GAAG;wCACgB,YAAY;WACzC,YAAY;;kBAEL,YAAY;gBACd,eAAe;eAChB,cAAc;;GAE1B,CAAC;IAEF,0EAA0E;IAC1E,MAAM,gBAAgB,GAAG;YACf,YAAY;;;;;YAKZ,YAAY;;;;;;YAMZ,YAAY;;;;GAIrB,CAAC;IAEF,sFAAsF;IACtF,yDAAyD;IACzD,MAAM,YAAY,GAAG,YAAY,CAAC;IAElC,kEAAkE;IAClE,iGAAiG;IACjG,gFAAgF;IAChF,MAAM,WAAW,GAAG;;+BAES,YAAY;;;WAGhC,YAAY;;;;;eAKR,SAAS;;;;;;;iCAOS,YAAY;;WAElC,YAAY;kBACL,YAAY;;;;;gCAKE,YAAY;;WAEjC,YAAY;gBACP,YAAY;;;;;;GAMzB,CAAC;IAEF,sEAAsE;IACtE,MAAM,OAAO,GAAG;;0BAEQ,YAAY;QAC9B,YAAY,wCAAwC,YAAY,sBAAsB,YAAY;;gBAE1F,YAAY;QACpB,YAAY,0BAA0B,YAAY,8BAA8B,YAAY,6BAA6B,YAAY,kBAAkB,YAAY;;6BAE9I,YAAY;QACjC,YAAY,sDAAsD,YAAY,6BAA6B,YAAY,kBAAkB,YAAY;;4BAEjI,YAAY;QAChC,YAAY,oDAAoD,YAAY,6BAA6B,YAAY,kBAAkB,YAAY;;GAExJ,CAAC;IAEF,qCAAqC;IACrC,MAAM,sBAAsB,GAAG,GAAG,YAAY,6DAA6D,YAAY,iBAAiB,CAAC;IACzI,MAAM,2BAA2B,GAAG,GAAG,YAAY,mDAAmD,YAAY,iBAAiB,CAAC;IAEpI,MAAM,kBAAkB,GACtB,aAAa,EAAE,OAAO;SACnB,OAAO,CAAC,CAAC,MAAM,EAAE,EAAE,CAClB,MAAM,CAAC,UAAU;SACd,MAAM,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,CAAC,IAAI,IAAI,cAAc,CAAC,EAAE,CAAC,MAAM,CAAC,CAAC;SACpD,OAAO,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC;QACf,gBAAgB;QAChB,GAAG,YAAY,IAAI,SAAS,CAAC,EAAE,CAAC,IAAK,CAAC,yBAAyB,YAAY,IAAI,UAAU,CAAC,EAAE,CAAC,IAAK,CAAC,YAAY,YAAY,iBAAiB;QAC5I,iBAAiB;QACjB,GAAG,YAAY,IAAI,SAAS,CAAC,EAAE,CAAC,IAAK,CAAC,8BAA8B,YAAY,IAAI,UAAU,CAAC,EAAE,CAAC,IAAK,CAAC,kBAAkB;KAC3H,CAAC,CACL;SACA,IAAI,CAAC,YAAY,CAAC,IAAI,EAAE,CAAC;IAE9B,MAAM,aAAa,GACjB,aAAa,EAAE,OAAO;SACnB,MAAM,CAAC,CAAC,MAAM,EAAE,EAAE,CACjB,MAAM,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,cAAc,CAAC,EAAE,CAAC,MAAM,CAAC,CAAC,CAC1D;SACA,GAAG,CACF,CAAC,MAAM,EAAE,EAAE,CACT;iBACO,UAAU,CAAC,MAAM,CAAC,IAAI,CAAC;;SAE/B,MAAM,CAAC,UAAU;SAChB,MAAM,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,cAAc,CAAC,EAAE,CAAC,MAAM,CAAC,CAAC;SACzC,GAAG,CAAC,CAAC,EAAE,EAAE,EAAE,CACV,wBAAwB,CACtB,EAAE,CAAC,MAAM,IAAI,EAAE,EACf,YAAY,EACZ,YAAY,CACb,CACF;SACA,IAAI,CAAC,MAAM,CAAC,EAAE,CACjB;SACA,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC;IAEtB,OAAO,GAAG,CAAA;;;;MAIN,YAAY;;MAEZ,eAAe;;MAEf,aAAa;;MAEb,gBAAgB;;MAEhB,WAAW;;;eAGF,YAAY;;MAErB,OAAO;;;iBAGI,YAAY;;;UAGnB,sBAAsB;UACtB,2BAA2B;;UAE3B,kBAAkB;;;MAItB,uBAAuB;QACrB,CAAC,CAAC;;;MAGJ,uBAAuB,EAAE;QACvB,CAAC,CAAC,EACN;;MAEE,aAAa,EAAE,CAAC;AACtB,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"drive-url.d.ts","sourceRoot":"","sources":["../../../src/utils/drive-url.ts"],"names":[],"mappings":"AACA,OAAO,EACL,cAAc,EACd,aAAa,EACb,KAAK,cAAc,GACpB,MAAM,wBAAwB,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"drive-url.js","sourceRoot":"","sources":["../../../src/utils/drive-url.ts"],"names":[],"mappings":"AAAA,oEAAoE;AACpE,OAAO,EACL,cAAc,EACd,aAAa,GAEd,MAAM,wBAAwB,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/utils/index.ts"],"names":[],"mappings":"AAAA,cAAc,oBAAoB,CAAC;AACnC,cAAc,SAAS,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/utils/index.ts"],"names":[],"mappings":"AAAA,cAAc,oBAAoB,CAAC;AACnC,cAAc,SAAS,CAAC;AACxB,cAAc,gBAAgB,CAAC"}
|
package/dist/src/utils/index.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/utils/index.ts"],"names":[],"mappings":"AAAA,cAAc,oBAAoB,CAAC;AACnC,cAAc,SAAS,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/utils/index.ts"],"names":[],"mappings":"AAAA,cAAc,oBAAoB,CAAC;AACnC,cAAc,SAAS,CAAC;AACxB,cAAc,gBAAgB,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"connect-switchboard-reshuffle-convergence.test.d.ts","sourceRoot":"","sources":["../../test/connect-switchboard-reshuffle-convergence.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,203 @@
|
|
|
1
|
+
import { ConsoleLogger, DocumentModelRegistry, EventBus, GqlRequestChannelFactory, GqlResponseChannelFactory, InMemoryQueue, JobStatus, NullDocumentModelResolver, ReactorBuilder, SyncBuilder, driveCollectionId, } from "@powerhousedao/reactor";
|
|
2
|
+
import { driveDocumentModelModule } from "document-drive";
|
|
3
|
+
import { afterEach, describe, expect, it, vi } from "vitest";
|
|
4
|
+
import { createResolverBridge } from "./utils/gql-resolver-bridge.js";
|
|
5
|
+
const DOCUMENT_ID = "3af9b9e2-4b3f-45d4-87b3-5d345b1fb398";
|
|
6
|
+
const FIXED_TIMESTAMP = "2026-02-17T16:17:13.886Z";
|
|
7
|
+
const WAIT_STEP_MS = 50;
|
|
8
|
+
function createConnectModule(logger, eventBus, queue) {
|
|
9
|
+
return new ReactorBuilder()
|
|
10
|
+
.withEventBus(eventBus)
|
|
11
|
+
.withQueue(queue)
|
|
12
|
+
.withDocumentModels([
|
|
13
|
+
driveDocumentModelModule,
|
|
14
|
+
])
|
|
15
|
+
.withSync(new SyncBuilder().withChannelFactory(new GqlRequestChannelFactory(logger, undefined, queue)))
|
|
16
|
+
.buildModule();
|
|
17
|
+
}
|
|
18
|
+
function createSwitchboardModule(logger, eventBus, queue) {
|
|
19
|
+
return new ReactorBuilder()
|
|
20
|
+
.withEventBus(eventBus)
|
|
21
|
+
.withQueue(queue)
|
|
22
|
+
.withDocumentModels([
|
|
23
|
+
driveDocumentModelModule,
|
|
24
|
+
])
|
|
25
|
+
.withSync(new SyncBuilder().withChannelFactory(new GqlResponseChannelFactory(logger)))
|
|
26
|
+
.buildModule();
|
|
27
|
+
}
|
|
28
|
+
async function setup() {
|
|
29
|
+
const logger = new ConsoleLogger(["test"]);
|
|
30
|
+
const eventA = new EventBus();
|
|
31
|
+
const eventB = new EventBus();
|
|
32
|
+
const eventS = new EventBus();
|
|
33
|
+
const modelRegistry = new DocumentModelRegistry();
|
|
34
|
+
modelRegistry.registerModules(driveDocumentModelModule);
|
|
35
|
+
const resolver = new NullDocumentModelResolver(modelRegistry);
|
|
36
|
+
const queueA = new InMemoryQueue(eventA, resolver);
|
|
37
|
+
const queueB = new InMemoryQueue(eventB, resolver);
|
|
38
|
+
const queueS = new InMemoryQueue(eventS, resolver);
|
|
39
|
+
const connectA = await createConnectModule(logger, eventA, queueA);
|
|
40
|
+
const connectB = await createConnectModule(logger, eventB, queueB);
|
|
41
|
+
const switchboard = await createSwitchboardModule(logger, eventS, queueS);
|
|
42
|
+
const syncManagerRegistry = new Map();
|
|
43
|
+
syncManagerRegistry.set("switchboard", switchboard.syncModule.syncManager);
|
|
44
|
+
const bridge = createResolverBridge(syncManagerRegistry, { log: false });
|
|
45
|
+
return { connectA, connectB, switchboard, bridge };
|
|
46
|
+
}
|
|
47
|
+
async function advanceAndFlush(ms) {
|
|
48
|
+
await vi.advanceTimersByTimeAsync(ms);
|
|
49
|
+
await Promise.resolve();
|
|
50
|
+
}
|
|
51
|
+
async function waitForJobCompletion(reactor, jobId, timeoutMs = 20000) {
|
|
52
|
+
let elapsedMs = 0;
|
|
53
|
+
while (elapsedMs <= timeoutMs) {
|
|
54
|
+
const status = await reactor.getJobStatus(jobId);
|
|
55
|
+
if (status.status === JobStatus.READ_READY) {
|
|
56
|
+
return;
|
|
57
|
+
}
|
|
58
|
+
if (status.status === JobStatus.FAILED) {
|
|
59
|
+
throw new Error(`Job ${jobId} failed: ${status.error?.message ?? "unknown"}`);
|
|
60
|
+
}
|
|
61
|
+
await advanceAndFlush(WAIT_STEP_MS);
|
|
62
|
+
elapsedMs += WAIT_STEP_MS;
|
|
63
|
+
}
|
|
64
|
+
throw new Error(`Timed out waiting for job ${jobId}`);
|
|
65
|
+
}
|
|
66
|
+
async function waitForDocumentAvailable(reactor, documentId, timeoutMs = 20000) {
|
|
67
|
+
let elapsedMs = 0;
|
|
68
|
+
while (elapsedMs <= timeoutMs) {
|
|
69
|
+
try {
|
|
70
|
+
await reactor.get(documentId, { branch: "main" });
|
|
71
|
+
return;
|
|
72
|
+
}
|
|
73
|
+
catch {
|
|
74
|
+
// Keep polling until available.
|
|
75
|
+
}
|
|
76
|
+
await advanceAndFlush(WAIT_STEP_MS);
|
|
77
|
+
elapsedMs += WAIT_STEP_MS;
|
|
78
|
+
}
|
|
79
|
+
throw new Error(`Timed out waiting for document ${documentId}`);
|
|
80
|
+
}
|
|
81
|
+
function createDeterministicAddFolderAction(actionId, folderId) {
|
|
82
|
+
const action = driveDocumentModelModule.actions.addFolder({
|
|
83
|
+
id: folderId,
|
|
84
|
+
name: "same",
|
|
85
|
+
parentFolder: null,
|
|
86
|
+
});
|
|
87
|
+
action.id = actionId;
|
|
88
|
+
action.timestampUtcMs = FIXED_TIMESTAMP;
|
|
89
|
+
return action;
|
|
90
|
+
}
|
|
91
|
+
function gcGlobalEntries(entries) {
|
|
92
|
+
const sorted = entries.slice().sort((a, b) => a.index - b.index);
|
|
93
|
+
return sorted.filter((entry) => {
|
|
94
|
+
for (const later of sorted) {
|
|
95
|
+
if (later.index <= entry.index || later.skip <= 0) {
|
|
96
|
+
continue;
|
|
97
|
+
}
|
|
98
|
+
const logicalIndex = later.index - later.skip;
|
|
99
|
+
if (logicalIndex <= entry.index) {
|
|
100
|
+
return false;
|
|
101
|
+
}
|
|
102
|
+
}
|
|
103
|
+
return true;
|
|
104
|
+
});
|
|
105
|
+
}
|
|
106
|
+
function normalizeForComparison(entries) {
|
|
107
|
+
return entries.map((entry) => ({
|
|
108
|
+
actionId: entry.action.id,
|
|
109
|
+
actionType: entry.action.type,
|
|
110
|
+
operationId: entry.id,
|
|
111
|
+
timestampUtcMs: entry.timestampUtcMs,
|
|
112
|
+
}));
|
|
113
|
+
}
|
|
114
|
+
describe("Connect-Switchboard reshuffle rebroadcast convergence", () => {
|
|
115
|
+
let connectA;
|
|
116
|
+
let connectB;
|
|
117
|
+
let switchboard;
|
|
118
|
+
afterEach(() => {
|
|
119
|
+
connectA?.reactor.kill();
|
|
120
|
+
connectB?.reactor.kill();
|
|
121
|
+
switchboard?.reactor.kill();
|
|
122
|
+
vi.useRealTimers();
|
|
123
|
+
});
|
|
124
|
+
it("should converge after reshuffle rebroadcast between two connect reactors", async () => {
|
|
125
|
+
vi.useFakeTimers();
|
|
126
|
+
vi.setSystemTime(new Date(FIXED_TIMESTAMP));
|
|
127
|
+
const setupResult = await setup();
|
|
128
|
+
connectA = setupResult.connectA;
|
|
129
|
+
connectB = setupResult.connectB;
|
|
130
|
+
switchboard = setupResult.switchboard;
|
|
131
|
+
const collectionId = driveCollectionId("main", DOCUMENT_ID);
|
|
132
|
+
await connectA.syncModule.syncManager.add(`switchboard-a-${DOCUMENT_ID}`, collectionId, {
|
|
133
|
+
type: "gql",
|
|
134
|
+
parameters: {
|
|
135
|
+
url: "http://switchboard/graphql",
|
|
136
|
+
pollIntervalMs: 25,
|
|
137
|
+
retryBaseDelayMs: 10,
|
|
138
|
+
retryMaxDelayMs: 200,
|
|
139
|
+
fetchFn: setupResult.bridge,
|
|
140
|
+
},
|
|
141
|
+
}, { documentId: [], scope: [], branch: "main" });
|
|
142
|
+
await connectB.syncModule.syncManager.add(`switchboard-b-${DOCUMENT_ID}`, collectionId, {
|
|
143
|
+
type: "gql",
|
|
144
|
+
parameters: {
|
|
145
|
+
url: "http://switchboard/graphql",
|
|
146
|
+
pollIntervalMs: 25,
|
|
147
|
+
retryBaseDelayMs: 10,
|
|
148
|
+
retryMaxDelayMs: 200,
|
|
149
|
+
fetchFn: setupResult.bridge,
|
|
150
|
+
},
|
|
151
|
+
}, { documentId: [], scope: [], branch: "main" });
|
|
152
|
+
const document = driveDocumentModelModule.utils.createDocument({
|
|
153
|
+
global: { name: "Repro", icon: null, nodes: [] },
|
|
154
|
+
});
|
|
155
|
+
document.header.id = DOCUMENT_ID;
|
|
156
|
+
const createJob = await connectA.reactor.create(document);
|
|
157
|
+
await waitForJobCompletion(connectA.reactor, createJob.id);
|
|
158
|
+
await Promise.all([
|
|
159
|
+
waitForDocumentAvailable(switchboard.reactor, DOCUMENT_ID),
|
|
160
|
+
waitForDocumentAvailable(connectB.reactor, DOCUMENT_ID),
|
|
161
|
+
]);
|
|
162
|
+
const actionA = createDeterministicAddFolderAction("action-A", "folder-A");
|
|
163
|
+
const actionB = createDeterministicAddFolderAction("action-B", "folder-B");
|
|
164
|
+
const [jobA, jobB] = await Promise.all([
|
|
165
|
+
connectA.reactor.execute(DOCUMENT_ID, "main", [actionA]),
|
|
166
|
+
connectB.reactor.execute(DOCUMENT_ID, "main", [actionB]),
|
|
167
|
+
]);
|
|
168
|
+
await waitForJobCompletion(connectA.reactor, jobA.id);
|
|
169
|
+
await waitForJobCompletion(connectB.reactor, jobB.id);
|
|
170
|
+
await advanceAndFlush(3000);
|
|
171
|
+
const [docA, docB, docS] = await Promise.all([
|
|
172
|
+
connectA.reactor.get(DOCUMENT_ID, { branch: "main" }),
|
|
173
|
+
connectB.reactor.get(DOCUMENT_ID, { branch: "main" }),
|
|
174
|
+
switchboard.reactor.get(DOCUMENT_ID, { branch: "main" }),
|
|
175
|
+
]);
|
|
176
|
+
const [indexA, indexB, indexS] = await Promise.all([
|
|
177
|
+
connectA.operationIndex.get(DOCUMENT_ID),
|
|
178
|
+
connectB.operationIndex.get(DOCUMENT_ID),
|
|
179
|
+
switchboard.operationIndex.get(DOCUMENT_ID),
|
|
180
|
+
]);
|
|
181
|
+
const globalEntries = [
|
|
182
|
+
...indexA.results,
|
|
183
|
+
...indexB.results,
|
|
184
|
+
...indexS.results,
|
|
185
|
+
].filter((entry) => entry.scope === "global");
|
|
186
|
+
expect(globalEntries.length).toBeGreaterThan(0);
|
|
187
|
+
expect(globalEntries.some((entry) => entry.skip > 0)).toBe(true);
|
|
188
|
+
const globalA = indexA.results.filter((entry) => entry.scope === "global");
|
|
189
|
+
const globalB = indexB.results.filter((entry) => entry.scope === "global");
|
|
190
|
+
const globalS = indexS.results.filter((entry) => entry.scope === "global");
|
|
191
|
+
const gcA = normalizeForComparison(gcGlobalEntries(globalA));
|
|
192
|
+
const gcB = normalizeForComparison(gcGlobalEntries(globalB));
|
|
193
|
+
const gcS = normalizeForComparison(gcGlobalEntries(globalS));
|
|
194
|
+
expect(gcA).toEqual(gcB);
|
|
195
|
+
expect(gcB).toEqual(gcS);
|
|
196
|
+
const stateA = docA.state;
|
|
197
|
+
const stateB = docB.state;
|
|
198
|
+
const stateS = docS.state;
|
|
199
|
+
expect(stateA).toEqual(stateB);
|
|
200
|
+
expect(stateB).toEqual(stateS);
|
|
201
|
+
}, 20000);
|
|
202
|
+
});
|
|
203
|
+
//# sourceMappingURL=connect-switchboard-reshuffle-convergence.test.js.map
|