@apitoll/shared 0.1.0-beta.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.
@@ -0,0 +1,522 @@
1
+ import { describe, it, expect } from "vitest";
2
+ import { usdcToSmallestUnit, usdcFromSmallestUnit, matchRoute, checkBudgetPolicy, findBudgetPolicy, isVendorAllowed, calculateFeeBreakdown, getPlatformWallet, generateId, resolveChains, secureCompare, clampInt, clampFloat, checkPlanLimit, isOriginAllowed, isValidEvmAddress, isValidSolanaAddress, isValidPaymentAmount, isValidNonce, NonceTracker, computeHmacSignature, verifyHmacSignature, } from "./utils";
3
+ // ─── USDC Conversion ────────────────────────────────────────────
4
+ describe("usdcToSmallestUnit", () => {
5
+ it("converts whole numbers", () => {
6
+ expect(usdcToSmallestUnit("1")).toBe("1000000");
7
+ expect(usdcToSmallestUnit("100")).toBe("100000000");
8
+ });
9
+ it("converts decimals", () => {
10
+ expect(usdcToSmallestUnit("1.50")).toBe("1500000");
11
+ expect(usdcToSmallestUnit("0.005")).toBe("5000");
12
+ });
13
+ it("truncates beyond 6 decimal places", () => {
14
+ expect(usdcToSmallestUnit("1.1234567")).toBe("1123456");
15
+ });
16
+ it("handles zero", () => {
17
+ expect(usdcToSmallestUnit("0")).toBe("0");
18
+ expect(usdcToSmallestUnit("0.000000")).toBe("0");
19
+ });
20
+ });
21
+ describe("usdcFromSmallestUnit", () => {
22
+ it("converts back to human-readable", () => {
23
+ expect(usdcFromSmallestUnit("1500000")).toBe("1.500000");
24
+ expect(usdcFromSmallestUnit("5000")).toBe("0.005000");
25
+ });
26
+ it("handles zero", () => {
27
+ expect(usdcFromSmallestUnit("0")).toBe("0.000000");
28
+ });
29
+ it("handles large amounts", () => {
30
+ expect(usdcFromSmallestUnit("100000000")).toBe("100.000000");
31
+ });
32
+ it("round-trips correctly", () => {
33
+ const original = "42.123456";
34
+ expect(usdcFromSmallestUnit(usdcToSmallestUnit(original))).toBe(original);
35
+ });
36
+ });
37
+ // ─── Route Matching ─────────────────────────────────────────────
38
+ describe("matchRoute", () => {
39
+ it("matches exact routes", () => {
40
+ expect(matchRoute("GET", "/api/data", "GET /api/data")).toBe(true);
41
+ });
42
+ it("rejects method mismatch", () => {
43
+ expect(matchRoute("POST", "/api/data", "GET /api/data")).toBe(false);
44
+ });
45
+ it("supports wildcard method", () => {
46
+ expect(matchRoute("GET", "/api/data", "* /api/data")).toBe(true);
47
+ expect(matchRoute("POST", "/api/data", "* /api/data")).toBe(true);
48
+ });
49
+ it("matches path parameters", () => {
50
+ expect(matchRoute("GET", "/api/users/123", "GET /api/users/:id")).toBe(true);
51
+ });
52
+ it("rejects path length mismatch", () => {
53
+ expect(matchRoute("GET", "/api/data/extra", "GET /api/data")).toBe(false);
54
+ });
55
+ it("is case-insensitive on method", () => {
56
+ expect(matchRoute("get", "/api/data", "GET /api/data")).toBe(true);
57
+ });
58
+ it("returns false for malformed patterns", () => {
59
+ expect(matchRoute("GET", "/api/data", "invalid")).toBe(false);
60
+ });
61
+ });
62
+ // ─── Budget Policy ──────────────────────────────────────────────
63
+ describe("checkBudgetPolicy", () => {
64
+ const policy = {
65
+ type: "budget",
66
+ dailyCap: 50,
67
+ maxPerRequest: 10,
68
+ weeklyCap: 200,
69
+ };
70
+ it("allows valid transactions", () => {
71
+ expect(checkBudgetPolicy(policy, 5, [])).toBeNull();
72
+ });
73
+ it("rejects amounts exceeding per-request limit", () => {
74
+ const result = checkBudgetPolicy(policy, 15, []);
75
+ expect(result).toContain("exceeds max per-request limit");
76
+ });
77
+ it("rejects when daily cap would be exceeded", () => {
78
+ const today = new Date().toISOString();
79
+ const transactions = [
80
+ { amount: "45", requestedAt: today },
81
+ ];
82
+ const result = checkBudgetPolicy(policy, 10, transactions);
83
+ expect(result).toContain("daily cap");
84
+ });
85
+ it("allows when daily spend is under cap", () => {
86
+ const today = new Date().toISOString();
87
+ const transactions = [
88
+ { amount: "10", requestedAt: today },
89
+ ];
90
+ expect(checkBudgetPolicy(policy, 5, transactions)).toBeNull();
91
+ });
92
+ it("ignores transactions from previous days for daily cap", () => {
93
+ const yesterday = new Date();
94
+ yesterday.setDate(yesterday.getDate() - 1);
95
+ yesterday.setHours(0, 0, 0, 0);
96
+ const transactions = [
97
+ { amount: "49", requestedAt: yesterday.toISOString() },
98
+ ];
99
+ expect(checkBudgetPolicy(policy, 5, transactions)).toBeNull();
100
+ });
101
+ it("rejects when weekly cap would be exceeded", () => {
102
+ const today = new Date().toISOString();
103
+ const transactions = [
104
+ { amount: "195", requestedAt: today },
105
+ ];
106
+ const result = checkBudgetPolicy(policy, 10, transactions);
107
+ // This will hit daily cap first since 195 + 10 > 50.
108
+ // Let's construct a case that hits weekly but not daily.
109
+ expect(result).not.toBeNull();
110
+ });
111
+ it("enforces weekly cap across multiple days", () => {
112
+ const policyNoDaily = {
113
+ type: "budget",
114
+ dailyCap: 100,
115
+ maxPerRequest: 50,
116
+ weeklyCap: 200,
117
+ };
118
+ // Transactions spread across the current week
119
+ const daysAgo = (n) => {
120
+ const d = new Date();
121
+ d.setDate(d.getDate() - n);
122
+ return d.toISOString();
123
+ };
124
+ const transactions = [
125
+ { amount: "80", requestedAt: daysAgo(1) },
126
+ { amount: "80", requestedAt: daysAgo(2) },
127
+ { amount: "30", requestedAt: daysAgo(3) },
128
+ ];
129
+ const result = checkBudgetPolicy(policyNoDaily, 20, transactions);
130
+ expect(result).toContain("weekly cap");
131
+ });
132
+ });
133
+ describe("findBudgetPolicy", () => {
134
+ it("finds budget policy in list", () => {
135
+ const policies = [
136
+ { type: "vendor_acl", allowedVendors: ["*"] },
137
+ { type: "budget", dailyCap: 50, maxPerRequest: 10 },
138
+ ];
139
+ const result = findBudgetPolicy(policies);
140
+ expect(result).toBeDefined();
141
+ expect(result?.type).toBe("budget");
142
+ expect(result?.dailyCap).toBe(50);
143
+ });
144
+ it("returns undefined when no budget policy exists", () => {
145
+ const policies = [
146
+ { type: "vendor_acl", allowedVendors: ["*"] },
147
+ ];
148
+ expect(findBudgetPolicy(policies)).toBeUndefined();
149
+ });
150
+ });
151
+ // ─── Vendor ACL ─────────────────────────────────────────────────
152
+ describe("isVendorAllowed", () => {
153
+ it("allows all when no ACL policies exist", () => {
154
+ expect(isVendorAllowed([], "any-vendor")).toBe(true);
155
+ });
156
+ it("allows vendors in the allowedVendors list", () => {
157
+ const policies = [
158
+ { type: "vendor_acl", allowedVendors: ["seller-a", "seller-b"] },
159
+ ];
160
+ expect(isVendorAllowed(policies, "seller-a")).toBe(true);
161
+ expect(isVendorAllowed(policies, "seller-b")).toBe(true);
162
+ });
163
+ it("rejects vendors not in the allowedVendors list", () => {
164
+ const policies = [
165
+ { type: "vendor_acl", allowedVendors: ["seller-a"] },
166
+ ];
167
+ expect(isVendorAllowed(policies, "seller-x")).toBe(false);
168
+ });
169
+ it("allows all vendors when wildcard is used", () => {
170
+ const policies = [
171
+ { type: "vendor_acl", allowedVendors: ["*"] },
172
+ ];
173
+ expect(isVendorAllowed(policies, "any-vendor")).toBe(true);
174
+ });
175
+ it("blocks vendors in blockedVendors even if wildcard allows", () => {
176
+ const policies = [
177
+ {
178
+ type: "vendor_acl",
179
+ allowedVendors: ["*"],
180
+ blockedVendors: ["bad-vendor"],
181
+ },
182
+ ];
183
+ expect(isVendorAllowed(policies, "bad-vendor")).toBe(false);
184
+ expect(isVendorAllowed(policies, "good-vendor")).toBe(true);
185
+ });
186
+ });
187
+ // ─── Fee Calculation ────────────────────────────────────────────
188
+ describe("calculateFeeBreakdown", () => {
189
+ it("calculates 3% fee (300 bps)", () => {
190
+ const result = calculateFeeBreakdown("10.000000", {
191
+ feeBps: 300,
192
+ platformWalletBase: "0xPlatform",
193
+ });
194
+ expect(result.totalAmount).toBe("10.000000");
195
+ expect(result.platformFee).toBe("0.300000");
196
+ expect(result.sellerAmount).toBe("9.700000");
197
+ expect(result.feeBps).toBe(300);
198
+ });
199
+ it("calculates 0% fee", () => {
200
+ const result = calculateFeeBreakdown("10.000000", { feeBps: 0 });
201
+ expect(result.platformFee).toBe("0.000000");
202
+ expect(result.sellerAmount).toBe("10.000000");
203
+ });
204
+ it("handles no fee config (defaults to 0)", () => {
205
+ const result = calculateFeeBreakdown("5.000000");
206
+ expect(result.platformFee).toBe("0.000000");
207
+ expect(result.sellerAmount).toBe("5.000000");
208
+ });
209
+ it("fee + seller always equals total", () => {
210
+ const amounts = ["0.005", "1.00", "50.123456", "999.999999"];
211
+ const fees = [100, 250, 300, 500, 1000];
212
+ for (const amount of amounts) {
213
+ for (const feeBps of fees) {
214
+ const result = calculateFeeBreakdown(amount, { feeBps });
215
+ const total = BigInt(usdcToSmallestUnit(result.sellerAmount)) +
216
+ BigInt(usdcToSmallestUnit(result.platformFee));
217
+ expect(total.toString()).toBe(usdcToSmallestUnit(result.totalAmount));
218
+ }
219
+ }
220
+ });
221
+ it("handles micropayment amounts correctly", () => {
222
+ const result = calculateFeeBreakdown("0.005000", { feeBps: 300 });
223
+ // 5000 * 300 / 10000 = 150
224
+ expect(result.platformFee).toBe("0.000150");
225
+ expect(result.sellerAmount).toBe("0.004850");
226
+ });
227
+ });
228
+ describe("getPlatformWallet", () => {
229
+ it("returns base wallet for base chain", () => {
230
+ const config = { feeBps: 300, platformWalletBase: "0xBase", platformWalletSolana: "SolWallet" };
231
+ expect(getPlatformWallet("base", config)).toBe("0xBase");
232
+ });
233
+ it("returns solana wallet for solana chain", () => {
234
+ const config = { feeBps: 300, platformWalletBase: "0xBase", platformWalletSolana: "SolWallet" };
235
+ expect(getPlatformWallet("solana", config)).toBe("SolWallet");
236
+ });
237
+ it("returns undefined when no config", () => {
238
+ expect(getPlatformWallet("base")).toBeUndefined();
239
+ });
240
+ });
241
+ // ─── Utility Functions ──────────────────────────────────────────
242
+ describe("generateId", () => {
243
+ it("generates unique IDs", () => {
244
+ const id1 = generateId("tx");
245
+ const id2 = generateId("tx");
246
+ expect(id1).not.toBe(id2);
247
+ });
248
+ it("applies prefix", () => {
249
+ const id = generateId("tx");
250
+ expect(id.startsWith("tx_")).toBe(true);
251
+ });
252
+ it("works without prefix", () => {
253
+ const id = generateId();
254
+ expect(id).toBeTruthy();
255
+ expect(id.includes("_")).toBe(false);
256
+ });
257
+ });
258
+ describe("resolveChains", () => {
259
+ it("returns provided chains", () => {
260
+ expect(resolveChains(["base", "solana"])).toEqual(["base", "solana"]);
261
+ });
262
+ it("defaults to base when empty", () => {
263
+ expect(resolveChains([])).toEqual(["base"]);
264
+ });
265
+ it("defaults to base when undefined", () => {
266
+ expect(resolveChains()).toEqual(["base"]);
267
+ });
268
+ });
269
+ describe("secureCompare", () => {
270
+ it("returns true for equal strings", () => {
271
+ expect(secureCompare("abc123", "abc123")).toBe(true);
272
+ });
273
+ it("returns false for different strings", () => {
274
+ expect(secureCompare("abc123", "abc124")).toBe(false);
275
+ });
276
+ it("returns false for different lengths", () => {
277
+ expect(secureCompare("short", "longer_string")).toBe(false);
278
+ });
279
+ });
280
+ describe("clampInt", () => {
281
+ it("returns default for null", () => {
282
+ expect(clampInt(null, 1, 100, 10)).toBe(10);
283
+ });
284
+ it("returns default for NaN", () => {
285
+ expect(clampInt("abc", 1, 100, 10)).toBe(10);
286
+ });
287
+ it("clamps to min", () => {
288
+ expect(clampInt("-5", 1, 100, 10)).toBe(1);
289
+ });
290
+ it("clamps to max", () => {
291
+ expect(clampInt("500", 1, 100, 10)).toBe(100);
292
+ });
293
+ it("returns parsed value within range", () => {
294
+ expect(clampInt("42", 1, 100, 10)).toBe(42);
295
+ });
296
+ });
297
+ describe("clampFloat", () => {
298
+ it("returns default for null", () => {
299
+ expect(clampFloat(null, 0, 1, 0.5)).toBe(0.5);
300
+ });
301
+ it("clamps to range", () => {
302
+ expect(clampFloat("1.5", 0, 1, 0.5)).toBe(1);
303
+ expect(clampFloat("-0.5", 0, 1, 0.5)).toBe(0);
304
+ });
305
+ });
306
+ describe("isOriginAllowed", () => {
307
+ it("rejects null origin", () => {
308
+ expect(isOriginAllowed(null, ["https://example.com"])).toBe(false);
309
+ });
310
+ it("allows matching origin", () => {
311
+ expect(isOriginAllowed("https://example.com", ["https://example.com"])).toBe(true);
312
+ });
313
+ it("rejects non-matching origin", () => {
314
+ expect(isOriginAllowed("https://evil.com", ["https://example.com"])).toBe(false);
315
+ });
316
+ it("allows all with wildcard", () => {
317
+ expect(isOriginAllowed("https://anything.com", ["*"])).toBe(true);
318
+ });
319
+ });
320
+ describe("checkPlanLimit", () => {
321
+ it("allows within free plan limits", () => {
322
+ expect(checkPlanLimit("free", "maxAgents", 0)).toBeNull();
323
+ });
324
+ it("rejects when limit exceeded", () => {
325
+ const result = checkPlanLimit("free", "maxAgents", 1);
326
+ expect(result).toContain("Plan limit exceeded");
327
+ });
328
+ it("rejects disabled features", () => {
329
+ const result = checkPlanLimit("free", "webhooksEnabled", 0);
330
+ expect(result).toContain("not available on free plan");
331
+ });
332
+ it("allows features on pro plan", () => {
333
+ expect(checkPlanLimit("pro", "webhooksEnabled", 0)).toBeNull();
334
+ });
335
+ it("allows unlimited on enterprise", () => {
336
+ expect(checkPlanLimit("enterprise", "maxAgents", 99999)).toBeNull();
337
+ });
338
+ });
339
+ // ─── Address Validation ─────────────────────────────────────────
340
+ describe("isValidEvmAddress", () => {
341
+ it("accepts valid lowercase address", () => {
342
+ expect(isValidEvmAddress("0x833589fcd6edb6e08f4c7c32d4f71b54bda02913")).toBe(true);
343
+ });
344
+ it("accepts valid mixed-case address", () => {
345
+ expect(isValidEvmAddress("0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913")).toBe(true);
346
+ });
347
+ it("rejects too-short address", () => {
348
+ expect(isValidEvmAddress("0x1234")).toBe(false);
349
+ });
350
+ it("rejects too-long address", () => {
351
+ expect(isValidEvmAddress("0x" + "a".repeat(41))).toBe(false);
352
+ });
353
+ it("rejects missing 0x prefix", () => {
354
+ expect(isValidEvmAddress("833589fcd6edb6e08f4c7c32d4f71b54bda02913")).toBe(false);
355
+ });
356
+ it("rejects non-hex characters", () => {
357
+ expect(isValidEvmAddress("0x" + "g".repeat(40))).toBe(false);
358
+ expect(isValidEvmAddress("0x" + "Z".repeat(40))).toBe(false);
359
+ });
360
+ it("rejects empty string", () => {
361
+ expect(isValidEvmAddress("")).toBe(false);
362
+ });
363
+ it("rejects bare 0x", () => {
364
+ expect(isValidEvmAddress("0x")).toBe(false);
365
+ });
366
+ });
367
+ describe("isValidSolanaAddress", () => {
368
+ it("accepts valid Solana address", () => {
369
+ expect(isValidSolanaAddress("EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v")).toBe(true);
370
+ });
371
+ it("rejects too-short address", () => {
372
+ expect(isValidSolanaAddress("short")).toBe(false);
373
+ });
374
+ it("rejects invalid base58 characters (0, O, I, l)", () => {
375
+ expect(isValidSolanaAddress("0" + "A".repeat(43))).toBe(false);
376
+ expect(isValidSolanaAddress("O" + "A".repeat(43))).toBe(false);
377
+ expect(isValidSolanaAddress("I" + "A".repeat(43))).toBe(false);
378
+ expect(isValidSolanaAddress("l" + "A".repeat(43))).toBe(false);
379
+ });
380
+ it("rejects empty string", () => {
381
+ expect(isValidSolanaAddress("")).toBe(false);
382
+ });
383
+ });
384
+ // ─── Payment Amount Validation ──────────────────────────────────
385
+ describe("isValidPaymentAmount", () => {
386
+ it("accepts valid whole number", () => {
387
+ expect(isValidPaymentAmount("10")).toBe(true);
388
+ });
389
+ it("accepts valid decimal", () => {
390
+ expect(isValidPaymentAmount("0.005")).toBe(true);
391
+ expect(isValidPaymentAmount("1.50")).toBe(true);
392
+ });
393
+ it("rejects zero", () => {
394
+ expect(isValidPaymentAmount("0")).toBe(false);
395
+ expect(isValidPaymentAmount("0.000000")).toBe(false);
396
+ });
397
+ it("rejects negative amounts", () => {
398
+ expect(isValidPaymentAmount("-1")).toBe(false);
399
+ expect(isValidPaymentAmount("-0.005")).toBe(false);
400
+ });
401
+ it("rejects non-numeric strings", () => {
402
+ expect(isValidPaymentAmount("abc")).toBe(false);
403
+ expect(isValidPaymentAmount("")).toBe(false);
404
+ expect(isValidPaymentAmount("1e5")).toBe(false);
405
+ });
406
+ it("rejects amounts with spaces", () => {
407
+ expect(isValidPaymentAmount(" 10 ")).toBe(false);
408
+ });
409
+ });
410
+ // ─── Nonce Validation ───────────────────────────────────────────
411
+ describe("isValidNonce", () => {
412
+ it("accepts valid 32-byte hex nonce", () => {
413
+ const nonce = "0x" + "a1b2c3d4".repeat(8);
414
+ expect(isValidNonce(nonce)).toBe(true);
415
+ });
416
+ it("rejects too-short nonce", () => {
417
+ expect(isValidNonce("0x1234")).toBe(false);
418
+ });
419
+ it("rejects too-long nonce", () => {
420
+ expect(isValidNonce("0x" + "a".repeat(65))).toBe(false);
421
+ });
422
+ it("rejects missing 0x prefix", () => {
423
+ expect(isValidNonce("a".repeat(64))).toBe(false);
424
+ });
425
+ it("rejects non-hex characters", () => {
426
+ expect(isValidNonce("0x" + "g".repeat(64))).toBe(false);
427
+ });
428
+ });
429
+ // ─── Nonce Tracker (Replay Protection) ──────────────────────────
430
+ describe("NonceTracker", () => {
431
+ it("accepts new nonces", () => {
432
+ const tracker = new NonceTracker();
433
+ expect(tracker.tryUse("nonce-1")).toBe(true);
434
+ expect(tracker.tryUse("nonce-2")).toBe(true);
435
+ });
436
+ it("rejects replayed nonces", () => {
437
+ const tracker = new NonceTracker();
438
+ expect(tracker.tryUse("nonce-1")).toBe(true);
439
+ expect(tracker.tryUse("nonce-1")).toBe(false); // replay!
440
+ });
441
+ it("tracks usage count", () => {
442
+ const tracker = new NonceTracker();
443
+ tracker.tryUse("a");
444
+ tracker.tryUse("b");
445
+ tracker.tryUse("c");
446
+ expect(tracker.size).toBe(3);
447
+ });
448
+ it("hasBeenUsed returns correct state", () => {
449
+ const tracker = new NonceTracker();
450
+ expect(tracker.hasBeenUsed("nonce-1")).toBe(false);
451
+ tracker.tryUse("nonce-1");
452
+ expect(tracker.hasBeenUsed("nonce-1")).toBe(true);
453
+ });
454
+ it("evicts oldest entries when maxSize reached", () => {
455
+ const tracker = new NonceTracker(10);
456
+ // Fill to capacity
457
+ for (let i = 0; i < 10; i++) {
458
+ tracker.tryUse(`nonce-${i}`);
459
+ }
460
+ expect(tracker.size).toBe(10);
461
+ // Adding one more should trigger eviction of ~10%
462
+ tracker.tryUse("nonce-new");
463
+ expect(tracker.size).toBeLessThanOrEqual(10);
464
+ });
465
+ it("allows re-use after eviction", () => {
466
+ const tracker = new NonceTracker(5);
467
+ // Fill with nonces 0-4
468
+ for (let i = 0; i < 5; i++) {
469
+ tracker.tryUse(`nonce-${i}`);
470
+ }
471
+ // This triggers eviction — nonce-0 should be evicted (oldest)
472
+ tracker.tryUse("nonce-trigger");
473
+ // nonce-0 was evicted, so it should be usable again
474
+ // (This is the expected limitation of in-memory — production should use DB)
475
+ // Just verify the tracker doesn't crash and stays bounded
476
+ expect(tracker.size).toBeLessThanOrEqual(6);
477
+ });
478
+ });
479
+ // ─── HMAC Webhook Signing ───────────────────────────────────────
480
+ describe("computeHmacSignature", () => {
481
+ it("produces consistent signatures for same input", async () => {
482
+ const sig1 = await computeHmacSignature("hello", "secret");
483
+ const sig2 = await computeHmacSignature("hello", "secret");
484
+ expect(sig1).toBe(sig2);
485
+ });
486
+ it("produces different signatures for different payloads", async () => {
487
+ const sig1 = await computeHmacSignature("payload-a", "secret");
488
+ const sig2 = await computeHmacSignature("payload-b", "secret");
489
+ expect(sig1).not.toBe(sig2);
490
+ });
491
+ it("produces different signatures for different secrets", async () => {
492
+ const sig1 = await computeHmacSignature("payload", "secret-1");
493
+ const sig2 = await computeHmacSignature("payload", "secret-2");
494
+ expect(sig1).not.toBe(sig2);
495
+ });
496
+ it("returns a hex string", async () => {
497
+ const sig = await computeHmacSignature("test", "key");
498
+ expect(sig).toMatch(/^[a-f0-9]{64}$/); // SHA-256 = 32 bytes = 64 hex
499
+ });
500
+ });
501
+ describe("verifyHmacSignature", () => {
502
+ it("verifies valid signature", async () => {
503
+ const payload = '{"type":"transaction.settled"}';
504
+ const secret = "webhook-secret-key";
505
+ const sig = await computeHmacSignature(payload, secret);
506
+ expect(await verifyHmacSignature(payload, secret, sig)).toBe(true);
507
+ });
508
+ it("rejects tampered payload", async () => {
509
+ const secret = "webhook-secret-key";
510
+ const sig = await computeHmacSignature("original", secret);
511
+ expect(await verifyHmacSignature("tampered", secret, sig)).toBe(false);
512
+ });
513
+ it("rejects wrong secret", async () => {
514
+ const payload = "data";
515
+ const sig = await computeHmacSignature(payload, "correct-secret");
516
+ expect(await verifyHmacSignature(payload, "wrong-secret", sig)).toBe(false);
517
+ });
518
+ it("rejects garbage signature", async () => {
519
+ expect(await verifyHmacSignature("data", "secret", "not-a-real-signature")).toBe(false);
520
+ });
521
+ });
522
+ //# sourceMappingURL=utils.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"utils.test.js","sourceRoot":"","sources":["../src/utils.test.ts"],"names":[],"mappings":"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"}
package/package.json ADDED
@@ -0,0 +1,27 @@
1
+ {
2
+ "name": "@apitoll/shared",
3
+ "version": "0.1.0-beta.1",
4
+ "description": "Shared types and utilities for API Toll packages",
5
+ "license": "MIT",
6
+ "type": "module",
7
+ "main": "dist/index.js",
8
+ "types": "dist/index.d.ts",
9
+ "files": ["dist", "README.md"],
10
+ "engines": {
11
+ "node": ">=18"
12
+ },
13
+ "repository": {
14
+ "type": "git",
15
+ "url": "https://github.com/TasnidChain/APITOLL"
16
+ },
17
+ "publishConfig": {
18
+ "access": "public"
19
+ },
20
+ "scripts": {
21
+ "build": "tsc",
22
+ "dev": "tsc --watch"
23
+ },
24
+ "devDependencies": {
25
+ "typescript": "^5.4.0"
26
+ }
27
+ }