@powerhousedao/reactor-api 5.1.0 → 5.2.0-staging.2

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 (129) hide show
  1. package/dist/codegen.js +2 -2
  2. package/dist/codegen.js.map +1 -1
  3. package/dist/index.d.ts +1 -0
  4. package/dist/index.d.ts.map +1 -1
  5. package/dist/index.js +1 -0
  6. package/dist/index.js.map +1 -1
  7. package/dist/src/graphql/auth/index.d.ts +2 -0
  8. package/dist/src/graphql/auth/index.d.ts.map +1 -0
  9. package/dist/src/graphql/auth/index.js +2 -0
  10. package/dist/src/graphql/auth/index.js.map +1 -0
  11. package/dist/src/graphql/auth/resolvers.d.ts +149 -0
  12. package/dist/src/graphql/auth/resolvers.d.ts.map +1 -0
  13. package/dist/src/graphql/auth/resolvers.js +173 -0
  14. package/dist/src/graphql/auth/resolvers.js.map +1 -0
  15. package/dist/src/graphql/auth/schema.graphql +173 -0
  16. package/dist/src/graphql/auth/subgraph.d.ts +177 -0
  17. package/dist/src/graphql/auth/subgraph.d.ts.map +1 -0
  18. package/dist/src/graphql/auth/subgraph.js +340 -0
  19. package/dist/src/graphql/auth/subgraph.js.map +1 -0
  20. package/dist/src/graphql/base-subgraph.d.ts +4 -1
  21. package/dist/src/graphql/base-subgraph.d.ts.map +1 -1
  22. package/dist/src/graphql/base-subgraph.js +4 -0
  23. package/dist/src/graphql/base-subgraph.js.map +1 -1
  24. package/dist/src/graphql/document-model-subgraph.d.ts +51 -0
  25. package/dist/src/graphql/document-model-subgraph.d.ts.map +1 -0
  26. package/dist/src/graphql/document-model-subgraph.js +104 -0
  27. package/dist/src/graphql/document-model-subgraph.js.map +1 -0
  28. package/dist/src/graphql/drive-subgraph.d.ts.map +1 -1
  29. package/dist/src/graphql/drive-subgraph.js +51 -10
  30. package/dist/src/graphql/drive-subgraph.js.map +1 -1
  31. package/dist/src/graphql/graphql-manager.d.ts +11 -3
  32. package/dist/src/graphql/graphql-manager.d.ts.map +1 -1
  33. package/dist/src/graphql/graphql-manager.js +72 -15
  34. package/dist/src/graphql/graphql-manager.js.map +1 -1
  35. package/dist/src/graphql/index.d.ts +1 -0
  36. package/dist/src/graphql/index.d.ts.map +1 -1
  37. package/dist/src/graphql/index.js +1 -0
  38. package/dist/src/graphql/index.js.map +1 -1
  39. package/dist/src/graphql/reactor/adapters.js +1 -1
  40. package/dist/src/graphql/reactor/adapters.js.map +1 -1
  41. package/dist/src/graphql/reactor/factory.d.ts +4 -4
  42. package/dist/src/graphql/reactor/factory.d.ts.map +1 -1
  43. package/dist/src/graphql/reactor/gen/graphql.d.ts +295 -64
  44. package/dist/src/graphql/reactor/gen/graphql.d.ts.map +1 -1
  45. package/dist/src/graphql/reactor/gen/graphql.js +121 -8
  46. package/dist/src/graphql/reactor/gen/graphql.js.map +1 -1
  47. package/dist/src/graphql/reactor/operations.graphql +253 -0
  48. package/dist/src/graphql/reactor/pubsub.d.ts +2 -2
  49. package/dist/src/graphql/reactor/pubsub.d.ts.map +1 -1
  50. package/dist/src/graphql/reactor/pubsub.js +2 -1
  51. package/dist/src/graphql/reactor/pubsub.js.map +1 -1
  52. package/dist/src/graphql/reactor/resolvers.d.ts +48 -17
  53. package/dist/src/graphql/reactor/resolvers.d.ts.map +1 -1
  54. package/dist/src/graphql/reactor/resolvers.js +114 -34
  55. package/dist/src/graphql/reactor/resolvers.js.map +1 -1
  56. package/dist/src/graphql/reactor/schema.graphql +429 -0
  57. package/dist/src/graphql/reactor/subgraph.d.ts +34 -0
  58. package/dist/src/graphql/reactor/subgraph.d.ts.map +1 -1
  59. package/dist/src/graphql/reactor/subgraph.js +325 -22
  60. package/dist/src/graphql/reactor/subgraph.js.map +1 -1
  61. package/dist/src/graphql/reactor/validation.d.ts +62 -62
  62. package/dist/src/graphql/system/system-subgraph.d.ts.map +1 -1
  63. package/dist/src/graphql/types.d.ts +5 -1
  64. package/dist/src/graphql/types.d.ts.map +1 -1
  65. package/dist/src/graphql/utils.js +1 -1
  66. package/dist/src/graphql/utils.js.map +1 -1
  67. package/dist/src/migrations/001_create_document_permissions.d.ts +4 -0
  68. package/dist/src/migrations/001_create_document_permissions.d.ts.map +1 -0
  69. package/dist/src/migrations/001_create_document_permissions.js +91 -0
  70. package/dist/src/migrations/001_create_document_permissions.js.map +1 -0
  71. package/dist/src/migrations/index.d.ts +10 -0
  72. package/dist/src/migrations/index.d.ts.map +1 -0
  73. package/dist/src/migrations/index.js +59 -0
  74. package/dist/src/migrations/index.js.map +1 -0
  75. package/dist/src/packages/util.js +1 -1
  76. package/dist/src/packages/util.js.map +1 -1
  77. package/dist/src/server.d.ts +17 -7
  78. package/dist/src/server.d.ts.map +1 -1
  79. package/dist/src/server.js +49 -27
  80. package/dist/src/server.js.map +1 -1
  81. package/dist/src/services/auth.service.d.ts +1 -0
  82. package/dist/src/services/auth.service.d.ts.map +1 -1
  83. package/dist/src/services/auth.service.js +32 -22
  84. package/dist/src/services/auth.service.js.map +1 -1
  85. package/dist/src/services/document-permission.service.d.ts +201 -0
  86. package/dist/src/services/document-permission.service.d.ts.map +1 -0
  87. package/dist/src/services/document-permission.service.js +636 -0
  88. package/dist/src/services/document-permission.service.js.map +1 -0
  89. package/dist/src/utils/create-schema.d.ts +5 -4
  90. package/dist/src/utils/create-schema.d.ts.map +1 -1
  91. package/dist/src/utils/create-schema.js +110 -4
  92. package/dist/src/utils/create-schema.js.map +1 -1
  93. package/dist/src/utils/db.d.ts +65 -1
  94. package/dist/src/utils/db.d.ts.map +1 -1
  95. package/dist/src/utils/db.js.map +1 -1
  96. package/dist/test/document-permission.service.test.d.ts +2 -0
  97. package/dist/test/document-permission.service.test.d.ts.map +1 -0
  98. package/dist/test/document-permission.service.test.js +480 -0
  99. package/dist/test/document-permission.service.test.js.map +1 -0
  100. package/dist/test/drive-subgraph-permissions.test.d.ts +2 -0
  101. package/dist/test/drive-subgraph-permissions.test.d.ts.map +1 -0
  102. package/dist/test/drive-subgraph-permissions.test.js +195 -0
  103. package/dist/test/drive-subgraph-permissions.test.js.map +1 -0
  104. package/dist/test/identity-integration.test.d.ts +2 -0
  105. package/dist/test/identity-integration.test.d.ts.map +1 -0
  106. package/dist/test/identity-integration.test.js +349 -0
  107. package/dist/test/identity-integration.test.js.map +1 -0
  108. package/dist/test/permissions-integration.test.d.ts +2 -0
  109. package/dist/test/permissions-integration.test.d.ts.map +1 -0
  110. package/dist/test/permissions-integration.test.js +421 -0
  111. package/dist/test/permissions-integration.test.js.map +1 -0
  112. package/dist/test/reactor-adapters.test.js +2 -2
  113. package/dist/test/reactor-adapters.test.js.map +1 -1
  114. package/dist/test/reactor-resolvers.test.js +24 -24
  115. package/dist/test/reactor-resolvers.test.js.map +1 -1
  116. package/dist/test/reactor-subgraph-permissions.test.d.ts +2 -0
  117. package/dist/test/reactor-subgraph-permissions.test.d.ts.map +1 -0
  118. package/dist/test/reactor-subgraph-permissions.test.js +400 -0
  119. package/dist/test/reactor-subgraph-permissions.test.js.map +1 -0
  120. package/dist/test/two-reactor-gql-sync.test.d.ts +2 -0
  121. package/dist/test/two-reactor-gql-sync.test.d.ts.map +1 -0
  122. package/dist/test/two-reactor-gql-sync.test.js +298 -0
  123. package/dist/test/two-reactor-gql-sync.test.js.map +1 -0
  124. package/dist/test/utils/gql-resolver-bridge.d.ts +12 -0
  125. package/dist/test/utils/gql-resolver-bridge.d.ts.map +1 -0
  126. package/dist/test/utils/gql-resolver-bridge.js +60 -0
  127. package/dist/test/utils/gql-resolver-bridge.js.map +1 -0
  128. package/dist/tsconfig.tsbuildinfo +1 -1
  129. package/package.json +11 -9
