@dainprotocol/service-sdk 2.0.53 → 2.0.54
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 +78 -0
- package/dist/__tests__/api-sdk.test.d.ts +1 -0
- package/dist/__tests__/api-sdk.test.js +102 -0
- package/dist/__tests__/api-sdk.test.js.map +1 -0
- package/dist/__tests__/auth.test.d.ts +1 -0
- package/dist/__tests__/auth.test.js +110 -0
- package/dist/__tests__/auth.test.js.map +1 -0
- package/dist/__tests__/citations-plugin.test.d.ts +1 -0
- package/dist/__tests__/citations-plugin.test.js +491 -0
- package/dist/__tests__/citations-plugin.test.js.map +1 -0
- package/dist/__tests__/context-behavior.test.d.ts +1 -0
- package/dist/__tests__/context-behavior.test.js +290 -0
- package/dist/__tests__/context-behavior.test.js.map +1 -0
- package/dist/__tests__/convertToVercelTool.test.d.ts +1 -0
- package/dist/__tests__/convertToVercelTool.test.js +527 -0
- package/dist/__tests__/convertToVercelTool.test.js.map +1 -0
- package/dist/__tests__/core.test.d.ts +1 -0
- package/dist/__tests__/core.test.js +154 -0
- package/dist/__tests__/core.test.js.map +1 -0
- package/dist/__tests__/crypto-plugin.test.d.ts +1 -0
- package/dist/__tests__/crypto-plugin.test.js +694 -0
- package/dist/__tests__/crypto-plugin.test.js.map +1 -0
- package/dist/__tests__/humanActions.test.d.ts +1 -0
- package/dist/__tests__/humanActions.test.js +221 -0
- package/dist/__tests__/humanActions.test.js.map +1 -0
- package/dist/__tests__/integration.test.d.ts +1 -0
- package/dist/__tests__/integration.test.js +1573 -0
- package/dist/__tests__/integration.test.js.map +1 -0
- package/dist/__tests__/mealMeSchemas.test.d.ts +576 -0
- package/dist/__tests__/mealMeSchemas.test.js +627 -0
- package/dist/__tests__/mealMeSchemas.test.js.map +1 -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__/oauth.test.d.ts +1 -0
- package/dist/__tests__/oauth.test.js +378 -0
- package/dist/__tests__/oauth.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-integration.test.d.ts +1 -0
- package/dist/__tests__/oauth2-client-integration.test.js +182 -0
- package/dist/__tests__/oauth2-client-integration.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/__tests__/oauth2-context.test.d.ts +1 -0
- package/dist/__tests__/oauth2-context.test.js +201 -0
- package/dist/__tests__/oauth2-context.test.js.map +1 -0
- package/dist/__tests__/oauth2-datasource.test.d.ts +1 -0
- package/dist/__tests__/oauth2-datasource.test.js +251 -0
- package/dist/__tests__/oauth2-datasource.test.js.map +1 -0
- package/dist/__tests__/plugin.test.d.ts +1 -0
- package/dist/__tests__/plugin.test.js +900 -0
- package/dist/__tests__/plugin.test.js.map +1 -0
- package/dist/__tests__/processes.test.d.ts +1 -0
- package/dist/__tests__/processes.test.js +239 -0
- package/dist/__tests__/processes.test.js.map +1 -0
- package/dist/__tests__/streaming.test.d.ts +1 -0
- package/dist/__tests__/streaming.test.js +592 -0
- package/dist/__tests__/streaming.test.js.map +1 -0
- package/dist/__tests__/testEnums.d.ts +1 -0
- package/dist/__tests__/testEnums.js +73 -0
- package/dist/__tests__/testEnums.js.map +1 -0
- package/dist/__tests__/testOptionals.test.d.ts +1 -0
- package/dist/__tests__/testOptionals.test.js +83 -0
- package/dist/__tests__/testOptionals.test.js.map +1 -0
- package/dist/__tests__/types.test.d.ts +1 -0
- package/dist/__tests__/types.test.js +98 -0
- package/dist/__tests__/types.test.js.map +1 -0
- package/dist/client/client.d.ts +18 -5
- package/dist/client/client.js +25 -4
- package/dist/client/client.js.map +1 -1
- package/dist/client/types.d.ts +38 -0
- package/dist/client/types.js +35 -1
- package/dist/client/types.js.map +1 -1
- package/dist/service/actionable-tools.d.ts +135 -0
- package/dist/service/actionable-tools.js +144 -0
- package/dist/service/actionable-tools.js.map +1 -0
- package/dist/service/direct-auth-setup.d.ts +154 -0
- package/dist/service/direct-auth-setup.js +308 -0
- package/dist/service/direct-auth-setup.js.map +1 -0
- package/dist/service/index.d.ts +3 -1
- package/dist/service/index.js +10 -1
- package/dist/service/index.js.map +1 -1
- package/dist/service/nodeService.js +2 -0
- package/dist/service/nodeService.js.map +1 -1
- package/dist/service/oauth2.d.ts +40 -1
- package/dist/service/oauth2.js +46 -0
- package/dist/service/oauth2.js.map +1 -1
- package/dist/service/oauth2Manager.d.ts +31 -4
- package/dist/service/oauth2Manager.js +119 -8
- package/dist/service/oauth2Manager.js.map +1 -1
- package/dist/service/server.js +93 -19
- package/dist/service/server.js.map +1 -1
- package/dist/service/service.js +6 -1
- package/dist/service/service.js.map +1 -1
- package/dist/service/types.d.ts +59 -0
- package/dist/service/zod-json-converter.d.ts +14 -0
- package/dist/service/zod-json-converter.js +203 -0
- package/dist/service/zod-json-converter.js.map +1 -0
- package/package.json +9 -10
package/README.md
CHANGED
|
@@ -316,6 +316,84 @@ const searchTool = createToolWithInterface({
|
|
|
316
316
|
});
|
|
317
317
|
```
|
|
318
318
|
|
|
319
|
+
### Actionable Tools
|
|
320
|
+
|
|
321
|
+
Tools that send messages where users can trigger system actions (buttons, callbacks, links). These tools automatically enforce a standard schema for interoperability with automation systems.
|
|
322
|
+
|
|
323
|
+
**Use Cases:**
|
|
324
|
+
- Telegram bot with inline buttons
|
|
325
|
+
- Slack interactive messages
|
|
326
|
+
- Discord message components
|
|
327
|
+
- Email with action links
|
|
328
|
+
|
|
329
|
+
**Quick Start with `buildActionableTool`:**
|
|
330
|
+
|
|
331
|
+
```typescript
|
|
332
|
+
import { buildActionableTool, z } from '@dainprotocol/service-sdk';
|
|
333
|
+
|
|
334
|
+
const sendTelegramMessage = buildActionableTool({
|
|
335
|
+
id: 'send-telegram-message',
|
|
336
|
+
name: 'Send Telegram Message',
|
|
337
|
+
description: 'Send a message with interactive buttons',
|
|
338
|
+
|
|
339
|
+
// Add platform-specific fields
|
|
340
|
+
additionalFields: {
|
|
341
|
+
parse_mode: z.enum(['HTML', 'Markdown']).optional(),
|
|
342
|
+
},
|
|
343
|
+
|
|
344
|
+
output: z.object({
|
|
345
|
+
messageId: z.number(),
|
|
346
|
+
}),
|
|
347
|
+
|
|
348
|
+
handler: async (input, agentInfo, context) => {
|
|
349
|
+
// input includes: recipient, message, actions, metadata, parse_mode
|
|
350
|
+
const { recipient, message, actions } = input;
|
|
351
|
+
|
|
352
|
+
// Build inline keyboard from actions
|
|
353
|
+
const keyboard = actions?.map(action => ({
|
|
354
|
+
text: action.label,
|
|
355
|
+
callback_data: action.value,
|
|
356
|
+
}));
|
|
357
|
+
|
|
358
|
+
// Send via your messaging API
|
|
359
|
+
const result = await sendToTelegram(recipient, message, keyboard);
|
|
360
|
+
|
|
361
|
+
return {
|
|
362
|
+
text: `Message sent to ${recipient}`,
|
|
363
|
+
data: { messageId: result.message_id },
|
|
364
|
+
};
|
|
365
|
+
},
|
|
366
|
+
});
|
|
367
|
+
```
|
|
368
|
+
|
|
369
|
+
**Standard Fields (automatically included):**
|
|
370
|
+
- `recipient` (required): Who receives the message (chatId, channel, email)
|
|
371
|
+
- `message` (required): The message text
|
|
372
|
+
- `actions` (optional): Interactive buttons/links array
|
|
373
|
+
- `metadata` (optional): Automation context (auto-injected)
|
|
374
|
+
|
|
375
|
+
**Action Types:**
|
|
376
|
+
- `approve` - Approval button
|
|
377
|
+
- `reject` - Rejection button
|
|
378
|
+
- `callback` - Custom callback
|
|
379
|
+
- `url` - External link
|
|
380
|
+
- `custom` - Custom action
|
|
381
|
+
|
|
382
|
+
**Usage in Automations:**
|
|
383
|
+
|
|
384
|
+
```xml
|
|
385
|
+
<action
|
|
386
|
+
tool="send-telegram-message"
|
|
387
|
+
recipient="{{config.chatId}}"
|
|
388
|
+
message="Bitcoin is ${{prev.price}}. Buy?"
|
|
389
|
+
actions='[
|
|
390
|
+
{"label": "✅ Buy", "type": "approve", "value": "buy"},
|
|
391
|
+
{"label": "❌ Skip", "type": "reject", "value": "skip"}
|
|
392
|
+
]'/>
|
|
393
|
+
```
|
|
394
|
+
|
|
395
|
+
See `example/actionable-tool-example.ts` for complete examples (Telegram, Slack, Email).
|
|
396
|
+
|
|
319
397
|
### Tool Pricing
|
|
320
398
|
|
|
321
399
|
Add pricing to monetize your tools:
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1,102 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
const tslib_1 = require("tslib");
|
|
4
|
+
const api_sdk_1 = require("../client/api-sdk");
|
|
5
|
+
const client_auth_1 = require("../client/client-auth");
|
|
6
|
+
const ed25519_1 = require("@noble/curves/ed25519");
|
|
7
|
+
const bs58_1 = tslib_1.__importDefault(require("bs58"));
|
|
8
|
+
const nodeService_1 = require("../service/nodeService");
|
|
9
|
+
const zod_1 = require("zod");
|
|
10
|
+
describe("DainSDK", () => {
|
|
11
|
+
const privateKey = ed25519_1.ed25519.utils.randomPrivateKey();
|
|
12
|
+
const publicKey = ed25519_1.ed25519.getPublicKey(privateKey);
|
|
13
|
+
const clientPrivateKey = ed25519_1.ed25519.utils.randomPrivateKey();
|
|
14
|
+
const agentAuth = new client_auth_1.DainClientAuth({
|
|
15
|
+
privateKeyBase58: bs58_1.default.encode(clientPrivateKey),
|
|
16
|
+
agentId: "agent-12",
|
|
17
|
+
orgId: "org-12",
|
|
18
|
+
});
|
|
19
|
+
// Create test tools with different schema types
|
|
20
|
+
const simpleTestTool = (0, nodeService_1.createTool)({
|
|
21
|
+
id: "simple-test-tool",
|
|
22
|
+
name: "my-test-tool-name",
|
|
23
|
+
description: "Test tool with simple types",
|
|
24
|
+
input: zod_1.z.object({
|
|
25
|
+
stringParam: zod_1.z.string().describe("A string parameter"),
|
|
26
|
+
numberParam: zod_1.z.number().describe("A number parameter"),
|
|
27
|
+
booleanParam: zod_1.z.boolean().describe("A boolean parameter"),
|
|
28
|
+
optionalParam: zod_1.z.string().optional().describe("An optional parameter"),
|
|
29
|
+
enumParam: zod_1.z.enum(["option1", "option2", "option3"]).describe("An enum parameter"),
|
|
30
|
+
}),
|
|
31
|
+
output: zod_1.z.object({ result: zod_1.z.string() }),
|
|
32
|
+
pricing: { pricePerUse: 0.01, currency: "USD" },
|
|
33
|
+
handler: async ({ stringParam }) => ({
|
|
34
|
+
text: `Processed: ${stringParam}`,
|
|
35
|
+
data: { result: `Processed: ${stringParam}` },
|
|
36
|
+
ui: null,
|
|
37
|
+
}),
|
|
38
|
+
});
|
|
39
|
+
const complexTestTool = (0, nodeService_1.createTool)({
|
|
40
|
+
id: "complex-test-tool",
|
|
41
|
+
name: "complex-tool-name",
|
|
42
|
+
description: "Test tool with complex types",
|
|
43
|
+
input: zod_1.z.object({
|
|
44
|
+
arrayParam: zod_1.z.array(zod_1.z.string()).describe("Array of strings"),
|
|
45
|
+
objectParam: zod_1.z.object({
|
|
46
|
+
nested: zod_1.z.number(),
|
|
47
|
+
deeplyNested: zod_1.z.object({
|
|
48
|
+
value: zod_1.z.boolean(),
|
|
49
|
+
}),
|
|
50
|
+
}).describe("Nested object"),
|
|
51
|
+
unionParam: zod_1.z.union([
|
|
52
|
+
zod_1.z.string(),
|
|
53
|
+
zod_1.z.number(),
|
|
54
|
+
]).describe("String or number"),
|
|
55
|
+
recordParam: zod_1.z.record(zod_1.z.string(), zod_1.z.number()).describe("Record of numbers"),
|
|
56
|
+
defaultParam: zod_1.z.string().default("default value"),
|
|
57
|
+
}),
|
|
58
|
+
output: zod_1.z.object({ result: zod_1.z.string() }),
|
|
59
|
+
pricing: { pricePerUse: 0.01, currency: "USD" },
|
|
60
|
+
handler: async () => ({
|
|
61
|
+
text: "Processed complex input",
|
|
62
|
+
data: { result: "Processed complex input" },
|
|
63
|
+
ui: null,
|
|
64
|
+
}),
|
|
65
|
+
});
|
|
66
|
+
// Create test service with both tools
|
|
67
|
+
const dainService = (0, nodeService_1.defineDAINService)({
|
|
68
|
+
metadata: {
|
|
69
|
+
title: "Test DAIN Service",
|
|
70
|
+
description: "A test DAIN service",
|
|
71
|
+
version: "1.0.0",
|
|
72
|
+
author: "Test Author",
|
|
73
|
+
tags: ["test"],
|
|
74
|
+
},
|
|
75
|
+
identity: {
|
|
76
|
+
publicKey: bs58_1.default.encode(publicKey),
|
|
77
|
+
agentId: "test-agent",
|
|
78
|
+
orgId: "test-org",
|
|
79
|
+
privateKey: bs58_1.default.encode(privateKey),
|
|
80
|
+
},
|
|
81
|
+
tools: [simpleTestTool, complexTestTool],
|
|
82
|
+
});
|
|
83
|
+
let server;
|
|
84
|
+
let sdk;
|
|
85
|
+
beforeAll(async () => {
|
|
86
|
+
server = await dainService.startNode({ port: 3081 });
|
|
87
|
+
sdk = new api_sdk_1.DainSDK("http://localhost:3081", agentAuth);
|
|
88
|
+
await sdk.initialize();
|
|
89
|
+
});
|
|
90
|
+
afterAll(async () => {
|
|
91
|
+
if (server) {
|
|
92
|
+
await server.shutdown();
|
|
93
|
+
}
|
|
94
|
+
});
|
|
95
|
+
describe("Docs tests not implemented yet - THIS NEEDS TO BE CREATED", () => {
|
|
96
|
+
it("Docs output- THIS NEEDS TO BE CREATED", async () => {
|
|
97
|
+
const docs = await sdk.getDocumentation();
|
|
98
|
+
expect(docs.length).toBeGreaterThan(0);
|
|
99
|
+
});
|
|
100
|
+
});
|
|
101
|
+
});
|
|
102
|
+
//# sourceMappingURL=api-sdk.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"api-sdk.test.js","sourceRoot":"","sources":["../../src/__tests__/api-sdk.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1,110 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
// File: src/__tests__/auth.test.ts
|
|
3
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
4
|
+
const tslib_1 = require("tslib");
|
|
5
|
+
const client_auth_1 = require("@/client/client-auth");
|
|
6
|
+
const auth_1 = require("../service/auth");
|
|
7
|
+
const ed25519_1 = require("@noble/curves/ed25519");
|
|
8
|
+
const sha256_1 = require("@noble/hashes/sha256");
|
|
9
|
+
const utils_1 = require("@noble/hashes/utils");
|
|
10
|
+
const bs58_1 = tslib_1.__importDefault(require("bs58"));
|
|
11
|
+
describe("Auth Module", () => {
|
|
12
|
+
// Generate a key pair for testing
|
|
13
|
+
const privateKey = ed25519_1.ed25519.utils.randomPrivateKey();
|
|
14
|
+
const publicKey = ed25519_1.ed25519.getPublicKey(privateKey);
|
|
15
|
+
// Convert public key to base58 (Solana address format)
|
|
16
|
+
const address = bs58_1.default.encode(publicKey);
|
|
17
|
+
const clientPrivateKey = ed25519_1.ed25519.utils.randomPrivateKey();
|
|
18
|
+
const clientAddress = bs58_1.default.encode(ed25519_1.ed25519.getPublicKey(clientPrivateKey));
|
|
19
|
+
const agentAuth = new client_auth_1.DainClientAuth({
|
|
20
|
+
privateKeyBase58: bs58_1.default.encode(clientPrivateKey),
|
|
21
|
+
agentId: "agent-12",
|
|
22
|
+
orgId: "org-12",
|
|
23
|
+
});
|
|
24
|
+
test("verifySignature validates correct signatures", () => {
|
|
25
|
+
const message = "Hello, World!";
|
|
26
|
+
const messageHash = (0, sha256_1.sha256)(message);
|
|
27
|
+
const signature = ed25519_1.ed25519.sign(messageHash, privateKey);
|
|
28
|
+
expect((0, auth_1.verifySignature)((0, utils_1.bytesToHex)(signature), message, address)).toBe(true);
|
|
29
|
+
});
|
|
30
|
+
test("verifySignature rejects incorrect signatures", () => {
|
|
31
|
+
const message = "Hello, World!";
|
|
32
|
+
const incorrectMessage = "Hello, World?";
|
|
33
|
+
const messageHash = (0, sha256_1.sha256)(message);
|
|
34
|
+
const signature = ed25519_1.ed25519.sign(messageHash, privateKey);
|
|
35
|
+
expect((0, auth_1.verifySignature)((0, utils_1.bytesToHex)(signature), incorrectMessage, address)).toBe(false);
|
|
36
|
+
});
|
|
37
|
+
test("isValidSolanaAddress correctly validates Solana addresses", () => {
|
|
38
|
+
expect((0, auth_1.isValidSolanaAddress)(address)).toBe(true);
|
|
39
|
+
expect((0, auth_1.isValidSolanaAddress)("invalid_address")).toBe(false);
|
|
40
|
+
});
|
|
41
|
+
test.only("createRequestSignature generates a valid signature", async () => {
|
|
42
|
+
const method = "GET";
|
|
43
|
+
const path = "/api/test";
|
|
44
|
+
const headers = { "content-type": "application/json" };
|
|
45
|
+
const body = "{}";
|
|
46
|
+
const { signature, timestamp } = await agentAuth.signRequest(method, path, body);
|
|
47
|
+
headers["X-DAIN-TIMESTAMP"] = timestamp;
|
|
48
|
+
const verified = (0, auth_1.verifyRequestSignature)(signature, method, path, (0, auth_1.sanitizeHeaders)(headers), body, clientAddress, undefined);
|
|
49
|
+
expect(verified).toBe(true);
|
|
50
|
+
});
|
|
51
|
+
test("verifyRequestSignature validates correct request signatures", async () => {
|
|
52
|
+
const method = "POST";
|
|
53
|
+
const path = "/api/test";
|
|
54
|
+
const headers = { "content-type": "application/json" };
|
|
55
|
+
const body = JSON.stringify({ key: "value" });
|
|
56
|
+
const { signature, timestamp } = await agentAuth.signRequest(method, path, body);
|
|
57
|
+
const validHeaders = { ...headers, "X-DAIN-TIMESTAMP": timestamp };
|
|
58
|
+
expect((0, auth_1.verifyRequestSignature)(signature, method, path, validHeaders, body, clientAddress, undefined)).toBe(true);
|
|
59
|
+
});
|
|
60
|
+
test("verifyRequestSignature rejects incorrect request signatures", async () => {
|
|
61
|
+
const method = "POST";
|
|
62
|
+
const path = "/api/test";
|
|
63
|
+
const headers = { "content-type": "application/json" };
|
|
64
|
+
const body = JSON.stringify({ key: "value" });
|
|
65
|
+
const { signature, timestamp } = await agentAuth.signRequest(method, path, body);
|
|
66
|
+
const invalidHeaders = {
|
|
67
|
+
...headers,
|
|
68
|
+
"X-DAIN-TIMESTAMP": (parseInt(timestamp) + 1).toString(),
|
|
69
|
+
}; // Modifying timestamp
|
|
70
|
+
expect((0, auth_1.verifyRequestSignature)(signature, method, path, invalidHeaders, body, clientAddress, undefined)).toBe(false);
|
|
71
|
+
});
|
|
72
|
+
describe("signResponse and verifyResponse", () => {
|
|
73
|
+
it("should sign a response and verify it successfully", () => {
|
|
74
|
+
const privateKey = ed25519_1.ed25519.utils.randomPrivateKey();
|
|
75
|
+
const publicKey = ed25519_1.ed25519.getPublicKey(privateKey);
|
|
76
|
+
const responseBody = JSON.stringify({ message: "Hello, World!" });
|
|
77
|
+
const { signature, timestamp } = (0, auth_1.signResponse)(privateKey, responseBody);
|
|
78
|
+
const isValid = (0, auth_1.verifyResponse)(publicKey, responseBody, signature, timestamp);
|
|
79
|
+
expect(isValid).toBe(true);
|
|
80
|
+
});
|
|
81
|
+
it("should fail verification with tampered response body", () => {
|
|
82
|
+
const privateKey = ed25519_1.ed25519.utils.randomPrivateKey();
|
|
83
|
+
const publicKey = ed25519_1.ed25519.getPublicKey(privateKey);
|
|
84
|
+
const responseBody = JSON.stringify({ message: "Hello, World!" });
|
|
85
|
+
const { signature, timestamp } = (0, auth_1.signResponse)(privateKey, responseBody);
|
|
86
|
+
const tamperedBody = JSON.stringify({ message: "Tampered message" });
|
|
87
|
+
const isValid = (0, auth_1.verifyResponse)(publicKey, tamperedBody, signature, timestamp);
|
|
88
|
+
expect(isValid).toBe(false);
|
|
89
|
+
});
|
|
90
|
+
it("should fail verification with incorrect public key", () => {
|
|
91
|
+
const privateKey = ed25519_1.ed25519.utils.randomPrivateKey();
|
|
92
|
+
const wrongPrivateKey = ed25519_1.ed25519.utils.randomPrivateKey();
|
|
93
|
+
const wrongPublicKey = ed25519_1.ed25519.getPublicKey(wrongPrivateKey);
|
|
94
|
+
const responseBody = JSON.stringify({ message: "Hello, World!" });
|
|
95
|
+
const { signature, timestamp } = (0, auth_1.signResponse)(privateKey, responseBody);
|
|
96
|
+
const isValid = (0, auth_1.verifyResponse)(wrongPublicKey, responseBody, signature, timestamp);
|
|
97
|
+
expect(isValid).toBe(false);
|
|
98
|
+
});
|
|
99
|
+
it("should fail verification with tampered timestamp", () => {
|
|
100
|
+
const privateKey = ed25519_1.ed25519.utils.randomPrivateKey();
|
|
101
|
+
const publicKey = ed25519_1.ed25519.getPublicKey(privateKey);
|
|
102
|
+
const responseBody = JSON.stringify({ message: "Hello, World!" });
|
|
103
|
+
const { signature, timestamp } = (0, auth_1.signResponse)(privateKey, responseBody);
|
|
104
|
+
const tamperedTimestamp = (parseInt(timestamp) + 1000).toString();
|
|
105
|
+
const isValid = (0, auth_1.verifyResponse)(publicKey, responseBody, signature, tamperedTimestamp);
|
|
106
|
+
expect(isValid).toBe(false);
|
|
107
|
+
});
|
|
108
|
+
});
|
|
109
|
+
});
|
|
110
|
+
//# sourceMappingURL=auth.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"auth.test.js","sourceRoot":"","sources":["../../src/__tests__/auth.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|