@channel.io/app-sdk-server 0.31.0 → 0.32.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (77) hide show
  1. package/dist/decorators/extension.decorator.d.ts +6 -0
  2. package/dist/decorators/extension.decorator.d.ts.map +1 -1
  3. package/dist/decorators/extension.decorator.js +14 -0
  4. package/dist/decorators/extension.decorator.js.map +1 -1
  5. package/dist/decorators/index.d.ts +1 -1
  6. package/dist/decorators/index.d.ts.map +1 -1
  7. package/dist/decorators/index.js +1 -1
  8. package/dist/decorators/index.js.map +1 -1
  9. package/dist/native/client.d.ts +7 -22
  10. package/dist/native/client.d.ts.map +1 -1
  11. package/dist/native/client.js +13 -31
  12. package/dist/native/client.js.map +1 -1
  13. package/dist/native/proxy-api.d.ts +3 -15
  14. package/dist/native/proxy-api.d.ts.map +1 -1
  15. package/dist/native/proxy-api.js +2 -20
  16. package/dist/native/proxy-api.js.map +1 -1
  17. package/dist/native/proxy-api.types.d.ts +1 -1
  18. package/dist/native/proxy-api.types.d.ts.map +1 -1
  19. package/dist/native/types.d.ts +6 -0
  20. package/dist/native/types.d.ts.map +1 -1
  21. package/package.json +4 -4
  22. package/dist/__tests__/datasource-runners.test.d.ts +0 -2
  23. package/dist/__tests__/datasource-runners.test.d.ts.map +0 -1
  24. package/dist/__tests__/datasource-runners.test.js +0 -354
  25. package/dist/__tests__/datasource-runners.test.js.map +0 -1
  26. package/dist/__tests__/datasource.test.d.ts +0 -2
  27. package/dist/__tests__/datasource.test.d.ts.map +0 -1
  28. package/dist/__tests__/datasource.test.js +0 -374
  29. package/dist/__tests__/datasource.test.js.map +0 -1
  30. package/dist/__tests__/decorators.test.d.ts +0 -2
  31. package/dist/__tests__/decorators.test.d.ts.map +0 -1
  32. package/dist/__tests__/decorators.test.js +0 -441
  33. package/dist/__tests__/decorators.test.js.map +0 -1
  34. package/dist/__tests__/extension-result-normalizer.test.d.ts +0 -2
  35. package/dist/__tests__/extension-result-normalizer.test.d.ts.map +0 -1
  36. package/dist/__tests__/extension-result-normalizer.test.js +0 -184
  37. package/dist/__tests__/extension-result-normalizer.test.js.map +0 -1
  38. package/dist/__tests__/function-input-validator.test.d.ts +0 -2
  39. package/dist/__tests__/function-input-validator.test.d.ts.map +0 -1
  40. package/dist/__tests__/function-input-validator.test.js +0 -56
  41. package/dist/__tests__/function-input-validator.test.js.map +0 -1
  42. package/dist/__tests__/native-client.test.d.ts +0 -2
  43. package/dist/__tests__/native-client.test.d.ts.map +0 -1
  44. package/dist/__tests__/native-client.test.js +0 -504
  45. package/dist/__tests__/native-client.test.js.map +0 -1
  46. package/dist/__tests__/proxy-api.test.d.ts +0 -2
  47. package/dist/__tests__/proxy-api.test.d.ts.map +0 -1
  48. package/dist/__tests__/proxy-api.test.js +0 -310
  49. package/dist/__tests__/proxy-api.test.js.map +0 -1
  50. package/dist/__tests__/sanitize-for-logging.test.d.ts +0 -2
  51. package/dist/__tests__/sanitize-for-logging.test.d.ts.map +0 -1
  52. package/dist/__tests__/sanitize-for-logging.test.js +0 -97
  53. package/dist/__tests__/sanitize-for-logging.test.js.map +0 -1
  54. package/dist/__tests__/signature.test.d.ts +0 -2
  55. package/dist/__tests__/signature.test.d.ts.map +0 -1
  56. package/dist/__tests__/signature.test.js +0 -172
  57. package/dist/__tests__/signature.test.js.map +0 -1
  58. package/dist/__tests__/testing-utils.test.d.ts +0 -2
  59. package/dist/__tests__/testing-utils.test.d.ts.map +0 -1
  60. package/dist/__tests__/testing-utils.test.js +0 -244
  61. package/dist/__tests__/testing-utils.test.js.map +0 -1
  62. package/dist/__tests__/token-manager.test.d.ts +0 -2
  63. package/dist/__tests__/token-manager.test.d.ts.map +0 -1
  64. package/dist/__tests__/token-manager.test.js +0 -528
  65. package/dist/__tests__/token-manager.test.js.map +0 -1
  66. package/dist/discovery/extension-discovery.service.test.d.ts +0 -2
  67. package/dist/discovery/extension-discovery.service.test.d.ts.map +0 -1
  68. package/dist/discovery/extension-discovery.service.test.js +0 -116
  69. package/dist/discovery/extension-discovery.service.test.js.map +0 -1
  70. package/dist/nestjs/channel-app.controller.test.d.ts +0 -2
  71. package/dist/nestjs/channel-app.controller.test.d.ts.map +0 -1
  72. package/dist/nestjs/channel-app.controller.test.js +0 -37
  73. package/dist/nestjs/channel-app.controller.test.js.map +0 -1
  74. package/dist/nestjs/channel-app.service.test.d.ts +0 -2
  75. package/dist/nestjs/channel-app.service.test.d.ts.map +0 -1
  76. package/dist/nestjs/channel-app.service.test.js +0 -583
  77. package/dist/nestjs/channel-app.service.test.js.map +0 -1
