@powerhousedao/reactor-api 5.1.0-staging.0 → 5.2.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/index.d.ts +1 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +1 -0
- package/dist/index.js.map +1 -1
- package/dist/src/graphql/auth/index.d.ts +2 -0
- package/dist/src/graphql/auth/index.d.ts.map +1 -0
- package/dist/src/graphql/auth/index.js +2 -0
- package/dist/src/graphql/auth/index.js.map +1 -0
- package/dist/src/graphql/auth/resolvers.d.ts +149 -0
- package/dist/src/graphql/auth/resolvers.d.ts.map +1 -0
- package/dist/src/graphql/auth/resolvers.js +173 -0
- package/dist/src/graphql/auth/resolvers.js.map +1 -0
- package/dist/src/graphql/auth/schema.graphql +173 -0
- package/dist/src/graphql/auth/subgraph.d.ts +177 -0
- package/dist/src/graphql/auth/subgraph.d.ts.map +1 -0
- package/dist/src/graphql/auth/subgraph.js +340 -0
- package/dist/src/graphql/auth/subgraph.js.map +1 -0
- package/dist/src/graphql/base-subgraph.d.ts +3 -1
- package/dist/src/graphql/base-subgraph.d.ts.map +1 -1
- package/dist/src/graphql/base-subgraph.js +2 -0
- package/dist/src/graphql/base-subgraph.js.map +1 -1
- package/dist/src/graphql/document-model-subgraph.d.ts +51 -0
- package/dist/src/graphql/document-model-subgraph.d.ts.map +1 -0
- package/dist/src/graphql/document-model-subgraph.js +104 -0
- package/dist/src/graphql/document-model-subgraph.js.map +1 -0
- package/dist/src/graphql/drive-subgraph.d.ts.map +1 -1
- package/dist/src/graphql/drive-subgraph.js +51 -10
- package/dist/src/graphql/drive-subgraph.js.map +1 -1
- package/dist/src/graphql/graphql-manager.d.ts +11 -3
- package/dist/src/graphql/graphql-manager.d.ts.map +1 -1
- package/dist/src/graphql/graphql-manager.js +72 -16
- 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/resolvers.d.ts +6 -1
- package/dist/src/graphql/reactor/resolvers.d.ts.map +1 -1
- package/dist/src/graphql/reactor/resolvers.js +18 -2
- package/dist/src/graphql/reactor/resolvers.js.map +1 -1
- package/dist/src/graphql/reactor/schema.graphql +4 -4
- package/dist/src/graphql/reactor/subgraph.d.ts +34 -0
- package/dist/src/graphql/reactor/subgraph.d.ts.map +1 -1
- package/dist/src/graphql/reactor/subgraph.js +258 -21
- package/dist/src/graphql/reactor/subgraph.js.map +1 -1
- package/dist/src/graphql/reactor/validation.d.ts +62 -62
- package/dist/src/graphql/system/system-subgraph.d.ts.map +1 -1
- package/dist/src/graphql/types.d.ts +4 -1
- package/dist/src/graphql/types.d.ts.map +1 -1
- package/dist/src/graphql/utils.js +1 -1
- package/dist/src/graphql/utils.js.map +1 -1
- package/dist/src/migrations/001_create_document_permissions.d.ts +4 -0
- package/dist/src/migrations/001_create_document_permissions.d.ts.map +1 -0
- package/dist/src/migrations/001_create_document_permissions.js +91 -0
- package/dist/src/migrations/001_create_document_permissions.js.map +1 -0
- package/dist/src/migrations/index.d.ts +10 -0
- package/dist/src/migrations/index.d.ts.map +1 -0
- package/dist/src/migrations/index.js +59 -0
- package/dist/src/migrations/index.js.map +1 -0
- package/dist/src/packages/util.js +1 -1
- package/dist/src/packages/util.js.map +1 -1
- package/dist/src/server.d.ts +17 -4
- package/dist/src/server.d.ts.map +1 -1
- package/dist/src/server.js +45 -16
- package/dist/src/server.js.map +1 -1
- package/dist/src/services/auth.service.d.ts +1 -0
- package/dist/src/services/auth.service.d.ts.map +1 -1
- package/dist/src/services/auth.service.js +30 -16
- package/dist/src/services/auth.service.js.map +1 -1
- package/dist/src/services/document-permission.service.d.ts +201 -0
- package/dist/src/services/document-permission.service.d.ts.map +1 -0
- package/dist/src/services/document-permission.service.js +636 -0
- package/dist/src/services/document-permission.service.js.map +1 -0
- package/dist/src/utils/create-schema.d.ts +4 -3
- package/dist/src/utils/create-schema.d.ts.map +1 -1
- package/dist/src/utils/create-schema.js +100 -3
- package/dist/src/utils/create-schema.js.map +1 -1
- package/dist/src/utils/db.d.ts +65 -1
- package/dist/src/utils/db.d.ts.map +1 -1
- package/dist/src/utils/db.js.map +1 -1
- package/dist/test/document-permission.service.test.d.ts +2 -0
- package/dist/test/document-permission.service.test.d.ts.map +1 -0
- package/dist/test/document-permission.service.test.js +480 -0
- package/dist/test/document-permission.service.test.js.map +1 -0
- package/dist/test/drive-subgraph-permissions.test.d.ts +2 -0
- package/dist/test/drive-subgraph-permissions.test.d.ts.map +1 -0
- package/dist/test/drive-subgraph-permissions.test.js +195 -0
- package/dist/test/drive-subgraph-permissions.test.js.map +1 -0
- package/dist/test/identity-integration.test.d.ts +2 -0
- package/dist/test/identity-integration.test.d.ts.map +1 -0
- package/dist/test/identity-integration.test.js +349 -0
- package/dist/test/identity-integration.test.js.map +1 -0
- package/dist/test/permissions-integration.test.d.ts +2 -0
- package/dist/test/permissions-integration.test.d.ts.map +1 -0
- package/dist/test/permissions-integration.test.js +421 -0
- package/dist/test/permissions-integration.test.js.map +1 -0
- package/dist/test/reactor-subgraph-permissions.test.d.ts +2 -0
- package/dist/test/reactor-subgraph-permissions.test.d.ts.map +1 -0
- package/dist/test/reactor-subgraph-permissions.test.js +400 -0
- package/dist/test/reactor-subgraph-permissions.test.js.map +1 -0
- package/dist/test/two-reactor-gql-sync.test.js +11 -9
- package/dist/test/two-reactor-gql-sync.test.js.map +1 -1
- package/dist/test/utils/gql-resolver-bridge.js +4 -4
- package/dist/test/utils/gql-resolver-bridge.js.map +1 -1
- package/dist/tsconfig.tsbuildinfo +1 -1
- package/package.json +9 -8
|
@@ -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 @@
|
|
|
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 @@
|
|
|
1
|
+
{"version":3,"file":"permissions-integration.test.d.ts","sourceRoot":"","sources":["../../test/permissions-integration.test.ts"],"names":[],"mappings":""}
|