@@ -0,0 +1,195 @@
1
+ import { DriveSubgraph } from "@powerhousedao/reactor-api";
2
+ import { testSetupReactor } from "@powerhousedao/reactor-api/test";
3
+ import { generateId } from "document-model/core";
4
+ import { beforeEach, describe, expect, it, vi } from "vitest";
5
+ describe("DriveSubgraph Permission Checks", () => {
6
+ let mockDocumentPermissionService;
7
+ let driveSubgraph;
8
+ let driveId;
9
+ // Helper to create context with different permission levels
10
+ const createContext = (options) => ({
11
+ driveId: options.driveId ?? driveId,
12
+ user: options.userAddress ? { address: options.userAddress } : undefined,
13
+ isAdmin: () => options.isAdmin ?? false,
14
+ isUser: () => options.isUser ?? false,
15
+ isGuest: () => options.isGuest ?? false,
16
+ });
17
+ beforeEach(async () => {
18
+ vi.clearAllMocks();
19
+ // Create mock DocumentPermissionService
20
+ mockDocumentPermissionService = {
21
+ canReadDocument: vi.fn().mockResolvedValue(false),
22
+ canWriteDocument: vi.fn().mockResolvedValue(false),
23
+ canRead: vi.fn().mockResolvedValue(false),
24
+ canWrite: vi.fn().mockResolvedValue(false),
25
+ };
26
+ const { reactor } = await testSetupReactor();
27
+ // Create a test drive
28
+ driveId = generateId();
29
+ await reactor.addDrive({
30
+ id: driveId,
31
+ slug: "test-drive",
32
+ global: {
33
+ name: "Test Drive",
34
+ icon: undefined,
35
+ },
36
+ });
37
+ driveSubgraph = new DriveSubgraph({
38
+ reactor,
39
+ documentPermissionService: mockDocumentPermissionService,
40
+ });
41
+ });
42
+ describe("registerPullResponderListener", () => {
43
+ const callRegisterPullResponderListener = async (ctx) => {
44
+ const mutation = driveSubgraph.resolvers.Mutation
45
+ ?.registerPullResponderListener;
46
+ return mutation(null, { filter: { branch: ["main"], documentId: [] } }, ctx);
47
+ };
48
+ describe("Global Role Access", () => {
49
+ it("should allow access when user is global admin", async () => {
50
+ const ctx = createContext({ isAdmin: true, userAddress: "0xadmin" });
51
+ const result = await callRegisterPullResponderListener(ctx);
52
+ expect(result).toBeDefined();
53
+ expect(result.listenerId).toBeDefined();
54
+ expect(mockDocumentPermissionService.canReadDocument).not.toHaveBeenCalled();
55
+ });
56
+ it("should allow access when user is global user", async () => {
57
+ const ctx = createContext({ isUser: true, userAddress: "0xuser" });
58
+ const result = await callRegisterPullResponderListener(ctx);
59
+ expect(result).toBeDefined();
60
+ expect(result.listenerId).toBeDefined();
61
+ expect(mockDocumentPermissionService.canReadDocument).not.toHaveBeenCalled();
62
+ });
63
+ it("should allow access when user is global guest", async () => {
64
+ const ctx = createContext({ isGuest: true, userAddress: "0xguest" });
65
+ const result = await callRegisterPullResponderListener(ctx);
66
+ expect(result).toBeDefined();
67
+ expect(result.listenerId).toBeDefined();
68
+ expect(mockDocumentPermissionService.canReadDocument).not.toHaveBeenCalled();
69
+ });
70
+ });
71
+ describe("Document Permission Access", () => {
72
+ it("should allow access when user has document read permission", async () => {
73
+ vi.mocked(mockDocumentPermissionService.canReadDocument).mockResolvedValue(true);
74
+ const ctx = createContext({ userAddress: "0xpermitted" });
75
+ const result = await callRegisterPullResponderListener(ctx);
76
+ expect(result).toBeDefined();
77
+ expect(result.listenerId).toBeDefined();
78
+ expect(mockDocumentPermissionService.canReadDocument).toHaveBeenCalledWith(driveId, "0xpermitted");
79
+ });
80
+ it("should deny access when user has no permissions", async () => {
81
+ vi.mocked(mockDocumentPermissionService.canReadDocument).mockResolvedValue(false);
82
+ const ctx = createContext({ userAddress: "0xunpermitted" });
83
+ await expect(callRegisterPullResponderListener(ctx)).rejects.toThrow("Forbidden");
84
+ });
85
+ it("should deny access when user is not authenticated", async () => {
86
+ const ctx = createContext({});
87
+ await expect(callRegisterPullResponderListener(ctx)).rejects.toThrow("Forbidden");
88
+ });
89
+ });
90
+ });
91
+ describe("pushUpdates", () => {
92
+ const callPushUpdates = async (ctx) => {
93
+ const mutation = driveSubgraph.resolvers.Mutation?.pushUpdates;
94
+ return mutation(null, {
95
+ strands: [
96
+ {
97
+ driveId,
98
+ documentId: "doc1",
99
+ documentType: "test/type",
100
+ scope: "global",
101
+ branch: "main",
102
+ operations: [],
103
+ },
104
+ ],
105
+ }, ctx);
106
+ };
107
+ describe("Global Role Access", () => {
108
+ it("should allow access when user is global admin", async () => {
109
+ const ctx = createContext({ isAdmin: true, userAddress: "0xadmin" });
110
+ const result = await callPushUpdates(ctx);
111
+ expect(result).toBeDefined();
112
+ expect(mockDocumentPermissionService.canWriteDocument).not.toHaveBeenCalled();
113
+ });
114
+ it("should allow access when user is global user", async () => {
115
+ const ctx = createContext({ isUser: true, userAddress: "0xuser" });
116
+ const result = await callPushUpdates(ctx);
117
+ expect(result).toBeDefined();
118
+ expect(mockDocumentPermissionService.canWriteDocument).not.toHaveBeenCalled();
119
+ });
120
+ it("should deny access when user is only global guest (guests cannot write)", async () => {
121
+ vi.mocked(mockDocumentPermissionService.canWriteDocument).mockResolvedValue(false);
122
+ const ctx = createContext({ isGuest: true, userAddress: "0xguest" });
123
+ await expect(callPushUpdates(ctx)).rejects.toThrow("Forbidden");
124
+ });
125
+ });
126
+ describe("Document Permission Access", () => {
127
+ it("should allow access when user has document write permission", async () => {
128
+ vi.mocked(mockDocumentPermissionService.canWriteDocument).mockResolvedValue(true);
129
+ const ctx = createContext({ userAddress: "0xpermitted" });
130
+ const result = await callPushUpdates(ctx);
131
+ expect(result).toBeDefined();
132
+ expect(mockDocumentPermissionService.canWriteDocument).toHaveBeenCalledWith(driveId, "0xpermitted");
133
+ });
134
+ it("should deny access when user has no write permission", async () => {
135
+ vi.mocked(mockDocumentPermissionService.canWriteDocument).mockResolvedValue(false);
136
+ const ctx = createContext({ userAddress: "0xunpermitted" });
137
+ await expect(callPushUpdates(ctx)).rejects.toThrow("Forbidden");
138
+ });
139
+ });
140
+ });
141
+ describe("strands (Sync.strands)", () => {
142
+ // Note: strands resolver requires a registered listener, which needs full infrastructure
143
+ // These tests verify the resolver exists; full permission testing is done via integration tests
144
+ const callStrands = async (ctx) => {
145
+ const syncResolver = driveSubgraph.resolvers.Sync?.strands;
146
+ if (!syncResolver) {
147
+ throw new Error("Sync.strands resolver not found");
148
+ }
149
+ return syncResolver(null, { listenerId: "test-listener", since: undefined }, ctx);
150
+ };
151
+ describe("Global Role Access", () => {
152
+ it("should have strands resolver defined", () => {
153
+ const syncResolver = driveSubgraph.resolvers.Sync?.strands;
154
+ expect(syncResolver).toBeDefined();
155
+ });
156
+ // Note: Full strands permission tests require actual listener infrastructure
157
+ // which is better tested via integration tests. Permission checks happen
158
+ // before the listener lookup, so if listener is not found, permission passed.
159
+ it("should pass permission check for global admin (fails on missing listener)", async () => {
160
+ const ctx = createContext({ isAdmin: true, userAddress: "0xadmin" });
161
+ // Permission passes, but fails on listener lookup (not a permission error)
162
+ await expect(callStrands(ctx)).rejects.toThrow("Listener not found");
163
+ expect(mockDocumentPermissionService.canReadDocument).not.toHaveBeenCalled();
164
+ });
165
+ });
166
+ describe("Document Permission Access", () => {
167
+ it("should return empty array when user has no read permission", async () => {
168
+ vi.mocked(mockDocumentPermissionService.canReadDocument).mockResolvedValue(false);
169
+ const ctx = createContext({ userAddress: "0xunpermitted" });
170
+ const result = await callStrands(ctx);
171
+ expect(result).toEqual([]);
172
+ });
173
+ it("should return empty array for unauthenticated user", async () => {
174
+ const ctx = createContext({});
175
+ const result = await callStrands(ctx);
176
+ expect(result).toEqual([]);
177
+ });
178
+ });
179
+ });
180
+ describe("AUTH_ENABLED=false behavior", () => {
181
+ it("should allow all access when all global roles return true", async () => {
182
+ // When AUTH_ENABLED=false, isAdmin/isUser/isGuest all return true
183
+ const ctx = createContext({
184
+ isAdmin: true,
185
+ isUser: true,
186
+ isGuest: true,
187
+ userAddress: "0xanyone",
188
+ });
189
+ const registerResult = await driveSubgraph.resolvers.Mutation?.registerPullResponderListener(null, { filter: { branch: ["main"], documentId: [] } }, ctx);
190
+ expect(registerResult).toBeDefined();
191
+ expect(mockDocumentPermissionService.canReadDocument).not.toHaveBeenCalled();
192
+ });
193
+ });
194
+ });
195
+ //# sourceMappingURL=drive-subgraph-permissions.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"drive-subgraph-permissions.test.js","sourceRoot":"","sources":["../../test/drive-subgraph-permissions.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=identity-integration.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"identity-integration.test.d.ts","sourceRoot":"","sources":["../../test/identity-integration.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,349 @@
1
+ import { describe, expect, it } from "vitest";
2
+ describe("nothing", () => {
3
+ it("does nothing", () => {
4
+ expect(true).toBe(true);
5
+ });
6
+ });
7
+ // /**
8
+ // * Integration tests for identity-based authentication and signed actions.
9
+ // *
10
+ // * This test demonstrates the full flow:
11
+ // * 1. Starting reactor-api with initializeAndStartAPI
12
+ // * 2. Setting up a test identity (keypair) programmatically
13
+ // * 3. Using ConnectCrypto to get bearer tokens
14
+ // * 4. Pushing authenticated requests to reactor-api
15
+ // */
16
+ // import { PGlite } from "@electric-sql/pglite";
17
+ // import {
18
+ // type Database,
19
+ // EventBus,
20
+ // ReactorBuilder as NewReactorBuilder,
21
+ // ReactorClientBuilder,
22
+ // SyncBuilder,
23
+ // } from "@powerhousedao/reactor";
24
+ // import {
25
+ // ConnectCrypto,
26
+ // type IConnectCrypto,
27
+ // type JsonWebKeyPairStorage,
28
+ // type JwkKeyPair,
29
+ // } from "@renown/sdk";
30
+ // import type { IDocumentDriveServer } from "document-drive";
31
+ // import {
32
+ // InMemoryCache,
33
+ // MemoryStorage,
34
+ // ReactorBuilder,
35
+ // driveDocumentModelModule,
36
+ // } from "document-drive";
37
+ // import type { DocumentModelModule } from "document-model";
38
+ // import { documentModelDocumentModelModule } from "document-model";
39
+ // import { Kysely } from "kysely";
40
+ // import { PGliteDialect } from "kysely-pglite-dialect";
41
+ // import { afterAll, beforeAll, describe, expect, it } from "vitest";
42
+ // import { getUniqueDocumentModels, initializeAndStartAPI } from "../src/index.js";
43
+ // /**
44
+ // * In-memory key storage for testing.
45
+ // */
46
+ // class TestKeyStorage implements JsonWebKeyPairStorage {
47
+ // private keyPair: JwkKeyPair | undefined;
48
+ // async loadKeyPair(): Promise<JwkKeyPair | undefined> {
49
+ // return this.keyPair;
50
+ // }
51
+ // async saveKeyPair(keyPair: JwkKeyPair): Promise<void> {
52
+ // this.keyPair = keyPair;
53
+ // }
54
+ // getStoredKeyPair(): JwkKeyPair | undefined {
55
+ // return this.keyPair;
56
+ // }
57
+ // }
58
+ // // Use a random port to avoid conflicts
59
+ // const TEST_PORT = 14000 + Math.floor(Math.random() * 1000);
60
+ // const BASE_URL = `http://localhost:${TEST_PORT}`;
61
+ // describe("Identity Integration with startAPI", () => {
62
+ // let connectCrypto: IConnectCrypto;
63
+ // let testKeyStorage: TestKeyStorage;
64
+ // beforeAll(async () => {
65
+ // // Set up test identity
66
+ // testKeyStorage = new TestKeyStorage();
67
+ // connectCrypto = new ConnectCrypto(testKeyStorage);
68
+ // await connectCrypto.did();
69
+ // // Set up storage
70
+ // const cache = new InMemoryCache();
71
+ // const storage = new MemoryStorage();
72
+ // // Initialize drive server function
73
+ // const initializeDriveServer = async (
74
+ // documentModels: DocumentModelModule[],
75
+ // ) => {
76
+ // const driveServer = new ReactorBuilder(
77
+ // getUniqueDocumentModels([
78
+ // documentModelDocumentModelModule,
79
+ // driveDocumentModelModule,
80
+ // ...documentModels,
81
+ // ] as unknown as DocumentModelModule[]),
82
+ // )
83
+ // .withStorage(storage)
84
+ // .withCache(cache)
85
+ // .build();
86
+ // await driveServer.initialize();
87
+ // return driveServer;
88
+ // };
89
+ // // Initialize client function
90
+ // const initializeClient = async (
91
+ // _driveServer: IDocumentDriveServer,
92
+ // documentModels: DocumentModelModule[],
93
+ // ) => {
94
+ // const eventBus = new EventBus();
95
+ // const pglite = new PGlite();
96
+ // const kysely = new Kysely<Database>({
97
+ // dialect: new PGliteDialect(pglite),
98
+ // });
99
+ // const builder = new NewReactorBuilder()
100
+ // .withEventBus(eventBus)
101
+ // .withDocumentModels(
102
+ // getUniqueDocumentModels([
103
+ // documentModelDocumentModelModule,
104
+ // driveDocumentModelModule,
105
+ // ...documentModels,
106
+ // ] as unknown as DocumentModelModule[]),
107
+ // )
108
+ // .withLegacyStorage(storage)
109
+ // .withSync(new SyncBuilder())
110
+ // .withFeatures({
111
+ // legacyStorageEnabled: true,
112
+ // })
113
+ // .withKysely(kysely);
114
+ // const module = await new ReactorClientBuilder()
115
+ // .withReactorBuilder(builder)
116
+ // .buildModule();
117
+ // const syncManager = module.reactorModule?.syncModule?.syncManager;
118
+ // if (!syncManager) {
119
+ // throw new Error("SyncManager not available from ReactorClientBuilder");
120
+ // }
121
+ // return { client: module.client, syncManager };
122
+ // };
123
+ // // Start the API server
124
+ // await initializeAndStartAPI(initializeDriveServer, initializeClient, {
125
+ // port: TEST_PORT,
126
+ // dbPath: undefined, // Use in-memory database
127
+ // auth: {
128
+ // enabled: false, // Disable auth for basic tests
129
+ // admins: [],
130
+ // users: [],
131
+ // guests: [],
132
+ // freeEntry: true,
133
+ // },
134
+ // });
135
+ // }, 30000);
136
+ // afterAll(async () => {
137
+ // // The server will be cleaned up when the test process exits
138
+ // });
139
+ // describe("Server Health", () => {
140
+ // it("should have the GraphQL endpoint available", async () => {
141
+ // const response = await fetch(`${BASE_URL}/graphql`, {
142
+ // method: "POST",
143
+ // headers: {
144
+ // "Content-Type": "application/json",
145
+ // },
146
+ // body: JSON.stringify({
147
+ // query: `{ __typename }`,
148
+ // }),
149
+ // });
150
+ // expect(response.ok).toBe(true);
151
+ // const data = await response.json();
152
+ // expect(data.data).toBeDefined();
153
+ // });
154
+ // });
155
+ // describe("Identity Setup", () => {
156
+ // it("should generate a DID for the test identity", async () => {
157
+ // const did = await connectCrypto.did();
158
+ // expect(did).toMatch(/^did:key:/);
159
+ // });
160
+ // it("should be able to get issuer for signing", async () => {
161
+ // const issuer = await connectCrypto.getIssuer();
162
+ // expect(issuer).toBeDefined();
163
+ // expect(typeof issuer.did).toBe("string");
164
+ // expect(typeof issuer.signer).toBe("function");
165
+ // });
166
+ // it("should generate a bearer token", async () => {
167
+ // const token = await connectCrypto.getBearerToken(BASE_URL, undefined);
168
+ // expect(token).toBeDefined();
169
+ // expect(typeof token).toBe("string");
170
+ // });
171
+ // });
172
+ // describe("GraphQL Queries", () => {
173
+ // it("should query document models", async () => {
174
+ // const response = await fetch(`${BASE_URL}/graphql`, {
175
+ // method: "POST",
176
+ // headers: {
177
+ // "Content-Type": "application/json",
178
+ // },
179
+ // body: JSON.stringify({
180
+ // query: `
181
+ // query {
182
+ // documentModels {
183
+ // results {
184
+ // documentModel {
185
+ // name
186
+ // id
187
+ // }
188
+ // }
189
+ // }
190
+ // }
191
+ // `,
192
+ // }),
193
+ // });
194
+ // expect(response.ok).toBe(true);
195
+ // const data = (await response.json()) as {
196
+ // data?: { documentModels?: { results?: unknown[] } };
197
+ // };
198
+ // expect(data.data?.documentModels?.results).toBeDefined();
199
+ // });
200
+ // it("should query system info", async () => {
201
+ // const response = await fetch(`${BASE_URL}/graphql`, {
202
+ // method: "POST",
203
+ // headers: {
204
+ // "Content-Type": "application/json",
205
+ // },
206
+ // body: JSON.stringify({
207
+ // query: `
208
+ // query {
209
+ // system {
210
+ // auth {
211
+ // me {
212
+ // address
213
+ // }
214
+ // }
215
+ // }
216
+ // }
217
+ // `,
218
+ // }),
219
+ // });
220
+ // expect(response.ok).toBe(true);
221
+ // const data = await response.json();
222
+ // expect(data.data).toBeDefined();
223
+ // });
224
+ // });
225
+ // describe("Authenticated Requests", () => {
226
+ // it("should make authenticated GraphQL request with bearer token", async () => {
227
+ // const token = await connectCrypto.getBearerToken(BASE_URL, undefined);
228
+ // const response = await fetch(`${BASE_URL}/graphql`, {
229
+ // method: "POST",
230
+ // headers: {
231
+ // "Content-Type": "application/json",
232
+ // Authorization: `Bearer ${token}`,
233
+ // },
234
+ // body: JSON.stringify({
235
+ // query: `
236
+ // query {
237
+ // documentModels {
238
+ // results {
239
+ // documentModel {
240
+ // name
241
+ // }
242
+ // }
243
+ // }
244
+ // }
245
+ // `,
246
+ // }),
247
+ // });
248
+ // expect(response.ok).toBe(true);
249
+ // const data = await response.json();
250
+ // expect(data.data).toBeDefined();
251
+ // });
252
+ // });
253
+ // describe("Action Signing", () => {
254
+ // it("should sign action data with identity", async () => {
255
+ // const issuer = await connectCrypto.getIssuer();
256
+ // // Simulate signing an action
257
+ // const actionData = JSON.stringify({
258
+ // type: "SET_NAME",
259
+ // scope: "global",
260
+ // input: { name: "Test Document" },
261
+ // });
262
+ // const signature = await issuer.signer(actionData);
263
+ // expect(signature).toBeDefined();
264
+ // expect(typeof signature).toBe("string");
265
+ // expect((signature as string).length).toBeGreaterThan(0);
266
+ // });
267
+ // it("should produce signatures for data", async () => {
268
+ // const issuer = await connectCrypto.getIssuer();
269
+ // const testData = "test data";
270
+ // const signature1 = await issuer.signer(testData);
271
+ // const signature2 = await issuer.signer(testData);
272
+ // // ECDSA signatures include randomness, so they may differ
273
+ // // but both should be valid strings
274
+ // expect(signature1).toBeDefined();
275
+ // expect(signature2).toBeDefined();
276
+ // });
277
+ // });
278
+ // describe("Full Workflow", () => {
279
+ // it("should demonstrate complete identity-based API interaction", async () => {
280
+ // // 1. Get identity DID
281
+ // const did = await connectCrypto.did();
282
+ // expect(did).toMatch(/^did:key:/);
283
+ // // 2. Get bearer token for API authentication
284
+ // const token = await connectCrypto.getBearerToken(BASE_URL, undefined);
285
+ // expect(token).toBeDefined();
286
+ // // 3. Get issuer for signing operations
287
+ // const issuer = await connectCrypto.getIssuer();
288
+ // expect(issuer.did).toBe(did);
289
+ // // 4. Make authenticated API call
290
+ // const response = await fetch(`${BASE_URL}/graphql`, {
291
+ // method: "POST",
292
+ // headers: {
293
+ // "Content-Type": "application/json",
294
+ // Authorization: `Bearer ${token}`,
295
+ // },
296
+ // body: JSON.stringify({
297
+ // query: `{ __typename }`,
298
+ // }),
299
+ // });
300
+ // expect(response.ok).toBe(true);
301
+ // // 5. Sign operation data (for when submitting signed operations)
302
+ // const operationData = JSON.stringify({
303
+ // type: "CREATE_DOCUMENT",
304
+ // scope: "global",
305
+ // input: { documentType: "powerhouse/document-model" },
306
+ // });
307
+ // const signature = await issuer.signer(operationData);
308
+ // expect(signature).toBeDefined();
309
+ // });
310
+ // });
311
+ // });
312
+ // /**
313
+ // * Usage Guide:
314
+ // *
315
+ // * This test demonstrates how to integrate identity-based authentication with reactor-api.
316
+ // *
317
+ // * Prerequisites:
318
+ // * 1. User runs `ph login` to authenticate with Renown
319
+ // * 2. This creates `.auth.json` (user credentials) and `.keypair.json` (signing keys)
320
+ // *
321
+ // * Programmatic Flow:
322
+ // * ```typescript
323
+ // * import { ConnectCrypto, type JsonWebKeyPairStorage } from "@renown/sdk";
324
+ // *
325
+ // * // 1. Create key storage (or use existing from ph login)
326
+ // * class MyKeyStorage implements JsonWebKeyPairStorage {
327
+ // * async loadKeyPair() { return loadFromFile('.keypair.json'); }
328
+ // * async saveKeyPair(kp) { saveToFile('.keypair.json', kp); }
329
+ // * }
330
+ // *
331
+ // * // 2. Initialize ConnectCrypto
332
+ // * const crypto = new ConnectCrypto(new MyKeyStorage());
333
+ // * const did = await crypto.did(); // Generates keypair if none exists
334
+ // *
335
+ // * // 3. Get bearer token for API
336
+ // * const token = await crypto.getBearerToken("http://localhost:4000", undefined);
337
+ // *
338
+ // * // 4. Make authenticated requests
339
+ // * fetch("http://localhost:4000/graphql", {
340
+ // * headers: { "Authorization": `Bearer ${token}` },
341
+ // * // ...
342
+ // * });
343
+ // *
344
+ // * // 5. Sign operations (for operation-level signatures)
345
+ // * const issuer = await crypto.getIssuer();
346
+ // * const signature = await issuer.signer(JSON.stringify(action));
347
+ // * ```
348
+ // */
349
+ //# sourceMappingURL=identity-integration.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"identity-integration.test.js","sourceRoot":"","sources":["../../test/identity-integration.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=permissions-integration.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"permissions-integration.test.d.ts","sourceRoot":"","sources":["../../test/permissions-integration.test.ts"],"names":[],"mappings":""}