@hookflo/tern 2.2.4 → 2.2.5

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.
@@ -1,4 +1,4 @@
1
- import { PlatformAlgorithmConfig, WebhookPlatform, SignatureConfig } from '../types';
1
+ import { PlatformAlgorithmConfig, WebhookPlatform, SignatureConfig } from "../types";
2
2
  export declare const platformAlgorithmConfigs: Record<WebhookPlatform, PlatformAlgorithmConfig>;
3
3
  export declare function getPlatformAlgorithmConfig(platform: WebhookPlatform): PlatformAlgorithmConfig;
4
4
  export declare function platformUsesAlgorithm(platform: WebhookPlatform, algorithm: string): boolean;
@@ -7,274 +7,275 @@ exports.getPlatformsUsingAlgorithm = getPlatformsUsingAlgorithm;
7
7
  exports.validateSignatureConfig = validateSignatureConfig;
8
8
  exports.platformAlgorithmConfigs = {
9
9
  github: {
10
- platform: 'github',
10
+ platform: "github",
11
11
  signatureConfig: {
12
- algorithm: 'hmac-sha256',
13
- headerName: 'x-hub-signature-256',
14
- headerFormat: 'prefixed',
15
- prefix: 'sha256=',
12
+ algorithm: "hmac-sha256",
13
+ headerName: "x-hub-signature-256",
14
+ headerFormat: "prefixed",
15
+ prefix: "sha256=",
16
16
  timestampHeader: undefined,
17
- payloadFormat: 'raw',
17
+ payloadFormat: "raw",
18
18
  },
19
- description: 'GitHub webhooks use HMAC-SHA256 with sha256= prefix',
19
+ description: "GitHub webhooks use HMAC-SHA256 with sha256= prefix",
20
20
  },
21
21
  stripe: {
22
- platform: 'stripe',
22
+ platform: "stripe",
23
23
  signatureConfig: {
24
- algorithm: 'hmac-sha256',
25
- headerName: 'stripe-signature',
26
- headerFormat: 'comma-separated',
24
+ algorithm: "hmac-sha256",
25
+ headerName: "stripe-signature",
26
+ headerFormat: "comma-separated",
27
27
  timestampHeader: undefined,
28
- payloadFormat: 'timestamped',
28
+ payloadFormat: "timestamped",
29
29
  customConfig: {
30
- signatureFormat: 't={timestamp},v1={signature}',
30
+ signatureFormat: "t={timestamp},v1={signature}",
31
31
  },
32
32
  },
33
- description: 'Stripe webhooks use HMAC-SHA256 with comma-separated format',
33
+ description: "Stripe webhooks use HMAC-SHA256 with comma-separated format",
34
34
  },
35
35
  clerk: {
36
- platform: 'clerk',
36
+ platform: "clerk",
37
37
  signatureConfig: {
38
- algorithm: 'hmac-sha256',
39
- headerName: 'svix-signature',
40
- headerFormat: 'raw',
41
- timestampHeader: 'svix-timestamp',
42
- timestampFormat: 'unix',
43
- payloadFormat: 'custom',
38
+ algorithm: "hmac-sha256",
39
+ headerName: "svix-signature",
40
+ headerFormat: "raw",
41
+ timestampHeader: "svix-timestamp",
42
+ timestampFormat: "unix",
43
+ payloadFormat: "custom",
44
44
  customConfig: {
45
- signatureFormat: 'v1={signature}',
46
- payloadFormat: '{id}.{timestamp}.{body}',
47
- encoding: 'base64',
48
- secretEncoding: 'base64',
49
- idHeader: 'svix-id',
45
+ signatureFormat: "v1={signature}",
46
+ payloadFormat: "{id}.{timestamp}.{body}",
47
+ encoding: "base64",
48
+ secretEncoding: "base64",
49
+ idHeader: "svix-id",
50
50
  },
51
51
  },
52
- description: 'Clerk webhooks use HMAC-SHA256 with base64 encoding',
52
+ description: "Clerk webhooks use HMAC-SHA256 with base64 encoding",
53
53
  },
54
54
  dodopayments: {
55
- platform: 'dodopayments',
55
+ platform: "dodopayments",
56
56
  signatureConfig: {
57
- algorithm: 'hmac-sha256',
58
- headerName: 'webhook-signature',
59
- headerFormat: 'raw',
60
- timestampHeader: 'webhook-timestamp',
61
- timestampFormat: 'unix',
62
- payloadFormat: 'custom',
57
+ algorithm: "hmac-sha256",
58
+ headerName: "webhook-signature",
59
+ headerFormat: "raw",
60
+ timestampHeader: "webhook-timestamp",
61
+ timestampFormat: "unix",
62
+ payloadFormat: "custom",
63
63
  customConfig: {
64
- signatureFormat: 'v1={signature}',
65
- payloadFormat: '{id}.{timestamp}.{body}',
66
- encoding: 'base64',
67
- secretEncoding: 'base64',
68
- idHeader: 'webhook-id',
64
+ signatureFormat: "v1={signature}",
65
+ payloadFormat: "{id}.{timestamp}.{body}",
66
+ encoding: "base64",
67
+ secretEncoding: "base64",
68
+ idHeader: "webhook-id",
69
69
  },
70
70
  },
71
- description: 'Dodo Payments webhooks use HMAC-SHA256 with svix-style format (Standard Webhooks)',
71
+ description: "Dodo Payments webhooks use HMAC-SHA256 with svix-style format (Standard Webhooks)",
72
72
  },
73
73
  shopify: {
74
- platform: 'shopify',
74
+ platform: "shopify",
75
75
  signatureConfig: {
76
- algorithm: 'hmac-sha256',
77
- headerName: 'x-shopify-hmac-sha256',
78
- headerFormat: 'raw',
79
- payloadFormat: 'raw',
76
+ algorithm: "hmac-sha256",
77
+ headerName: "x-shopify-hmac-sha256",
78
+ headerFormat: "raw",
79
+ payloadFormat: "raw",
80
80
  customConfig: {
81
- encoding: 'base64',
82
- secretEncoding: 'utf8',
81
+ encoding: "base64",
82
+ secretEncoding: "utf8",
83
83
  },
84
84
  },
85
- description: 'Shopify webhooks use HMAC-SHA256 with base64 encoded signature',
85
+ description: "Shopify webhooks use HMAC-SHA256 with base64 encoded signature",
86
86
  },
87
87
  vercel: {
88
- platform: 'vercel',
88
+ platform: "vercel",
89
89
  signatureConfig: {
90
- algorithm: 'hmac-sha256',
91
- headerName: 'x-vercel-signature',
92
- headerFormat: 'raw',
93
- timestampHeader: 'x-vercel-timestamp',
94
- timestampFormat: 'unix',
95
- payloadFormat: 'raw',
90
+ algorithm: "hmac-sha256",
91
+ headerName: "x-vercel-signature",
92
+ headerFormat: "raw",
93
+ timestampHeader: "x-vercel-timestamp",
94
+ timestampFormat: "unix",
95
+ payloadFormat: "raw",
96
96
  },
97
- description: 'Vercel webhooks use HMAC-SHA256',
97
+ description: "Vercel webhooks use HMAC-SHA256",
98
98
  },
99
99
  polar: {
100
- platform: 'polar',
100
+ platform: "polar",
101
101
  signatureConfig: {
102
- algorithm: 'hmac-sha256',
103
- headerName: 'webhook-signature',
104
- headerFormat: 'raw',
105
- timestampHeader: 'webhook-timestamp',
106
- timestampFormat: 'unix',
107
- payloadFormat: 'custom',
102
+ algorithm: "hmac-sha256",
103
+ headerName: "webhook-signature",
104
+ headerFormat: "raw",
105
+ timestampHeader: "webhook-timestamp",
106
+ timestampFormat: "unix",
107
+ payloadFormat: "custom",
108
108
  customConfig: {
109
- signatureFormat: 'v1={signature}',
110
- payloadFormat: '{id}.{timestamp}.{body}',
111
- encoding: 'base64',
112
- idHeader: 'webhook-id',
109
+ signatureFormat: "v1={signature}",
110
+ payloadFormat: "{id}.{timestamp}.{body}",
111
+ encoding: "base64",
112
+ secretEncoding: "utf8",
113
+ idHeader: "webhook-id",
113
114
  },
114
115
  },
115
- description: 'Polar webhooks use HMAC-SHA256 with Standard Webhooks format',
116
+ description: "Polar webhooks use HMAC-SHA256 with Standard Webhooks format",
116
117
  },
117
118
  supabase: {
118
- platform: 'supabase',
119
+ platform: "supabase",
119
120
  signatureConfig: {
120
- algorithm: 'custom',
121
- headerName: 'x-webhook-token',
122
- headerFormat: 'raw',
123
- payloadFormat: 'raw',
121
+ algorithm: "custom",
122
+ headerName: "x-webhook-token",
123
+ headerFormat: "raw",
124
+ payloadFormat: "raw",
124
125
  customConfig: {
125
- type: 'token-based',
126
- idHeader: 'x-webhook-id',
126
+ type: "token-based",
127
+ idHeader: "x-webhook-id",
127
128
  },
128
129
  },
129
- description: 'Supabase webhooks use token-based authentication',
130
+ description: "Supabase webhooks use token-based authentication",
130
131
  },
131
132
  gitlab: {
132
- platform: 'gitlab',
133
+ platform: "gitlab",
133
134
  signatureConfig: {
134
- algorithm: 'custom',
135
- headerName: 'X-Gitlab-Token',
136
- headerFormat: 'raw',
137
- payloadFormat: 'raw',
135
+ algorithm: "custom",
136
+ headerName: "X-Gitlab-Token",
137
+ headerFormat: "raw",
138
+ payloadFormat: "raw",
138
139
  customConfig: {
139
- type: 'token-based',
140
- idHeader: 'X-Gitlab-Token',
140
+ type: "token-based",
141
+ idHeader: "X-Gitlab-Token",
141
142
  },
142
143
  },
143
- description: 'GitLab webhooks use HMAC-SHA256 with X-Gitlab-Token header',
144
+ description: "GitLab webhooks use HMAC-SHA256 with X-Gitlab-Token header",
144
145
  },
145
146
  paddle: {
146
- platform: 'paddle',
147
+ platform: "paddle",
147
148
  signatureConfig: {
148
- algorithm: 'hmac-sha256',
149
- headerName: 'paddle-signature',
150
- headerFormat: 'comma-separated',
151
- payloadFormat: 'custom',
149
+ algorithm: "hmac-sha256",
150
+ headerName: "paddle-signature",
151
+ headerFormat: "comma-separated",
152
+ payloadFormat: "custom",
152
153
  customConfig: {
153
- timestampKey: 'ts',
154
- signatureKey: 'h1',
155
- payloadFormat: '{timestamp}:{body}',
154
+ timestampKey: "ts",
155
+ signatureKey: "h1",
156
+ payloadFormat: "{timestamp}:{body}",
156
157
  },
157
158
  },
158
- description: 'Paddle webhooks use HMAC-SHA256 with Paddle-Signature (ts/h1) header format',
159
+ description: "Paddle webhooks use HMAC-SHA256 with Paddle-Signature (ts/h1) header format",
159
160
  },
160
161
  razorpay: {
161
- platform: 'razorpay',
162
+ platform: "razorpay",
162
163
  signatureConfig: {
163
- algorithm: 'hmac-sha256',
164
- headerName: 'x-razorpay-signature',
165
- headerFormat: 'raw',
166
- payloadFormat: 'raw',
164
+ algorithm: "hmac-sha256",
165
+ headerName: "x-razorpay-signature",
166
+ headerFormat: "raw",
167
+ payloadFormat: "raw",
167
168
  },
168
- description: 'Razorpay webhooks use HMAC-SHA256 with X-Razorpay-Signature header',
169
+ description: "Razorpay webhooks use HMAC-SHA256 with X-Razorpay-Signature header",
169
170
  },
170
171
  lemonsqueezy: {
171
- platform: 'lemonsqueezy',
172
+ platform: "lemonsqueezy",
172
173
  signatureConfig: {
173
- algorithm: 'hmac-sha256',
174
- headerName: 'x-signature',
175
- headerFormat: 'raw',
176
- payloadFormat: 'raw',
174
+ algorithm: "hmac-sha256",
175
+ headerName: "x-signature",
176
+ headerFormat: "raw",
177
+ payloadFormat: "raw",
177
178
  },
178
- description: 'Lemon Squeezy webhooks use HMAC-SHA256 with X-Signature header',
179
+ description: "Lemon Squeezy webhooks use HMAC-SHA256 with X-Signature header",
179
180
  },
180
181
  auth0: {
181
- platform: 'auth0',
182
+ platform: "auth0",
182
183
  signatureConfig: {
183
- algorithm: 'hmac-sha256',
184
- headerName: 'x-auth0-signature',
185
- headerFormat: 'raw',
186
- payloadFormat: 'raw',
184
+ algorithm: "hmac-sha256",
185
+ headerName: "x-auth0-signature",
186
+ headerFormat: "raw",
187
+ payloadFormat: "raw",
187
188
  },
188
- description: 'Auth0 webhooks use HMAC-SHA256 with X-Auth0-Signature header',
189
+ description: "Auth0 webhooks use HMAC-SHA256 with X-Auth0-Signature header",
189
190
  },
190
191
  workos: {
191
- platform: 'workos',
192
+ platform: "workos",
192
193
  signatureConfig: {
193
- algorithm: 'hmac-sha256',
194
- headerName: 'workos-signature',
195
- headerFormat: 'comma-separated',
196
- payloadFormat: 'custom',
194
+ algorithm: "hmac-sha256",
195
+ headerName: "workos-signature",
196
+ headerFormat: "comma-separated",
197
+ payloadFormat: "custom",
197
198
  customConfig: {
198
- timestampKey: 't',
199
- signatureKey: 'v1',
200
- payloadFormat: '{timestamp}.{body}',
199
+ timestampKey: "t",
200
+ signatureKey: "v1",
201
+ payloadFormat: "{timestamp}.{body}",
201
202
  },
202
203
  },
203
- description: 'WorkOS webhooks use HMAC-SHA256 with WorkOS-Signature (t/v1) format',
204
+ description: "WorkOS webhooks use HMAC-SHA256 with WorkOS-Signature (t/v1) format",
204
205
  },
205
206
  woocommerce: {
206
- platform: 'woocommerce',
207
+ platform: "woocommerce",
207
208
  signatureConfig: {
208
- algorithm: 'hmac-sha256',
209
- headerName: 'x-wc-webhook-signature',
210
- headerFormat: 'raw',
211
- payloadFormat: 'raw',
209
+ algorithm: "hmac-sha256",
210
+ headerName: "x-wc-webhook-signature",
211
+ headerFormat: "raw",
212
+ payloadFormat: "raw",
212
213
  customConfig: {
213
- encoding: 'base64',
214
- secretEncoding: 'utf8',
214
+ encoding: "base64",
215
+ secretEncoding: "utf8",
215
216
  },
216
217
  },
217
- description: 'WooCommerce webhooks use HMAC-SHA256 with base64 encoded signature',
218
+ description: "WooCommerce webhooks use HMAC-SHA256 with base64 encoded signature",
218
219
  },
219
220
  replicateai: {
220
- platform: 'replicateai',
221
+ platform: "replicateai",
221
222
  signatureConfig: {
222
- algorithm: 'hmac-sha256',
223
- headerName: 'webhook-signature',
224
- headerFormat: 'raw',
225
- timestampHeader: 'webhook-timestamp',
226
- timestampFormat: 'unix',
227
- payloadFormat: 'custom',
223
+ algorithm: "hmac-sha256",
224
+ headerName: "webhook-signature",
225
+ headerFormat: "raw",
226
+ timestampHeader: "webhook-timestamp",
227
+ timestampFormat: "unix",
228
+ payloadFormat: "custom",
228
229
  customConfig: {
229
- signatureFormat: 'v1={signature}',
230
- payloadFormat: '{id}.{timestamp}.{body}',
231
- encoding: 'base64',
232
- secretEncoding: 'base64',
233
- idHeader: 'webhook-id',
230
+ signatureFormat: "v1={signature}",
231
+ payloadFormat: "{id}.{timestamp}.{body}",
232
+ encoding: "base64",
233
+ secretEncoding: "base64",
234
+ idHeader: "webhook-id",
234
235
  },
235
236
  },
236
- description: 'Replicate webhooks use HMAC-SHA256 with Standard Webhooks (svix-style) format',
237
+ description: "Replicate webhooks use HMAC-SHA256 with Standard Webhooks (svix-style) format",
237
238
  },
238
239
  falai: {
239
- platform: 'falai',
240
+ platform: "falai",
240
241
  signatureConfig: {
241
- algorithm: 'ed25519',
242
- headerName: 'x-fal-webhook-signature',
243
- headerFormat: 'raw',
244
- payloadFormat: 'custom',
242
+ algorithm: "ed25519",
243
+ headerName: "x-fal-webhook-signature",
244
+ headerFormat: "raw",
245
+ payloadFormat: "custom",
245
246
  customConfig: {
246
- requestIdHeader: 'x-fal-request-id',
247
- userIdHeader: 'x-fal-user-id',
248
- timestampHeader: 'x-fal-webhook-timestamp',
249
- kidHeader: 'x-fal-webhook-key-id',
250
- jwksUrl: 'https://rest.alpha.fal.ai/.well-known/jwks.json',
247
+ requestIdHeader: "x-fal-request-id",
248
+ userIdHeader: "x-fal-user-id",
249
+ timestampHeader: "x-fal-webhook-timestamp",
250
+ kidHeader: "x-fal-webhook-key-id",
251
+ jwksUrl: "https://rest.alpha.fal.ai/.well-known/jwks.json",
251
252
  },
252
253
  },
253
- description: 'fal.ai webhooks use ED25519 with a signed request/user/timestamp/body-hash payload',
254
+ description: "fal.ai webhooks use ED25519 with a signed request/user/timestamp/body-hash payload",
254
255
  },
255
256
  custom: {
256
- platform: 'custom',
257
+ platform: "custom",
257
258
  signatureConfig: {
258
- algorithm: 'hmac-sha256',
259
- headerName: 'x-webhook-token',
260
- headerFormat: 'raw',
261
- payloadFormat: 'raw',
259
+ algorithm: "hmac-sha256",
260
+ headerName: "x-webhook-token",
261
+ headerFormat: "raw",
262
+ payloadFormat: "raw",
262
263
  customConfig: {
263
- type: 'token-based',
264
- idHeader: 'x-webhook-id',
264
+ type: "token-based",
265
+ idHeader: "x-webhook-id",
265
266
  },
266
267
  },
267
- description: 'Custom webhook configuration',
268
+ description: "Custom webhook configuration",
268
269
  },
269
270
  unknown: {
270
- platform: 'unknown',
271
+ platform: "unknown",
271
272
  signatureConfig: {
272
- algorithm: 'hmac-sha256',
273
- headerName: 'x-webhook-signature',
274
- headerFormat: 'raw',
275
- payloadFormat: 'raw',
273
+ algorithm: "hmac-sha256",
274
+ headerName: "x-webhook-signature",
275
+ headerFormat: "raw",
276
+ payloadFormat: "raw",
276
277
  },
277
- description: 'Unknown platform - using default HMAC-SHA256',
278
+ description: "Unknown platform - using default HMAC-SHA256",
278
279
  },
279
280
  };
280
281
  function getPlatformAlgorithmConfig(platform) {
@@ -294,15 +295,15 @@ function validateSignatureConfig(config) {
294
295
  return false;
295
296
  }
296
297
  switch (config.algorithm) {
297
- case 'hmac-sha256':
298
- case 'hmac-sha1':
299
- case 'hmac-sha512':
298
+ case "hmac-sha256":
299
+ case "hmac-sha1":
300
+ case "hmac-sha512":
300
301
  return true;
301
- case 'rsa-sha256':
302
+ case "rsa-sha256":
302
303
  return !!config.customConfig?.publicKey;
303
- case 'ed25519':
304
+ case "ed25519":
304
305
  return !!config.customConfig?.publicKey || !!config.customConfig?.jwksUrl;
305
- case 'custom':
306
+ case "custom":
306
307
  return !!config.customConfig;
307
308
  default:
308
309
  return false;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@hookflo/tern",
3
- "version": "2.2.4",
3
+ "version": "2.2.5",
4
4
  "description": "A robust, scalable webhook verification framework supporting multiple platforms and signature algorithms",
5
5
  "main": "dist/index.js",
6
6
  "types": "dist/index.d.ts",