@@ -1,310 +0,0 @@
1
- import { describe, it, expect, expectTypeOf, vi, beforeEach } from "vitest";
2
- import { NativeFunctionClient } from "../native/client.js";
3
- import { ProxyApi } from "../native/proxy-api.js";
4
- describe("ProxyApi", () => {
5
- let client;
6
- let api;
7
- const accessToken = "test-access-token";
8
- beforeEach(() => {
9
- client = new NativeFunctionClient();
10
- api = client.createProxyApi(accessToken);
11
- });
12
- /**
13
- * Helper to spy on callNativeFunctionWithToken and verify it's called correctly
14
- */
15
- function mockCall(result) {
16
- return vi.spyOn(client, "callNativeFunctionWithToken").mockResolvedValue(result);
17
- }
18
- // ============================================
19
- // Factory method
20
- // ============================================
21
- describe("createProxyApi", () => {
22
- it("should return a ProxyApi instance", () => {
23
- expect(api).toBeInstanceOf(ProxyApi);
24
- });
25
- });
26
- // ============================================
27
- // Message API
28
- // ============================================
29
- describe("Message API", () => {
30
- it("exports the narrow Manager private-note request and result aliases", () => {
31
- expectTypeOf().toMatchTypeOf();
32
- expectTypeOf().toMatchTypeOf();
33
- });
34
- it("writeGroupMessage should call with correct method and params", async () => {
35
- const params = {
36
- channelId: "ch-1",
37
- groupId: "grp-1",
38
- dto: { plainText: "Hello" },
39
- };
40
- const expected = { message: { id: "msg-1", plainText: "Hello" } };
41
- const spy = mockCall(expected);
42
- const result = await api.writeGroupMessage(params);
43
- expect(spy).toHaveBeenCalledWith("writeGroupMessage", params, accessToken);
44
- expect(result).toEqual(expected);
45
- });
46
- it("writeGroupMessage should pass optional fields", async () => {
47
- const params = {
48
- channelId: "ch-1",
49
- groupId: "grp-1",
50
- rootMessageId: "root-1",
51
- broadcast: true,
52
- dto: {
53
- plainText: "Thread reply",
54
- buttons: [{ title: "Click" }],
55
- botName: "TestBot",
56
- },
57
- };
58
- const spy = mockCall({ message: { id: "msg-2" } });
59
- await api.writeGroupMessage(params);
60
- expect(spy).toHaveBeenCalledWith("writeGroupMessage", params, accessToken);
61
- });
62
- it("writeGroupMessageAsManager should call with correct method and params", async () => {
63
- const params = {
64
- channelId: "ch-1",
65
- groupId: "grp-1",
66
- dto: { plainText: "Manager message", managerId: "manager-1" },
67
- };
68
- const expected = { message: { id: "msg-manager" } };
69
- const spy = mockCall(expected);
70
- const result = await api.writeGroupMessageAsManager(params);
71
- expect(spy).toHaveBeenCalledWith("writeGroupMessageAsManager", params, accessToken);
72
- expect(result).toEqual(expected);
73
- });
74
- it("writeUserChatMessage should call with correct method and params", async () => {
75
- const params = {
76
- channelId: "ch-1",
77
- userChatId: "uc-1",
78
- dto: { plainText: "Hi user" },
79
- };
80
- const expected = { message: { id: "msg-3" } };
81
- const spy = mockCall(expected);
82
- const result = await api.writeUserChatMessage(params);
83
- expect(spy).toHaveBeenCalledWith("writeUserChatMessage", params, accessToken);
84
- expect(result).toEqual(expected);
85
- });
86
- it("writeUserChatMessageAsManager should call with correct method and params", async () => {
87
- const params = {
88
- channelId: "ch-1",
89
- userChatId: "uc-1",
90
- dto: { plainText: "Manager reply", managerId: "manager-1" },
91
- };
92
- const expected = { message: { id: "msg-manager-userchat" } };
93
- const spy = mockCall(expected);
94
- const result = await api.writeUserChatMessageAsManager(params);
95
- expect(spy).toHaveBeenCalledWith("writeUserChatMessageAsManager", params, accessToken);
96
- expect(result).toEqual(expected);
97
- });
98
- it("writeUserChatMessageAsUser should call with correct method and params", async () => {
99
- const params = {
100
- channelId: "ch-1",
101
- userChatId: "uc-1",
102
- dto: { plainText: "User reply", userId: "user-1" },
103
- };
104
- const expected = { message: { id: "msg-user" } };
105
- const spy = mockCall(expected);
106
- const result = await api.writeUserChatMessageAsUser(params);
107
- expect(spy).toHaveBeenCalledWith("writeUserChatMessageAsUser", params, accessToken);
108
- expect(result).toEqual(expected);
109
- });
110
- it("writeDirectChatMessageAsManager should call with correct method and params", async () => {
111
- const params = {
112
- directChatId: "dc-1",
113
- channelId: "ch-1",
114
- dto: { plainText: "DM", managerId: "manager-1" },
115
- };
116
- const expected = { message: { id: "msg-4" } };
117
- const spy = mockCall(expected);
118
- const result = await api.writeDirectChatMessageAsManager(params);
119
- expect(spy).toHaveBeenCalledWith("writeDirectChatMessageAsManager", params, accessToken);
120
- expect(result).toEqual(expected);
121
- });
122
- it("patchMessage should call with correct method and params", async () => {
123
- const params = {
124
- channelId: "ch-1",
125
- chatId: "chat-1",
126
- chatType: "group",
127
- messageId: "msg-1",
128
- body: { options: ["MESSAGE_OPTION_PRIVATE"], state: "MESSAGE_STATE_SENT" },
129
- updateMask: ["options", "state"],
130
- };
131
- const expected = { message: { id: "msg-1", state: "MESSAGE_STATE_SENT" } };
132
- const spy = mockCall(expected);
133
- const result = await api.patchMessage(params);
134
- expect(spy).toHaveBeenCalledWith("patchMessage", params, accessToken);
135
- expect(result).toEqual(expected);
136
- });
137
- });
138
- // ============================================
139
- // Manager API
140
- // ============================================
141
- describe("Manager API", () => {
142
- it("getManager should call with correct method and params", async () => {
143
- const params = {
144
- channelId: "ch-1",
145
- managerId: "mgr-1",
146
- };
147
- const expected = { manager: { id: "mgr-1", name: "Alice" } };
148
- const spy = mockCall(expected);
149
- const result = await api.getManager(params);
150
- expect(spy).toHaveBeenCalledWith("getManager", params, accessToken);
151
- expect(result).toEqual(expected);
152
- });
153
- it("batchGetManagers should call with correct method and params", async () => {
154
- const params = {
155
- channelId: "ch-1",
156
- managerIds: ["mgr-1", "mgr-2"],
157
- };
158
- const expected = {
159
- managers: [
160
- { id: "mgr-1", name: "Alice" },
161
- { id: "mgr-2", name: "Bob" },
162
- ],
163
- };
164
- const spy = mockCall(expected);
165
- const result = await api.batchGetManagers(params);
166
- expect(spy).toHaveBeenCalledWith("batchGetManagers", params, accessToken);
167
- expect(result).toEqual(expected);
168
- });
169
- it("searchManagers should call with correct method and params", async () => {
170
- const params = {
171
- channelId: "ch-1",
172
- pagination: { limit: 10 },
173
- };
174
- const expected = {
175
- managers: [{ id: "mgr-1", name: "Alice" }],
176
- next: "cursor-abc",
177
- };
178
- const spy = mockCall(expected);
179
- const result = await api.searchManagers(params);
180
- expect(spy).toHaveBeenCalledWith("searchManagers", params, accessToken);
181
- expect(result).toEqual(expected);
182
- });
183
- });
184
- // ============================================
185
- // User API
186
- // ============================================
187
- describe("User API", () => {
188
- it("getUser should call with correct method and params", async () => {
189
- const params = {
190
- channelId: "ch-1",
191
- userId: "user-1",
192
- };
193
- const expected = { user: { id: "user-1", name: "Charlie" } };
194
- const spy = mockCall(expected);
195
- const result = await api.getUser(params);
196
- expect(spy).toHaveBeenCalledWith("getUser", params, accessToken);
197
- expect(result).toEqual(expected);
198
- });
199
- it("searchUser should call with correct method and params", async () => {
200
- const params = {
201
- channelId: "ch-1",
202
- memberId: "member-1",
203
- };
204
- const expected = { user: { id: "user-1", memberId: "member-1" } };
205
- const spy = mockCall(expected);
206
- const result = await api.searchUser(params);
207
- expect(spy).toHaveBeenCalledWith("searchUser", params, accessToken);
208
- expect(result).toEqual(expected);
209
- });
210
- it("patchUser should call with correct method and params", async () => {
211
- const params = {
212
- channelId: "ch-1",
213
- userId: "user-1",
214
- body: {
215
- tags: ["vip", "premium"],
216
- blocked: false,
217
- profile: { company: "Acme" },
218
- },
219
- updateMask: ["tags", "blocked", "profile"],
220
- };
221
- const expected = { user: { id: "user-1", tags: ["vip", "premium"] } };
222
- const spy = mockCall(expected);
223
- const result = await api.patchUser(params);
224
- expect(spy).toHaveBeenCalledWith("patchUser", params, accessToken);
225
- expect(result).toEqual(expected);
226
- });
227
- });
228
- // ============================================
229
- // UserChat API
230
- // ============================================
231
- describe("UserChat API", () => {
232
- it("getUserChat should call with correct method and params", async () => {
233
- const params = {
234
- channelId: "ch-1",
235
- userChatId: "uc-1",
236
- };
237
- const expected = { userChat: { id: "uc-1", state: "opened" } };
238
- const spy = mockCall(expected);
239
- const result = await api.getUserChat(params);
240
- expect(spy).toHaveBeenCalledWith("getUserChat", params, accessToken);
241
- expect(result).toEqual(expected);
242
- });
243
- it("manageUserChat should call with correct method and params", async () => {
244
- const params = {
245
- channelId: "ch-1",
246
- userChatId: "uc-1",
247
- };
248
- const expected = { userChat: { id: "uc-1", state: "managed" } };
249
- const spy = mockCall(expected);
250
- const result = await api.manageUserChat(params);
251
- expect(spy).toHaveBeenCalledWith("manageUserChat", params, accessToken);
252
- expect(result).toEqual(expected);
253
- });
254
- });
255
- // ============================================
256
- // Group API
257
- // ============================================
258
- describe("Group API", () => {
259
- it("getGroup should call with correct method and params", async () => {
260
- const params = {
261
- channelId: "ch-1",
262
- groupId: "grp-1",
263
- };
264
- const expected = { group: { id: "grp-1", name: "General" } };
265
- const spy = mockCall(expected);
266
- const result = await api.getGroup(params);
267
- expect(spy).toHaveBeenCalledWith("getGroup", params, accessToken);
268
- expect(result).toEqual(expected);
269
- });
270
- it("searchGroups should call with correct method and params", async () => {
271
- const params = {
272
- channelId: "ch-1",
273
- pagination: { limit: 20, since: "cursor-xyz" },
274
- };
275
- const expected = {
276
- groups: [{ id: "grp-1" }, { id: "grp-2" }],
277
- next: "cursor-next",
278
- };
279
- const spy = mockCall(expected);
280
- const result = await api.searchGroups(params);
281
- expect(spy).toHaveBeenCalledWith("searchGroups", params, accessToken);
282
- expect(result).toEqual(expected);
283
- });
284
- });
285
- // ============================================
286
- // Channel API
287
- // ============================================
288
- describe("Channel API", () => {
289
- it("getChannel should call with correct method and params", async () => {
290
- const params = {
291
- channelId: "ch-1",
292
- };
293
- const expected = { channel: { id: "ch-1", name: "My Channel" } };
294
- const spy = mockCall(expected);
295
- const result = await api.getChannel(params);
296
- expect(spy).toHaveBeenCalledWith("getChannel", params, accessToken);
297
- expect(result).toEqual(expected);
298
- });
299
- });
300
- // ============================================
301
- // Error propagation
302
- // ============================================
303
- describe("Error handling", () => {
304
- it("should propagate errors from callNativeFunctionWithToken", async () => {
305
- vi.spyOn(client, "callNativeFunctionWithToken").mockRejectedValue(new Error("Native function call failed: 403 Forbidden"));
306
- await expect(api.getManager({ channelId: "ch-1", managerId: "mgr-1" })).rejects.toThrow("Native function call failed: 403 Forbidden");
307
- });
308
- });
309
- });
310
- //# sourceMappingURL=proxy-api.test.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"proxy-api.test.js","sourceRoot":"","sources":["../../src/__tests__/proxy-api.test.ts"],"names":[],"mappings":"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"}
@@ -1,2 +0,0 @@
1
- export {};
2
- //# sourceMappingURL=sanitize-for-logging.test.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"sanitize-for-logging.test.d.ts","sourceRoot":"","sources":["../../src/__tests__/sanitize-for-logging.test.ts"],"names":[],"mappings":""}
@@ -1,97 +0,0 @@
1
- import { describe, expect, it } from "vitest";
2
- import { sanitizeForLogging } from "../utils/sanitize-for-logging.js";
3
- describe("sanitizeForLogging", () => {
4
- it("redacts OAuth resume nonces and redirect URLs that embed them", () => {
5
- expect(sanitizeForLogging({
6
- resumeUrl: "https://desk.example/return?oauthFlowNonce=secret",
7
- resumeNonce: "secret",
8
- oauth_flow_nonce: "secret",
9
- result: {
10
- type: "redirect",
11
- url: "https://setup.example/?returnTo=https%3A%2F%2Fdesk.example%3FoauthFlowNonce%3Dsecret",
12
- },
13
- flowId: "flow-1",
14
- })).toEqual({
15
- resumeUrl: "[REDACTED]",
16
- resumeNonce: "[REDACTED]",
17
- oauth_flow_nonce: "[REDACTED]",
18
- result: { type: "redirect", url: "[REDACTED]" },
19
- flowId: "flow-1",
20
- });
21
- });
22
- it.each(["oauth_flow_nonce", "oauth-flow-nonce", "OAuth_Flow_Nonce"])("redacts %s inside nested and encoded redirect URLs", (nonceKey) => {
23
- const resumeUrl = `https://desk.example/return?${nonceKey}=secret`;
24
- expect(sanitizeForLogging({
25
- result: {
26
- url: `https://setup.example/?returnTo=${encodeURIComponent(resumeUrl)}`,
27
- returnTo: resumeUrl,
28
- },
29
- })).toEqual({
30
- result: { url: "[REDACTED]", returnTo: "[REDACTED]" },
31
- });
32
- });
33
- it("redacts space-separated nonce names in strings", () => {
34
- expect(sanitizeForLogging({ url: "https://desk.example/?oauth flow nonce=secret" })).toEqual({
35
- url: "[REDACTED]",
36
- });
37
- });
38
- it.each([
39
- "oauth%46lowNonce",
40
- "oauth%5Fflow%5Fnonce",
41
- "oauth%2Dflow%2Dnonce",
42
- "oauth%20flow%20nonce",
43
- "oauth+flow+nonce",
44
- "oauth%2Bflow%2Bnonce",
45
- ])("redacts encoded nonce name %s in direct and nested URLs", (nonceKey) => {
46
- const resumeUrl = `https://desk.example/?${nonceKey}=secret`;
47
- const redirectUrl = `https://setup.example/?returnTo=${encodeURIComponent(resumeUrl)}`;
48
- expect(sanitizeForLogging({
49
- url: resumeUrl,
50
- nested: { returnTo: `https://outer.example/?next=${encodeURIComponent(redirectUrl)}` },
51
- })).toEqual({ url: "[REDACTED]", nested: { returnTo: "[REDACTED]" } });
52
- });
53
- it("redacts encoded nonces even when another URL component has malformed escapes", () => {
54
- expect(sanitizeForLogging({ url: "https://desk.example/?broken=%FF%&oauth%46lowNonce=secret" })).toEqual({ url: "[REDACTED]" });
55
- });
56
- it("redacts deeply encoded values without unbounded decoding", () => {
57
- let url = "https://desk.example/?oauth%46lowNonce=secret";
58
- for (let i = 0; i < 8; i++) {
59
- url = encodeURIComponent(url);
60
- }
61
- expect(sanitizeForLogging({ url })).toEqual({ url: "[REDACTED]" });
62
- });
63
- it("preserves unrelated text and URLs, including malformed percent escapes", () => {
64
- const value = {
65
- url: "https://desk.example/?returnTo=https%3A%2F%2Fsetup.example%2Fdone&broken=%FF%",
66
- message: "100% complete",
67
- };
68
- expect(sanitizeForLogging(value)).toEqual(value);
69
- });
70
- it("should redact snake_case and kebab-case sensitive keys", () => {
71
- expect(sanitizeForLogging({
72
- access_token: "access-123",
73
- "refresh-token": "refresh-456",
74
- "x-access-token": "x-access-789",
75
- api_key: "api-key-000",
76
- client_secret: "client-secret-111",
77
- auth_token: "auth-token-222",
78
- })).toEqual({
79
- access_token: "[REDACTED]",
80
- "refresh-token": "[REDACTED]",
81
- "x-access-token": "[REDACTED]",
82
- api_key: "[REDACTED]",
83
- client_secret: "[REDACTED]",
84
- auth_token: "[REDACTED]",
85
- });
86
- });
87
- it("should keep non-sensitive keys unchanged", () => {
88
- expect(sanitizeForLogging({
89
- channelId: "channel-1",
90
- status: "ok",
91
- })).toEqual({
92
- channelId: "channel-1",
93
- status: "ok",
94
- });
95
- });
96
- });
97
- //# sourceMappingURL=sanitize-for-logging.test.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"sanitize-for-logging.test.js","sourceRoot":"","sources":["../../src/__tests__/sanitize-for-logging.test.ts"],"names":[],"mappings":"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"}
@@ -1,2 +0,0 @@
1
- export {};
2
- //# sourceMappingURL=signature.test.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"signature.test.d.ts","sourceRoot":"","sources":["../../src/__tests__/signature.test.ts"],"names":[],"mappings":""}
@@ -1,172 +0,0 @@
1
- import { describe, it, expect, vi, beforeEach } from "vitest";
2
- import { createHmac } from "crypto";
3
- import { UnauthorizedException } from "@nestjs/common";
4
- import { verifySignature, SignatureGuard, SIGNATURE_HEADER } from "../guards/signature.guard.js";
5
- /**
6
- * Helper: compute HMAC-SHA256 signature the same way Channel App platform does.
7
- * signingKey is hex-encoded, body is raw bytes, result is base64.
8
- */
9
- function computeSignature(signingKey, body) {
10
- const keyBuffer = Buffer.from(signingKey, "hex");
11
- return createHmac("sha256", keyBuffer).update(body).digest("base64");
12
- }
13
- /** 64-char hex signing key for tests */
14
- const VALID_HEX_KEY = "ab".repeat(32);
15
- describe("verifySignature", () => {
16
- it("should return true for a valid signature over raw body", () => {
17
- const body = Buffer.from('{"method":"hello","params":{"name":"world"}}');
18
- const sig = computeSignature(VALID_HEX_KEY, body);
19
- expect(verifySignature(sig, VALID_HEX_KEY, body)).toBe(true);
20
- });
21
- it("should return false when body bytes differ (re-serialized JSON)", () => {
22
- // Channel App platform signs the raw bytes with specific whitespace
23
- const rawWithSpaces = Buffer.from('{ "method" : "hello" , "params" : { "name" : "world" } }');
24
- const sig = computeSignature(VALID_HEX_KEY, rawWithSpaces);
25
- const parsed = JSON.parse(rawWithSpaces.toString());
26
- const reserialized = Buffer.from(JSON.stringify(parsed));
27
- // The re-serialized body loses whitespace → signature mismatch
28
- expect(verifySignature(sig, VALID_HEX_KEY, reserialized)).toBe(false);
29
- // But raw body works
30
- expect(verifySignature(sig, VALID_HEX_KEY, rawWithSpaces)).toBe(true);
31
- });
32
- it("should return false for an invalid signature", () => {
33
- const body = Buffer.from('{"key":"value"}');
34
- expect(verifySignature("invalid-signature", VALID_HEX_KEY, body)).toBe(false);
35
- });
36
- it("should return false for wrong signing key", () => {
37
- const body = Buffer.from('{"key":"value"}');
38
- const sig = computeSignature(VALID_HEX_KEY, body);
39
- const wrongKey = "cd".repeat(32);
40
- expect(verifySignature(sig, wrongKey, body)).toBe(false);
41
- });
42
- it("should return false for empty signature", () => {
43
- const body = Buffer.from("{}");
44
- expect(verifySignature("", VALID_HEX_KEY, body)).toBe(false);
45
- });
46
- it("should return false for malformed signing key", () => {
47
- const body = Buffer.from("{}");
48
- // "zz" is not valid hex, Buffer.from will produce empty/garbage
49
- expect(verifySignature("anysig", "not-hex!", body)).toBe(false);
50
- });
51
- });
52
- describe("SignatureGuard", () => {
53
- let guard;
54
- let options;
55
- function createMockExecutionContext(overrides) {
56
- const request = {
57
- headers: overrides.headers ?? {},
58
- rawBody: overrides.rawBody,
59
- };
60
- return {
61
- switchToHttp: () => ({
62
- getRequest: () => request,
63
- getResponse: () => ({}),
64
- getNext: () => vi.fn(),
65
- }),
66
- getClass: vi.fn(),
67
- getHandler: vi.fn(),
68
- getArgs: vi.fn(),
69
- getArgByIndex: vi.fn(),
70
- switchToRpc: vi.fn(),
71
- switchToWs: vi.fn(),
72
- getType: vi.fn(),
73
- };
74
- }
75
- beforeEach(() => {
76
- options = {
77
- appId: "test-app",
78
- appSecret: VALID_HEX_KEY,
79
- };
80
- // Construct guard with injected options
81
- guard = new SignatureGuard(options);
82
- });
83
- it("should pass when signature is valid", () => {
84
- const body = Buffer.from('{"method":"test","params":{}}');
85
- const sig = computeSignature(VALID_HEX_KEY, body);
86
- const ctx = createMockExecutionContext({
87
- headers: { [SIGNATURE_HEADER]: sig },
88
- rawBody: body,
89
- });
90
- expect(guard.canActivate(ctx)).toBe(true);
91
- });
92
- it("should throw when X-Signature header is missing", () => {
93
- const ctx = createMockExecutionContext({
94
- headers: {},
95
- rawBody: Buffer.from("{}"),
96
- });
97
- expect(() => guard.canActivate(ctx)).toThrow(UnauthorizedException);
98
- });
99
- it("should throw when rawBody is not available", () => {
100
- const ctx = createMockExecutionContext({
101
- headers: { [SIGNATURE_HEADER]: "some-sig" },
102
- rawBody: undefined,
103
- });
104
- expect(() => guard.canActivate(ctx)).toThrow("raw body not available");
105
- });
106
- it("should throw when signature is invalid", () => {
107
- const body = Buffer.from('{"method":"test"}');
108
- const ctx = createMockExecutionContext({
109
- headers: { [SIGNATURE_HEADER]: "wrong-signature" },
110
- rawBody: body,
111
- });
112
- expect(() => guard.canActivate(ctx)).toThrow("Invalid signature");
113
- });
114
- it("should skip verification when skipSignatureVerification is true", () => {
115
- options.skipSignatureVerification = true;
116
- guard = new SignatureGuard(options);
117
- const ctx = createMockExecutionContext({
118
- headers: {}, // no signature header
119
- rawBody: undefined,
120
- });
121
- expect(guard.canActivate(ctx)).toBe(true);
122
- });
123
- it("should use signingKey over appSecret when both are provided", () => {
124
- const dedicatedKey = "cd".repeat(32);
125
- options.signingKey = dedicatedKey;
126
- guard = new SignatureGuard(options);
127
- const body = Buffer.from('{"data":"test"}');
128
- const sig = computeSignature(dedicatedKey, body);
129
- const ctx = createMockExecutionContext({
130
- headers: { [SIGNATURE_HEADER]: sig },
131
- rawBody: body,
132
- });
133
- expect(guard.canActivate(ctx)).toBe(true);
134
- // Signature computed with appSecret should NOT pass
135
- const wrongSig = computeSignature(VALID_HEX_KEY, body);
136
- const ctx2 = createMockExecutionContext({
137
- headers: { [SIGNATURE_HEADER]: wrongSig },
138
- rawBody: body,
139
- });
140
- expect(() => guard.canActivate(ctx2)).toThrow("Invalid signature");
141
- });
142
- it("should throw when no signing key is configured", () => {
143
- const noKeyOptions = {
144
- appId: "test-app",
145
- appSecret: undefined,
146
- };
147
- guard = new SignatureGuard(noKeyOptions);
148
- const ctx = createMockExecutionContext({
149
- headers: { [SIGNATURE_HEADER]: "some-sig" },
150
- rawBody: Buffer.from("{}"),
151
- });
152
- expect(() => guard.canActivate(ctx)).toThrow("not configured");
153
- });
154
- it("should verify using raw body bytes, not re-serialized JSON", () => {
155
- // This is the core bug scenario: Channel App platform sends JSON with specific formatting
156
- // If SDK re-serializes with JSON.stringify, the signature won't match
157
- const rawJson = '{ "method" : "test" , "params" : {} }';
158
- const rawBody = Buffer.from(rawJson);
159
- const sig = computeSignature(VALID_HEX_KEY, rawBody);
160
- // Guard uses rawBody directly → should pass
161
- const ctx = createMockExecutionContext({
162
- headers: { [SIGNATURE_HEADER]: sig },
163
- rawBody: rawBody,
164
- });
165
- expect(guard.canActivate(ctx)).toBe(true);
166
- // If we were to use JSON.stringify(JSON.parse(rawJson)), it would fail
167
- const reserialized = Buffer.from(JSON.stringify(JSON.parse(rawJson)));
168
- expect(reserialized.toString()).not.toBe(rawJson); // confirm they differ
169
- expect(verifySignature(sig, VALID_HEX_KEY, reserialized)).toBe(false);
170
- });
171
- });
172
- //# sourceMappingURL=signature.test.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"signature.test.js","sourceRoot":"","sources":["../../src/__tests__/signature.test.ts"],"names":[],"mappings":"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"}
@@ -1,2 +0,0 @@
1
- import "reflect-metadata";
2
- //# sourceMappingURL=testing-utils.test.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"testing-utils.test.d.ts","sourceRoot":"","sources":["../../src/__tests__/testing-utils.test.ts"],"names":[],"mappings":"AACA,OAAO,kBAAkB,CAAC"}