@dainprotocol/service-sdk 2.0.1 → 2.0.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.
- package/README.md +1082 -0
- package/dist/__tests__/oauth-context-simple.test.d.ts +1 -0
- package/dist/__tests__/oauth-context-simple.test.js +90 -0
- package/dist/__tests__/oauth-context-simple.test.js.map +1 -0
- package/dist/__tests__/oauth-context.test.d.ts +1 -0
- package/dist/__tests__/oauth-context.test.js +282 -0
- package/dist/__tests__/oauth-context.test.js.map +1 -0
- package/dist/__tests__/oauth2-client-context.test.d.ts +1 -0
- package/dist/__tests__/oauth2-client-context.test.js +165 -0
- package/dist/__tests__/oauth2-client-context.test.js.map +1 -0
- package/dist/__tests__/oauth2-client-simple.test.d.ts +1 -0
- package/dist/__tests__/oauth2-client-simple.test.js +144 -0
- package/dist/__tests__/oauth2-client-simple.test.js.map +1 -0
- package/dist/service/oauth2Manager.js +1 -0
- package/dist/service/oauth2Manager.js.map +1 -1
- package/dist/service/types.d.ts +11 -0
- package/package.json +3 -3
- package/dist/client/service-auth.d.ts +0 -61
- package/dist/client/service-auth.js +0 -93
- package/dist/client/service-auth.js.map +0 -1
- package/dist/client/user-auth.d.ts +0 -74
- package/dist/client/user-auth.js +0 -137
- package/dist/client/user-auth.js.map +0 -1
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1,90 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
const core_1 = require("../service/core");
|
|
4
|
+
describe("OAuth2Client in ServiceContext type definitions", () => {
|
|
5
|
+
it("should allow OAuth2Client in extraData parameter", () => {
|
|
6
|
+
const mockOAuth2Client = {
|
|
7
|
+
getAccessToken: jest.fn().mockResolvedValue("test-token"),
|
|
8
|
+
getValidToken: jest.fn().mockResolvedValue({ access_token: "test-token" }),
|
|
9
|
+
getTokensByUserId: jest.fn().mockResolvedValue([]),
|
|
10
|
+
getTokensByEmail: jest.fn().mockResolvedValue([]),
|
|
11
|
+
deleteToken: jest.fn().mockResolvedValue(true)
|
|
12
|
+
};
|
|
13
|
+
const testContext = (0, core_1.createContext)({
|
|
14
|
+
id: "test-context",
|
|
15
|
+
name: "Test Context",
|
|
16
|
+
description: "Context for testing OAuth2Client",
|
|
17
|
+
getContextData: async (agentInfo, extraData) => {
|
|
18
|
+
// This should compile without TypeScript errors
|
|
19
|
+
const oauth2Client = extraData?.oauth2Client;
|
|
20
|
+
// Test that we can access OAuth2Client methods
|
|
21
|
+
if (oauth2Client) {
|
|
22
|
+
expect(typeof oauth2Client.getAccessToken).toBe("function");
|
|
23
|
+
expect(typeof oauth2Client.getValidToken).toBe("function");
|
|
24
|
+
expect(typeof oauth2Client.getTokensByEmail).toBe("function");
|
|
25
|
+
}
|
|
26
|
+
return {
|
|
27
|
+
hasOAuth2Client: !!oauth2Client,
|
|
28
|
+
canCallMethods: !!(oauth2Client?.getAccessToken &&
|
|
29
|
+
oauth2Client?.getValidToken)
|
|
30
|
+
};
|
|
31
|
+
}
|
|
32
|
+
});
|
|
33
|
+
// Call the context with mock OAuth2Client
|
|
34
|
+
return testContext.getContextData({ agentId: "test", address: "test", id: "test" }, {
|
|
35
|
+
oauth2Client: mockOAuth2Client,
|
|
36
|
+
plugins: {}
|
|
37
|
+
}).then(result => {
|
|
38
|
+
expect(result.hasOAuth2Client).toBe(true);
|
|
39
|
+
expect(result.canCallMethods).toBe(true);
|
|
40
|
+
});
|
|
41
|
+
});
|
|
42
|
+
it("should work without OAuth2Client in extraData", () => {
|
|
43
|
+
const testContext = (0, core_1.createContext)({
|
|
44
|
+
id: "test-context-no-oauth",
|
|
45
|
+
name: "Test Context Without OAuth",
|
|
46
|
+
description: "Context without OAuth2Client",
|
|
47
|
+
getContextData: async (agentInfo, extraData) => {
|
|
48
|
+
return {
|
|
49
|
+
hasOAuth2Client: !!extraData?.oauth2Client,
|
|
50
|
+
extraDataKeys: Object.keys(extraData || {})
|
|
51
|
+
};
|
|
52
|
+
}
|
|
53
|
+
});
|
|
54
|
+
// Call the context without OAuth2Client
|
|
55
|
+
return testContext.getContextData({ agentId: "test", address: "test", id: "test" }, { plugins: {} }).then(result => {
|
|
56
|
+
expect(result.hasOAuth2Client).toBe(false);
|
|
57
|
+
expect(result.extraDataKeys).toEqual(["plugins"]);
|
|
58
|
+
});
|
|
59
|
+
});
|
|
60
|
+
it("should type-check OAuth2Client methods correctly", () => {
|
|
61
|
+
// This test verifies that TypeScript recognizes oauth2Client in extraData
|
|
62
|
+
const contextHandler = async (agentInfo, extraData) => {
|
|
63
|
+
// These should all compile without TypeScript errors
|
|
64
|
+
const hasClient = !!extraData?.oauth2Client;
|
|
65
|
+
const canGetToken = !!extraData?.oauth2Client?.getAccessToken;
|
|
66
|
+
const canGetValidToken = !!extraData?.oauth2Client?.getValidToken;
|
|
67
|
+
const canGetByEmail = !!extraData?.oauth2Client?.getTokensByEmail;
|
|
68
|
+
const canGetByUserId = !!extraData?.oauth2Client?.getTokensByUserId;
|
|
69
|
+
const canDelete = !!extraData?.oauth2Client?.deleteToken;
|
|
70
|
+
return {
|
|
71
|
+
hasClient,
|
|
72
|
+
canGetToken,
|
|
73
|
+
canGetValidToken,
|
|
74
|
+
canGetByEmail,
|
|
75
|
+
canGetByUserId,
|
|
76
|
+
canDelete
|
|
77
|
+
};
|
|
78
|
+
};
|
|
79
|
+
// Create a context with the handler
|
|
80
|
+
const typedContext = (0, core_1.createContext)({
|
|
81
|
+
id: "typed-context",
|
|
82
|
+
name: "Typed Context",
|
|
83
|
+
description: "Context with typed OAuth2Client",
|
|
84
|
+
getContextData: contextHandler
|
|
85
|
+
});
|
|
86
|
+
expect(typedContext).toBeDefined();
|
|
87
|
+
expect(typedContext.id).toBe("typed-context");
|
|
88
|
+
});
|
|
89
|
+
});
|
|
90
|
+
//# sourceMappingURL=oauth-context-simple.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"oauth-context-simple.test.js","sourceRoot":"","sources":["../../src/__tests__/oauth-context-simple.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1,282 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
const tslib_1 = require("tslib");
|
|
4
|
+
const zod_1 = require("zod");
|
|
5
|
+
const supertest_1 = tslib_1.__importDefault(require("supertest"));
|
|
6
|
+
const nodeService_1 = require("../service/nodeService");
|
|
7
|
+
const core_1 = require("../service/core");
|
|
8
|
+
const ed25519_1 = require("@noble/curves/ed25519");
|
|
9
|
+
const bs58_1 = tslib_1.__importDefault(require("bs58"));
|
|
10
|
+
describe("OAuth2Client in ServiceContext", () => {
|
|
11
|
+
let server;
|
|
12
|
+
const port = 4567;
|
|
13
|
+
// Generate keys for authentication
|
|
14
|
+
const privateKey = ed25519_1.ed25519.utils.randomPrivateKey();
|
|
15
|
+
const publicKey = ed25519_1.ed25519.getPublicKey(privateKey);
|
|
16
|
+
// Create a context that uses OAuth2Client
|
|
17
|
+
const userContext = (0, core_1.createContext)({
|
|
18
|
+
id: "oauth-test-context",
|
|
19
|
+
name: "OAuth Test Context",
|
|
20
|
+
description: "Context that uses OAuth2Client",
|
|
21
|
+
getContextData: async (agentInfo, extraData) => {
|
|
22
|
+
const oauth2Client = extraData?.oauth2Client;
|
|
23
|
+
return {
|
|
24
|
+
hasOAuth2Client: !!oauth2Client,
|
|
25
|
+
canAccessTokenMethods: !!(oauth2Client?.getAccessToken && oauth2Client?.getValidToken),
|
|
26
|
+
methods: oauth2Client ? Object.keys(oauth2Client).filter(key => typeof oauth2Client[key] === 'function') : []
|
|
27
|
+
};
|
|
28
|
+
}
|
|
29
|
+
});
|
|
30
|
+
// Create a tool that verifies OAuth2Client is in context
|
|
31
|
+
const oauthContextTool = (0, core_1.createTool)({
|
|
32
|
+
id: "verify-oauth-context",
|
|
33
|
+
name: "Verify OAuth Context",
|
|
34
|
+
description: "Verifies OAuth2Client is available in tool context",
|
|
35
|
+
input: zod_1.z.object({
|
|
36
|
+
test: zod_1.z.string().optional()
|
|
37
|
+
}),
|
|
38
|
+
output: zod_1.z.object({
|
|
39
|
+
hasOAuth2Client: zod_1.z.boolean(),
|
|
40
|
+
canCallMethods: zod_1.z.boolean()
|
|
41
|
+
}),
|
|
42
|
+
handler: async (input, agentInfo, context) => {
|
|
43
|
+
const hasOAuth2Client = !!context?.oauth2Client;
|
|
44
|
+
const canCallMethods = !!(context?.oauth2Client?.getAccessToken &&
|
|
45
|
+
context?.oauth2Client?.getValidToken &&
|
|
46
|
+
context?.oauth2Client?.getTokensByEmail);
|
|
47
|
+
return {
|
|
48
|
+
text: hasOAuth2Client
|
|
49
|
+
? "OAuth2Client is available in tool context"
|
|
50
|
+
: "OAuth2Client is not available",
|
|
51
|
+
data: {
|
|
52
|
+
hasOAuth2Client,
|
|
53
|
+
canCallMethods
|
|
54
|
+
},
|
|
55
|
+
ui: undefined
|
|
56
|
+
};
|
|
57
|
+
}
|
|
58
|
+
});
|
|
59
|
+
const dainService = (0, nodeService_1.defineDAINService)({
|
|
60
|
+
metadata: {
|
|
61
|
+
title: "Test OAuth Context",
|
|
62
|
+
description: "Testing OAuth2Client in ServiceContext",
|
|
63
|
+
version: "1.0.0",
|
|
64
|
+
author: "Test",
|
|
65
|
+
tags: ["test", "oauth"]
|
|
66
|
+
},
|
|
67
|
+
identity: {
|
|
68
|
+
publicKey: bs58_1.default.encode(publicKey),
|
|
69
|
+
privateKey: bs58_1.default.encode(privateKey),
|
|
70
|
+
agentId: "oauth-test-agent",
|
|
71
|
+
orgId: "oauth-test-org"
|
|
72
|
+
},
|
|
73
|
+
tools: [oauthContextTool],
|
|
74
|
+
contexts: [userContext],
|
|
75
|
+
oauth2: {
|
|
76
|
+
baseUrl: `http://localhost:${port}`,
|
|
77
|
+
providers: {
|
|
78
|
+
google: {
|
|
79
|
+
clientId: "test-google-client",
|
|
80
|
+
clientSecret: "test-google-secret",
|
|
81
|
+
authorizationUrl: "https://accounts.google.com/o/oauth2/v2/auth",
|
|
82
|
+
tokenUrl: "https://oauth2.googleapis.com/token",
|
|
83
|
+
scopes: ["email", "profile"]
|
|
84
|
+
}
|
|
85
|
+
},
|
|
86
|
+
tokenStore: new (require('@dainprotocol/oauth2-token-manager').InMemoryStorageAdapter)()
|
|
87
|
+
}
|
|
88
|
+
});
|
|
89
|
+
beforeAll(async () => {
|
|
90
|
+
server = await dainService.startNode({ port });
|
|
91
|
+
});
|
|
92
|
+
afterAll(async () => {
|
|
93
|
+
if (server) {
|
|
94
|
+
server.close();
|
|
95
|
+
}
|
|
96
|
+
});
|
|
97
|
+
describe("Context endpoints", () => {
|
|
98
|
+
it("should include OAuth2Client when getting single context", async () => {
|
|
99
|
+
const response = await (0, supertest_1.default)(`http://localhost:${port}`)
|
|
100
|
+
.get("/contexts/oauth-test-context")
|
|
101
|
+
.set("x-agent-id", "test-agent")
|
|
102
|
+
.set("x-org-id", "test-org")
|
|
103
|
+
.set("x-agent-signature", "test-signature")
|
|
104
|
+
.set("x-agent-public-key", bs58_1.default.encode(publicKey))
|
|
105
|
+
.expect(200);
|
|
106
|
+
expect(response.body).toMatchObject({
|
|
107
|
+
id: "oauth-test-context",
|
|
108
|
+
name: "OAuth Test Context",
|
|
109
|
+
description: "Context that uses OAuth2Client",
|
|
110
|
+
data: {
|
|
111
|
+
hasOAuth2Client: true,
|
|
112
|
+
canAccessTokenMethods: true,
|
|
113
|
+
methods: expect.arrayContaining([
|
|
114
|
+
"getAccessToken",
|
|
115
|
+
"getValidToken",
|
|
116
|
+
"getTokensByUserId",
|
|
117
|
+
"getTokensByEmail",
|
|
118
|
+
"deleteToken"
|
|
119
|
+
])
|
|
120
|
+
}
|
|
121
|
+
});
|
|
122
|
+
});
|
|
123
|
+
it("should include OAuth2Client when getting all contexts", async () => {
|
|
124
|
+
const response = await (0, supertest_1.default)(`http://localhost:${port}`)
|
|
125
|
+
.post("/contexts")
|
|
126
|
+
.set("x-agent-id", "test-agent")
|
|
127
|
+
.set("x-org-id", "test-org")
|
|
128
|
+
.set("x-agent-signature", "test-signature")
|
|
129
|
+
.set("x-agent-public-key", bs58_1.default.encode(publicKey))
|
|
130
|
+
.send({})
|
|
131
|
+
.expect(200);
|
|
132
|
+
expect(Array.isArray(response.body)).toBe(true);
|
|
133
|
+
expect(response.body.length).toBeGreaterThan(0);
|
|
134
|
+
const oauthContext = response.body.find((ctx) => ctx.id === "oauth-test-context");
|
|
135
|
+
expect(oauthContext).toBeDefined();
|
|
136
|
+
expect(oauthContext.data).toMatchObject({
|
|
137
|
+
hasOAuth2Client: true,
|
|
138
|
+
canAccessTokenMethods: true,
|
|
139
|
+
methods: expect.arrayContaining(["getAccessToken", "getValidToken"])
|
|
140
|
+
});
|
|
141
|
+
});
|
|
142
|
+
it("should provide OAuth2Client to tools via context", async () => {
|
|
143
|
+
const response = await (0, supertest_1.default)(`http://localhost:${port}`)
|
|
144
|
+
.post("/tools/verify-oauth-context")
|
|
145
|
+
.set("x-agent-id", "test-agent")
|
|
146
|
+
.set("x-org-id", "test-org")
|
|
147
|
+
.set("x-agent-signature", "test-signature")
|
|
148
|
+
.set("x-agent-public-key", bs58_1.default.encode(publicKey))
|
|
149
|
+
.send({ test: "value" })
|
|
150
|
+
.expect(200);
|
|
151
|
+
expect(response.body).toMatchObject({
|
|
152
|
+
text: "OAuth2Client is available in tool context",
|
|
153
|
+
data: {
|
|
154
|
+
hasOAuth2Client: true,
|
|
155
|
+
canCallMethods: true
|
|
156
|
+
}
|
|
157
|
+
});
|
|
158
|
+
});
|
|
159
|
+
});
|
|
160
|
+
describe("OAuth2Client in streaming context", () => {
|
|
161
|
+
it("should include OAuth2Client in SSE streaming context", (done) => {
|
|
162
|
+
const req = (0, supertest_1.default)(`http://localhost:${port}`)
|
|
163
|
+
.post("/stream")
|
|
164
|
+
.set("x-agent-id", "test-agent")
|
|
165
|
+
.set("x-org-id", "test-org")
|
|
166
|
+
.set("x-agent-signature", "test-signature")
|
|
167
|
+
.set("x-agent-public-key", bs58_1.default.encode(publicKey))
|
|
168
|
+
.set("Accept", "text/event-stream")
|
|
169
|
+
.send({
|
|
170
|
+
messages: [
|
|
171
|
+
{
|
|
172
|
+
role: "user",
|
|
173
|
+
content: "Test OAuth context"
|
|
174
|
+
}
|
|
175
|
+
],
|
|
176
|
+
withContext: true
|
|
177
|
+
});
|
|
178
|
+
let contextFound = false;
|
|
179
|
+
let buffer = "";
|
|
180
|
+
req.on("data", (chunk) => {
|
|
181
|
+
buffer += chunk.toString();
|
|
182
|
+
const lines = buffer.split("\n");
|
|
183
|
+
for (let i = 0; i < lines.length - 1; i++) {
|
|
184
|
+
const line = lines[i].trim();
|
|
185
|
+
if (line.startsWith("data: ")) {
|
|
186
|
+
try {
|
|
187
|
+
const data = JSON.parse(line.slice(6));
|
|
188
|
+
if (data.type === "context" && data.contexts) {
|
|
189
|
+
const oauthContext = data.contexts.find((ctx) => ctx.id === "oauth-test-context");
|
|
190
|
+
if (oauthContext) {
|
|
191
|
+
expect(oauthContext.data).toMatchObject({
|
|
192
|
+
hasOAuth2Client: true,
|
|
193
|
+
canAccessTokenMethods: true
|
|
194
|
+
});
|
|
195
|
+
contextFound = true;
|
|
196
|
+
}
|
|
197
|
+
}
|
|
198
|
+
if (data.type === "done" && contextFound) {
|
|
199
|
+
done();
|
|
200
|
+
return;
|
|
201
|
+
}
|
|
202
|
+
}
|
|
203
|
+
catch (e) {
|
|
204
|
+
// Ignore parsing errors for incomplete JSON
|
|
205
|
+
}
|
|
206
|
+
}
|
|
207
|
+
}
|
|
208
|
+
buffer = lines[lines.length - 1];
|
|
209
|
+
});
|
|
210
|
+
req.on("error", done);
|
|
211
|
+
req.on("end", () => {
|
|
212
|
+
if (!contextFound) {
|
|
213
|
+
done(new Error("OAuth context not found in stream"));
|
|
214
|
+
}
|
|
215
|
+
});
|
|
216
|
+
});
|
|
217
|
+
});
|
|
218
|
+
describe("OAuth2Client availability without OAuth config", () => {
|
|
219
|
+
let noOAuthServer;
|
|
220
|
+
const noOAuthPort = 4568;
|
|
221
|
+
// Generate new keys for second service
|
|
222
|
+
const privateKey2 = ed25519_1.ed25519.utils.randomPrivateKey();
|
|
223
|
+
const publicKey2 = ed25519_1.ed25519.getPublicKey(privateKey2);
|
|
224
|
+
const noOAuthService = (0, nodeService_1.defineDAINService)({
|
|
225
|
+
metadata: {
|
|
226
|
+
title: "Test No OAuth",
|
|
227
|
+
description: "Testing context without OAuth2",
|
|
228
|
+
version: "1.0.0",
|
|
229
|
+
author: "Test",
|
|
230
|
+
tags: ["test"]
|
|
231
|
+
},
|
|
232
|
+
identity: {
|
|
233
|
+
publicKey: bs58_1.default.encode(publicKey2),
|
|
234
|
+
privateKey: bs58_1.default.encode(privateKey2),
|
|
235
|
+
agentId: "no-oauth-agent",
|
|
236
|
+
orgId: "no-oauth-org"
|
|
237
|
+
},
|
|
238
|
+
tools: [(0, core_1.createTool)({
|
|
239
|
+
id: "dummy-tool",
|
|
240
|
+
name: "Dummy Tool",
|
|
241
|
+
description: "A dummy tool for testing",
|
|
242
|
+
input: zod_1.z.object({}),
|
|
243
|
+
output: zod_1.z.object({}),
|
|
244
|
+
handler: async () => ({ text: "dummy", data: {}, ui: undefined })
|
|
245
|
+
})],
|
|
246
|
+
contexts: [{
|
|
247
|
+
id: "no-oauth-context",
|
|
248
|
+
name: "No OAuth Context",
|
|
249
|
+
description: "Context without OAuth2Client",
|
|
250
|
+
getContextData: async (agentInfo, extraData) => {
|
|
251
|
+
return {
|
|
252
|
+
hasOAuth2Client: !!extraData?.oauth2Client,
|
|
253
|
+
extraDataKeys: Object.keys(extraData || {})
|
|
254
|
+
};
|
|
255
|
+
}
|
|
256
|
+
}]
|
|
257
|
+
});
|
|
258
|
+
beforeAll(async () => {
|
|
259
|
+
noOAuthServer = await noOAuthService.startNode({ port: noOAuthPort });
|
|
260
|
+
});
|
|
261
|
+
afterAll(async () => {
|
|
262
|
+
if (noOAuthServer) {
|
|
263
|
+
noOAuthServer.close();
|
|
264
|
+
}
|
|
265
|
+
});
|
|
266
|
+
it("should not have OAuth2Client when OAuth is not configured", async () => {
|
|
267
|
+
const response = await (0, supertest_1.default)(`http://localhost:${noOAuthPort}`)
|
|
268
|
+
.get("/contexts/no-oauth-context")
|
|
269
|
+
.set("x-agent-id", "test-agent")
|
|
270
|
+
.set("x-org-id", "test-org")
|
|
271
|
+
.set("x-agent-signature", "test-signature")
|
|
272
|
+
.set("x-agent-public-key", bs58_1.default.encode(publicKey2))
|
|
273
|
+
.expect(200);
|
|
274
|
+
expect(response.body.data).toMatchObject({
|
|
275
|
+
hasOAuth2Client: false,
|
|
276
|
+
extraDataKeys: expect.arrayContaining(["plugins"])
|
|
277
|
+
});
|
|
278
|
+
expect(response.body.data.extraDataKeys).not.toContain("oauth2Client");
|
|
279
|
+
});
|
|
280
|
+
});
|
|
281
|
+
});
|
|
282
|
+
//# sourceMappingURL=oauth-context.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"oauth-context.test.js","sourceRoot":"","sources":["../../src/__tests__/oauth-context.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1,165 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
const tslib_1 = require("tslib");
|
|
4
|
+
const nodeService_1 = require("../service/nodeService");
|
|
5
|
+
const zod_1 = require("zod");
|
|
6
|
+
const oauth2_token_manager_1 = require("@dainprotocol/oauth2-token-manager");
|
|
7
|
+
const tweetnacl_1 = tslib_1.__importDefault(require("tweetnacl"));
|
|
8
|
+
const bs58_1 = tslib_1.__importDefault(require("bs58"));
|
|
9
|
+
describe("OAuth2Client in Tool Context", () => {
|
|
10
|
+
it("should have oauth2Client available in tool context when OAuth2 is configured", async () => {
|
|
11
|
+
// Generate test keys
|
|
12
|
+
const keyPair = tweetnacl_1.default.sign.keyPair();
|
|
13
|
+
const privateKey = bs58_1.default.encode(new Uint8Array([...keyPair.secretKey.slice(0, 32), ...keyPair.publicKey]));
|
|
14
|
+
let capturedContext = null;
|
|
15
|
+
const service = (0, nodeService_1.defineDAINService)({
|
|
16
|
+
metadata: {
|
|
17
|
+
title: "Test Service",
|
|
18
|
+
description: "Test service with OAuth2",
|
|
19
|
+
version: "1.0.0",
|
|
20
|
+
author: "Test",
|
|
21
|
+
tags: ["test"],
|
|
22
|
+
},
|
|
23
|
+
identity: {
|
|
24
|
+
privateKey: privateKey,
|
|
25
|
+
publicKey: bs58_1.default.encode(keyPair.publicKey),
|
|
26
|
+
agentId: "test-agent",
|
|
27
|
+
orgId: "test-org",
|
|
28
|
+
},
|
|
29
|
+
oauth2: {
|
|
30
|
+
baseUrl: "http://localhost:5555",
|
|
31
|
+
tokenStore: new oauth2_token_manager_1.InMemoryStorageAdapter(),
|
|
32
|
+
providers: {
|
|
33
|
+
google: {
|
|
34
|
+
clientId: "test-client-id",
|
|
35
|
+
clientSecret: "test-client-secret",
|
|
36
|
+
authorizationUrl: "https://accounts.google.com/o/oauth2/v2/auth",
|
|
37
|
+
tokenUrl: "https://oauth2.googleapis.com/token",
|
|
38
|
+
scopes: ["profile", "email"],
|
|
39
|
+
},
|
|
40
|
+
},
|
|
41
|
+
},
|
|
42
|
+
tools: [
|
|
43
|
+
(0, nodeService_1.createTool)({
|
|
44
|
+
id: "test-oauth-context",
|
|
45
|
+
name: "Test OAuth Context",
|
|
46
|
+
description: "Tool to test OAuth2 context",
|
|
47
|
+
input: zod_1.z.object({}),
|
|
48
|
+
output: zod_1.z.object({
|
|
49
|
+
hasOAuth2: zod_1.z.boolean(),
|
|
50
|
+
hasOAuth2Client: zod_1.z.boolean(),
|
|
51
|
+
}),
|
|
52
|
+
handler: async (input, agentInfo, context) => {
|
|
53
|
+
capturedContext = context;
|
|
54
|
+
return {
|
|
55
|
+
text: "Context captured",
|
|
56
|
+
data: {
|
|
57
|
+
hasOAuth2: !!context.oauth2,
|
|
58
|
+
hasOAuth2Client: !!context.oauth2Client,
|
|
59
|
+
},
|
|
60
|
+
ui: null,
|
|
61
|
+
};
|
|
62
|
+
},
|
|
63
|
+
}),
|
|
64
|
+
],
|
|
65
|
+
});
|
|
66
|
+
const manager = await service.startNode({ port: 5555 });
|
|
67
|
+
try {
|
|
68
|
+
// Make a request to the tool
|
|
69
|
+
const response = await fetch("http://localhost:5555/tools/test-oauth-context", {
|
|
70
|
+
method: "POST",
|
|
71
|
+
headers: {
|
|
72
|
+
"Content-Type": "application/json",
|
|
73
|
+
"X-Agent-Id": "test-agent",
|
|
74
|
+
"X-Agent-Address": "test-address",
|
|
75
|
+
},
|
|
76
|
+
body: JSON.stringify({}),
|
|
77
|
+
});
|
|
78
|
+
const result = await response.json();
|
|
79
|
+
// Verify the context has oauth2Client
|
|
80
|
+
expect(capturedContext).toBeTruthy();
|
|
81
|
+
expect(capturedContext.oauth2).toBeTruthy();
|
|
82
|
+
expect(capturedContext.oauth2Client).toBeTruthy();
|
|
83
|
+
// Verify the tool response
|
|
84
|
+
expect(result.data.hasOAuth2).toBe(true);
|
|
85
|
+
expect(result.data.hasOAuth2Client).toBe(true);
|
|
86
|
+
// Verify oauth2Client has the expected methods
|
|
87
|
+
expect(typeof capturedContext.oauth2Client.queryTokens).toBe("function");
|
|
88
|
+
expect(typeof capturedContext.oauth2Client.getValidToken).toBe("function");
|
|
89
|
+
expect(typeof capturedContext.oauth2Client.getAccessToken).toBe("function");
|
|
90
|
+
}
|
|
91
|
+
finally {
|
|
92
|
+
await manager.shutdown();
|
|
93
|
+
}
|
|
94
|
+
});
|
|
95
|
+
it("should have oauth2Client as undefined when OAuth2 is not configured", async () => {
|
|
96
|
+
// Generate test keys
|
|
97
|
+
const keyPair = tweetnacl_1.default.sign.keyPair();
|
|
98
|
+
const privateKey = bs58_1.default.encode(new Uint8Array([...keyPair.secretKey.slice(0, 32), ...keyPair.publicKey]));
|
|
99
|
+
let capturedContext = null;
|
|
100
|
+
const service = (0, nodeService_1.defineDAINService)({
|
|
101
|
+
metadata: {
|
|
102
|
+
title: "Test Service No OAuth",
|
|
103
|
+
description: "Test service without OAuth2",
|
|
104
|
+
version: "1.0.0",
|
|
105
|
+
author: "Test",
|
|
106
|
+
tags: ["test"],
|
|
107
|
+
},
|
|
108
|
+
identity: {
|
|
109
|
+
privateKey: privateKey,
|
|
110
|
+
publicKey: bs58_1.default.encode(keyPair.publicKey),
|
|
111
|
+
agentId: "test-agent",
|
|
112
|
+
orgId: "test-org",
|
|
113
|
+
},
|
|
114
|
+
// No oauth2 configuration
|
|
115
|
+
tools: [
|
|
116
|
+
(0, nodeService_1.createTool)({
|
|
117
|
+
id: "test-no-oauth-context",
|
|
118
|
+
name: "Test No OAuth Context",
|
|
119
|
+
description: "Tool to test context without OAuth2",
|
|
120
|
+
input: zod_1.z.object({}),
|
|
121
|
+
output: zod_1.z.object({
|
|
122
|
+
hasOAuth2: zod_1.z.boolean(),
|
|
123
|
+
hasOAuth2Client: zod_1.z.boolean(),
|
|
124
|
+
}),
|
|
125
|
+
handler: async (input, agentInfo, context) => {
|
|
126
|
+
capturedContext = context;
|
|
127
|
+
return {
|
|
128
|
+
text: "Context captured",
|
|
129
|
+
data: {
|
|
130
|
+
hasOAuth2: !!context.oauth2,
|
|
131
|
+
hasOAuth2Client: !!context.oauth2Client,
|
|
132
|
+
},
|
|
133
|
+
ui: null,
|
|
134
|
+
};
|
|
135
|
+
},
|
|
136
|
+
}),
|
|
137
|
+
],
|
|
138
|
+
});
|
|
139
|
+
const manager = await service.startNode({ port: 5556 });
|
|
140
|
+
try {
|
|
141
|
+
// Make a request to the tool
|
|
142
|
+
const response = await fetch("http://localhost:5556/tools/test-no-oauth-context", {
|
|
143
|
+
method: "POST",
|
|
144
|
+
headers: {
|
|
145
|
+
"Content-Type": "application/json",
|
|
146
|
+
"X-Agent-Id": "test-agent",
|
|
147
|
+
"X-Agent-Address": "test-address",
|
|
148
|
+
},
|
|
149
|
+
body: JSON.stringify({}),
|
|
150
|
+
});
|
|
151
|
+
const result = await response.json();
|
|
152
|
+
// Verify the context doesn't have oauth2Client
|
|
153
|
+
expect(capturedContext).toBeTruthy();
|
|
154
|
+
expect(capturedContext.oauth2).toBeUndefined();
|
|
155
|
+
expect(capturedContext.oauth2Client).toBeUndefined();
|
|
156
|
+
// Verify the tool response
|
|
157
|
+
expect(result.data.hasOAuth2).toBe(false);
|
|
158
|
+
expect(result.data.hasOAuth2Client).toBe(false);
|
|
159
|
+
}
|
|
160
|
+
finally {
|
|
161
|
+
await manager.shutdown();
|
|
162
|
+
}
|
|
163
|
+
});
|
|
164
|
+
});
|
|
165
|
+
//# sourceMappingURL=oauth2-client-context.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"oauth2-client-context.test.js","sourceRoot":"","sources":["../../src/__tests__/oauth2-client-context.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|