@t4h.framework/webhook 0.0.0-experimental-20260908180423 → 0.0.0-experimental-20260909045544
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/.ai/skills/framework-webhook/SKILL.md +16 -7
- package/CHANGELOG.md +76 -6
- package/README.md +6 -3
- package/dist/activities/WebhookActivity.d.ts.map +1 -1
- package/dist/activities/WebhookActivity.js +3 -5
- package/dist/activities/WebhookActivity.js.map +1 -1
- package/dist/models/WebhookRequest.d.ts +2 -3
- package/dist/models/WebhookRequest.d.ts.map +1 -1
- package/dist/models/WebhookRequest.js.map +1 -1
- package/dist/webhook.d.ts +0 -4
- package/dist/webhook.d.ts.map +1 -1
- package/dist/webhook.js +0 -4
- package/dist/webhook.js.map +1 -1
- package/package.json +5 -7
- package/dist/tools/callback-token.d.ts +0 -3
- package/dist/tools/callback-token.d.ts.map +0 -1
- package/dist/tools/callback-token.js +0 -14
- package/dist/tools/callback-token.js.map +0 -1
- package/dist/tools/get-header.d.ts +0 -4
- package/dist/tools/get-header.d.ts.map +0 -1
- package/dist/tools/get-header.js +0 -21
- package/dist/tools/get-header.js.map +0 -1
- package/dist/tools/parse-callback-body.d.ts +0 -3
- package/dist/tools/parse-callback-body.d.ts.map +0 -1
- package/dist/tools/parse-callback-body.js +0 -25
- package/dist/tools/parse-callback-body.js.map +0 -1
- package/dist/tools/timing-safe-equal-string.d.ts +0 -2
- package/dist/tools/timing-safe-equal-string.d.ts.map +0 -1
- package/dist/tools/timing-safe-equal-string.js +0 -9
- package/dist/tools/timing-safe-equal-string.js.map +0 -1
- package/dist/tools/verify-callback-auth.d.ts +0 -9
- package/dist/tools/verify-callback-auth.d.ts.map +0 -1
- package/dist/tools/verify-callback-auth.js +0 -89
- package/dist/tools/verify-callback-auth.js.map +0 -1
|
@@ -76,20 +76,29 @@ and returns `pending({ payload: dispatch, schema, auth, timeoutAt })`.
|
|
|
76
76
|
|
|
77
77
|
## Host contract
|
|
78
78
|
|
|
79
|
+
The callbacks route belongs to the core and serves every async activity; the
|
|
80
|
+
helpers below live in the `AsyncActivityCallback` namespace of `@t4h.framework/core`, not
|
|
81
|
+
in this package.
|
|
82
|
+
|
|
79
83
|
1. `GetActivityCallbackUrlClaim.getActivityCallbackUrl()`: absolute `http(s)`
|
|
80
84
|
URL of the current activity's callbacks route with
|
|
81
|
-
`?token=
|
|
82
|
-
2. Callback route: `
|
|
85
|
+
`?token=AsyncActivityCallback.deriveToken(secret, activityId)`. Nothing stored.
|
|
86
|
+
2. Callback route: `AsyncActivityCallback.isTokenValid` **first** (404 if the token was
|
|
83
87
|
never minted) → activity/pending lookup (503 + `Retry-After` if the pending
|
|
84
88
|
is not visible yet: the partner called back before the tick committed) →
|
|
85
|
-
`
|
|
86
|
-
(401) → advance with `
|
|
87
|
-
`{ method, headers: flattenHeaders(headers) }`. 410 when no longer pending,
|
|
89
|
+
`AsyncActivityCallback.authorize(pending.auth, { method, headers, rawBody }, authorizers)`
|
|
90
|
+
(401) → advance with `AsyncActivityCallback.parseBody(contentType, rawBody)` and
|
|
91
|
+
`{ method, headers: AsyncActivityCallback.flattenHeaders(headers) }`. 410 when no longer pending,
|
|
88
92
|
202 otherwise (repeats included).
|
|
89
|
-
3.
|
|
93
|
+
3. `authorizers` is `{ hmac, jwt }` with the default exports of
|
|
94
|
+
`@t4h.framework/hmac/callback` and `@t4h.framework/jwks/callback`; `basic`,
|
|
95
|
+
`header` and `bearer` are built into the core. A declared type without a
|
|
96
|
+
authorizer throws `AsyncActivityCallbackAuthorizerMissingException`.
|
|
97
|
+
4. Verification needs the **raw body**; parse JSON only after it.
|
|
90
98
|
|
|
91
99
|
The dev server implements this in `packages/dev` (`DevGetActivityCallbackUrlClaim`,
|
|
92
|
-
`CallbackTokenService`, `
|
|
100
|
+
`CallbackTokenService`, `CallbackAuthorizersService`,
|
|
101
|
+
`CreateWorkflowRunAsyncActivityPendingCallback`, route
|
|
93
102
|
`POST /projects/:project/workflows/:workflow/runs/:run/activities/:activity/callbacks`).
|
|
94
103
|
|
|
95
104
|
## Testing
|
package/CHANGELOG.md
CHANGED
|
@@ -1,14 +1,84 @@
|
|
|
1
1
|
# @t4h.framework/webhook
|
|
2
2
|
|
|
3
|
-
## 0.0.0-experimental-
|
|
3
|
+
## 0.0.0-experimental-20260909045544
|
|
4
4
|
|
|
5
5
|
### Patch Changes
|
|
6
6
|
|
|
7
|
-
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
7
|
+
- [#170](https://github.com/tech4humans-brasil/framework/pull/170) [`cb4a5df`](https://github.com/tech4humans-brasil/framework/commit/cb4a5df7b04d6c942abb6ac96be5ffab94243172) Thanks [@gusteycamargo](https://github.com/gusteycamargo)! - Adds the `jwks` callback auth: a detached signature over the callback body,
|
|
8
|
+
verified with the public key the `kid` resolves to at a JWKS URL — the way Amber
|
|
9
|
+
signs its webhooks.
|
|
10
|
+
|
|
11
|
+
**core**: `AsyncActivityCallbackAuthJwks` joins `AsyncActivityCallbackAuth`
|
|
12
|
+
(`jwksUri`, `header`, `kid`/`kidHeader`, `algorithm`/`algorithmHeader`,
|
|
13
|
+
`signatureFormat`/`signatureFormatHeader`, `timestampHeader`,
|
|
14
|
+
`toleranceInSeconds`, `signedPayload` as a template over `{timestamp}` and
|
|
15
|
+
`{body}`).
|
|
16
|
+
|
|
17
|
+
**jwks**: `jwksCallback` (default of `@t4h.framework/jwks/callback`) now serves
|
|
18
|
+
both `jwt` and `jwks`. Hosts pass it as `{ jwt: jwksCallback, jwks: jwksCallback }`.
|
|
19
|
+
|
|
20
|
+
**dev**: loads `@t4h.framework/jwks` for the `jwks` type as well.
|
|
21
|
+
|
|
22
|
+
**webhook**: documents the new type.
|
|
23
|
+
|
|
24
|
+
- Updated dependencies [[`cb4a5df`](https://github.com/tech4humans-brasil/framework/commit/cb4a5df7b04d6c942abb6ac96be5ffab94243172)]:
|
|
25
|
+
- @t4h.framework/core@0.0.0-experimental-20260909045544
|
|
26
|
+
- @t4h.framework/http@0.0.0-experimental-20260909045544
|
|
27
|
+
|
|
28
|
+
## 0.2.0
|
|
29
|
+
|
|
30
|
+
### Minor Changes
|
|
31
|
+
|
|
32
|
+
- [#167](https://github.com/tech4humans-brasil/framework/pull/167) [`1b1509f`](https://github.com/tech4humans-brasil/framework/commit/1b1509f9b6d2554dfab1f7633c3d022249e4fa01) Thanks [@gusteycamargo](https://github.com/gusteycamargo)! - Moves the callbacks route helpers from `@t4h.framework/webhook` to
|
|
33
|
+
`@t4h.framework/core`. The route advances any pending async activity, not only
|
|
34
|
+
`webhook()`, and the core already owned its contract (`AsyncActivityCallbackAuth`,
|
|
35
|
+
`GetActivityCallbackUrlClaim`, `AsyncActivityAdvanceContext`).
|
|
36
|
+
|
|
37
|
+
**core**: new `AsyncActivityCallback` namespace with `deriveToken`, `isTokenValid`,
|
|
38
|
+
`parseBody`, `getHeader`, `getBearerToken`, `flattenHeaders`, `authorize` and
|
|
39
|
+
the types `AsyncActivityCallback.Delivery`, `AsyncActivityCallback.Headers`, `AsyncActivityCallback.Json`,
|
|
40
|
+
`AsyncActivityCallback.AuthType`, `AsyncActivityCallback.Authorizer`, `AsyncActivityCallback.Authorizers`.
|
|
41
|
+
`AsyncActivityCallback.authorize(auth, request, authorizers?)` ships `basic`, `header` and
|
|
42
|
+
`bearer`; `hmac` and `jwt` are authorizers the host passes in, so the core does not
|
|
43
|
+
depend on `@t4h.framework/hmac` or `@t4h.framework/jwks`. A declared type without
|
|
44
|
+
a authorizer throws `AsyncActivityCallbackAuthorizerMissingException`; an unknown type throws
|
|
45
|
+
`AsyncActivityCallbackAuthUnsupportedException`.
|
|
46
|
+
|
|
47
|
+
**hmac**: new `@t4h.framework/hmac/callback` entry whose default export is the
|
|
48
|
+
`hmac` callback authorizer, `hmacCallback`.
|
|
49
|
+
|
|
50
|
+
**jwks**: new `@t4h.framework/jwks/callback` entry whose default export is the
|
|
51
|
+
`jwt` callback authorizer, `jwksCallback`.
|
|
52
|
+
|
|
53
|
+
**webhook**: no longer exports `deriveCallbackToken`, `isCallbackTokenValid`,
|
|
54
|
+
`verifyCallbackAuth`, `parseCallbackBody`, `getHeader`, `flattenHeaders` nor
|
|
55
|
+
`CallbackRequest`/`CallbackHeaders`, and no longer depends on `hmac` and `jwks`;
|
|
56
|
+
`WebhookJson` is now an alias of the core `AsyncActivityCallback.Json`. Hosts import the
|
|
57
|
+
helpers from the core `AsyncActivityCallback` namespace and the authorizers from the two entries.
|
|
58
|
+
|
|
59
|
+
**dev**: `@t4h.framework/webhook` becomes an optional peer like the other
|
|
60
|
+
integrations. Only `@t4h.framework/core` is required again, which fixes
|
|
61
|
+
`ERR_MODULE_NOT_FOUND: Cannot find package '@t4h.framework/webhook'` on
|
|
62
|
+
projects that never call `webhook()`. `hmac` and `jwt` callback authorizers are
|
|
63
|
+
loaded from the project when `@t4h.framework/hmac` / `@t4h.framework/jwks` are
|
|
64
|
+
installed; a callback whose declared `auth` needs a missing package answers 500
|
|
65
|
+
naming the package to install.
|
|
66
|
+
|
|
67
|
+
### Patch Changes
|
|
68
|
+
|
|
69
|
+
- Updated dependencies [[`1b1509f`](https://github.com/tech4humans-brasil/framework/commit/1b1509f9b6d2554dfab1f7633c3d022249e4fa01), [`1b1509f`](https://github.com/tech4humans-brasil/framework/commit/1b1509f9b6d2554dfab1f7633c3d022249e4fa01)]:
|
|
70
|
+
- @t4h.framework/core@0.13.0
|
|
71
|
+
- @t4h.framework/http@0.6.2
|
|
72
|
+
|
|
73
|
+
## 0.1.1
|
|
74
|
+
|
|
75
|
+
### Patch Changes
|
|
76
|
+
|
|
77
|
+
- Updated dependencies [[`72e08ff`](https://github.com/tech4humans-brasil/framework/commit/72e08ff86e0ce735ef73ccdf33b0dc01cdb8b6f5)]:
|
|
78
|
+
- @t4h.framework/core@0.12.0
|
|
79
|
+
- @t4h.framework/hmac@0.2.2
|
|
80
|
+
- @t4h.framework/http@0.6.1
|
|
81
|
+
- @t4h.framework/jwks@0.5.2
|
|
12
82
|
|
|
13
83
|
## 0.1.0
|
|
14
84
|
|
package/README.md
CHANGED
|
@@ -32,11 +32,14 @@ arrives before `timeoutInMs` throws `WebhookTimeoutError`, so the workflow
|
|
|
32
32
|
never sees a callback that did not happen.
|
|
33
33
|
|
|
34
34
|
Supported `auth`: `hmac` (GitHub, Shopify, Slack style), `basic`, `header`,
|
|
35
|
-
`bearer` and `
|
|
35
|
+
`bearer`, `jwt` (bearer JWT verified with a JWKS) and `jwks` (detached
|
|
36
|
+
signature verified with a JWKS key).
|
|
36
37
|
|
|
37
38
|
Pass `{ wait: false }` as the second argument to send the request without
|
|
38
39
|
suspending; you get a handle and call `handle.wait()` later.
|
|
39
40
|
|
|
40
41
|
Hosts implement the core `GetActivityCallbackUrlClaim` and the callbacks
|
|
41
|
-
route
|
|
42
|
-
|
|
42
|
+
route, both defined by `@t4h.framework/core` and shared by every async
|
|
43
|
+
activity; the outbound request goes through `HttpClientRequestClaim` from
|
|
44
|
+
`@t4h.framework/http`. Peer dependencies: `@t4h.framework/core` and
|
|
45
|
+
`@t4h.framework/http`.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"WebhookActivity.d.ts","sourceRoot":"","sources":["../../src/activities/WebhookActivity.ts"],"names":[],"mappings":"AAEA,OAAO,EACL,aAAa,
|
|
1
|
+
{"version":3,"file":"WebhookActivity.d.ts","sourceRoot":"","sources":["../../src/activities/WebhookActivity.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,11 +1,9 @@
|
|
|
1
1
|
import { text } from 'node:stream/consumers';
|
|
2
|
-
import { AsyncActivity, Claim, GetActivityCallbackUrlClaim, History, } from '@t4h.framework/core';
|
|
2
|
+
import { AsyncActivity, AsyncActivityCallback, Claim, GetActivityCallbackUrlClaim, History, } from '@t4h.framework/core';
|
|
3
3
|
import { HttpClientRequestClaim } from '@t4h.framework/http';
|
|
4
4
|
import { WebhookCallbackUrlError } from '../errors/WebhookCallbackUrlError.js';
|
|
5
5
|
import { toWebhookRejectedError } from '../errors/WebhookRejectedError.js';
|
|
6
6
|
import { buildWebhookDispatch } from '../tools/build-webhook-dispatch.js';
|
|
7
|
-
import { flattenHeaders } from '../tools/get-header.js';
|
|
8
|
-
import { parseCallbackBody } from '../tools/parse-callback-body.js';
|
|
9
7
|
const WEBHOOK_ACTIVITY_CLAIMS = Symbol('webhook-activity-claims');
|
|
10
8
|
export const WEBHOOK_DISPATCH_TIMEOUT_IN_MS = 60_000;
|
|
11
9
|
function toCallbackUrl(callbackUrl) {
|
|
@@ -65,7 +63,7 @@ export class WebhookActivity extends AsyncActivity {
|
|
|
65
63
|
retry: true,
|
|
66
64
|
timeoutInMs: WEBHOOK_DISPATCH_TIMEOUT_IN_MS,
|
|
67
65
|
});
|
|
68
|
-
const headers = flattenHeaders(response.headers);
|
|
66
|
+
const headers = AsyncActivityCallback.flattenHeaders(response.headers);
|
|
69
67
|
const rawBody = await text(response.body);
|
|
70
68
|
if (response.status >= 400)
|
|
71
69
|
return {
|
|
@@ -76,7 +74,7 @@ export class WebhookActivity extends AsyncActivity {
|
|
|
76
74
|
return {
|
|
77
75
|
status: response.status,
|
|
78
76
|
headers,
|
|
79
|
-
body:
|
|
77
|
+
body: AsyncActivityCallback.parseBody(headers['content-type'], rawBody),
|
|
80
78
|
};
|
|
81
79
|
}
|
|
82
80
|
catch (error) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"WebhookActivity.js","sourceRoot":"","sources":["../../src/activities/WebhookActivity.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,uBAAuB,CAAA;AAE5C,OAAO,EACL,aAAa,EACb,KAAK,EACL,2BAA2B,EAC3B,OAAO,GAMR,MAAM,qBAAqB,CAAA;AAC5B,OAAO,EAAE,sBAAsB,EAAE,MAAM,qBAAqB,CAAA;AAG5D,OAAO,EAAE,uBAAuB,EAAE,MAAM,sCAAsC,CAAA;AAC9E,OAAO,EAAE,sBAAsB,EAAE,MAAM,mCAAmC,CAAA;AAQ1E,OAAO,EAAE,oBAAoB,EAAE,MAAM,oCAAoC,CAAA;
|
|
1
|
+
{"version":3,"file":"WebhookActivity.js","sourceRoot":"","sources":["../../src/activities/WebhookActivity.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,6 +1,5 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
};
|
|
1
|
+
import type { AsyncActivityCallback } from '@t4h.framework/core';
|
|
2
|
+
export type WebhookJson = AsyncActivityCallback.Json;
|
|
4
3
|
export type WebhookRequestMethod = 'GET' | 'POST' | 'PUT' | 'PATCH' | 'DELETE';
|
|
5
4
|
export type WebhookRequestBody = {
|
|
6
5
|
json: WebhookJson;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"WebhookRequest.d.ts","sourceRoot":"","sources":["../../src/models/WebhookRequest.ts"],"names":[],"mappings":"AAAA,
|
|
1
|
+
{"version":3,"file":"WebhookRequest.d.ts","sourceRoot":"","sources":["../../src/models/WebhookRequest.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,qBAAqB,CAAA;AAEhE,MAAM,MAAM,WAAW,GAAG,qBAAqB,CAAC,IAAI,CAAA;AAEpD,MAAM,MAAM,oBAAoB,GAAG,KAAK,GAAG,MAAM,GAAG,KAAK,GAAG,OAAO,GAAG,QAAQ,CAAA;AAE9E,MAAM,MAAM,kBAAkB,GAC1B;IAAE,IAAI,EAAE,WAAW,CAAC;IAAC,IAAI,CAAC,EAAE,KAAK,CAAA;CAAE,GACnC;IAAE,IAAI,CAAC,EAAE,KAAK,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,CAAA;AAElC;;;;;GAKG;AACH,MAAM,MAAM,cAAc,GAAG;IAC3B,GAAG,EAAE,MAAM,CAAA;IACX,MAAM,CAAC,EAAE,oBAAoB,CAAA;IAC7B,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;IAChC,IAAI,CAAC,EAAE,kBAAkB,CAAA;CAC1B,CAAA;AAED,eAAO,MAAM,gCAAgC,oBAAoB,CAAA"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"WebhookRequest.js","sourceRoot":"","sources":["../../src/models/WebhookRequest.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"WebhookRequest.js","sourceRoot":"","sources":["../../src/models/WebhookRequest.ts"],"names":[],"mappings":"AAuBA,MAAM,CAAC,MAAM,gCAAgC,GAAG,iBAAiB,CAAA"}
|
package/dist/webhook.d.ts
CHANGED
|
@@ -4,8 +4,4 @@ export * from './errors/WebhookRejectedError.js';
|
|
|
4
4
|
export * from './models/WebhookCallback.js';
|
|
5
5
|
export * from './models/WebhookRequest.js';
|
|
6
6
|
export * from './tools/build-webhook-dispatch.js';
|
|
7
|
-
export * from './tools/callback-token.js';
|
|
8
|
-
export * from './tools/get-header.js';
|
|
9
|
-
export * from './tools/parse-callback-body.js';
|
|
10
|
-
export * from './tools/verify-callback-auth.js';
|
|
11
7
|
//# sourceMappingURL=webhook.d.ts.map
|
package/dist/webhook.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"webhook.d.ts","sourceRoot":"","sources":["../src/webhook.ts"],"names":[],"mappings":"AAAA,cAAc,iCAAiC,CAAA;AAC/C,cAAc,qCAAqC,CAAA;AACnD,cAAc,kCAAkC,CAAA;AAChD,cAAc,6BAA6B,CAAA;AAC3C,cAAc,4BAA4B,CAAA;AAC1C,cAAc,mCAAmC,CAAA
|
|
1
|
+
{"version":3,"file":"webhook.d.ts","sourceRoot":"","sources":["../src/webhook.ts"],"names":[],"mappings":"AAAA,cAAc,iCAAiC,CAAA;AAC/C,cAAc,qCAAqC,CAAA;AACnD,cAAc,kCAAkC,CAAA;AAChD,cAAc,6BAA6B,CAAA;AAC3C,cAAc,4BAA4B,CAAA;AAC1C,cAAc,mCAAmC,CAAA"}
|
package/dist/webhook.js
CHANGED
|
@@ -4,8 +4,4 @@ export * from './errors/WebhookRejectedError.js';
|
|
|
4
4
|
export * from './models/WebhookCallback.js';
|
|
5
5
|
export * from './models/WebhookRequest.js';
|
|
6
6
|
export * from './tools/build-webhook-dispatch.js';
|
|
7
|
-
export * from './tools/callback-token.js';
|
|
8
|
-
export * from './tools/get-header.js';
|
|
9
|
-
export * from './tools/parse-callback-body.js';
|
|
10
|
-
export * from './tools/verify-callback-auth.js';
|
|
11
7
|
//# sourceMappingURL=webhook.js.map
|
package/dist/webhook.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"webhook.js","sourceRoot":"","sources":["../src/webhook.ts"],"names":[],"mappings":"AAAA,cAAc,iCAAiC,CAAA;AAC/C,cAAc,qCAAqC,CAAA;AACnD,cAAc,kCAAkC,CAAA;AAChD,cAAc,6BAA6B,CAAA;AAC3C,cAAc,4BAA4B,CAAA;AAC1C,cAAc,mCAAmC,CAAA
|
|
1
|
+
{"version":3,"file":"webhook.js","sourceRoot":"","sources":["../src/webhook.ts"],"names":[],"mappings":"AAAA,cAAc,iCAAiC,CAAA;AAC/C,cAAc,qCAAqC,CAAA;AACnD,cAAc,kCAAkC,CAAA;AAChD,cAAc,6BAA6B,CAAA;AAC3C,cAAc,4BAA4B,CAAA;AAC1C,cAAc,mCAAmC,CAAA"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@t4h.framework/webhook",
|
|
3
|
-
"version": "0.0.0-experimental-
|
|
3
|
+
"version": "0.0.0-experimental-20260909045544",
|
|
4
4
|
"description": "Webhook module for the T4H Framework",
|
|
5
5
|
"homepage": "https://github.com/tech4humans-brasil/framework/tree/main/packages/webhook",
|
|
6
6
|
"bugs": "https://github.com/tech4humans-brasil/framework/issues",
|
|
@@ -31,19 +31,17 @@
|
|
|
31
31
|
"test:watch": "vitest"
|
|
32
32
|
},
|
|
33
33
|
"dependencies": {
|
|
34
|
-
"@t4h.framework/hmac": "^0.0.0-experimental-20260908180423",
|
|
35
|
-
"@t4h.framework/jwks": "^0.0.0-experimental-20260908180423",
|
|
36
34
|
"typebox": "^1.1.6"
|
|
37
35
|
},
|
|
38
36
|
"devDependencies": {
|
|
39
|
-
"@t4h.framework/core": "^0.0.0-experimental-
|
|
40
|
-
"@t4h.framework/http": "^0.0.0-experimental-
|
|
37
|
+
"@t4h.framework/core": "^0.0.0-experimental-20260909045544",
|
|
38
|
+
"@t4h.framework/http": "^0.0.0-experimental-20260909045544",
|
|
41
39
|
"typescript": "^5.9.3",
|
|
42
40
|
"vitest": "^4.0.18"
|
|
43
41
|
},
|
|
44
42
|
"peerDependencies": {
|
|
45
|
-
"@t4h.framework/core": "^0.0.0-experimental-
|
|
46
|
-
"@t4h.framework/http": "^0.0.0-experimental-
|
|
43
|
+
"@t4h.framework/core": "^0.0.0-experimental-20260909045544",
|
|
44
|
+
"@t4h.framework/http": "^0.0.0-experimental-20260909045544"
|
|
47
45
|
},
|
|
48
46
|
"packageManager": "yarn@4.12.0",
|
|
49
47
|
"engines": {
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"callback-token.d.ts","sourceRoot":"","sources":["../../src/tools/callback-token.ts"],"names":[],"mappings":"AAEA,wBAAgB,mBAAmB,CAAC,MAAM,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,UAKrE;AAED,wBAAgB,oBAAoB,CAClC,MAAM,EAAE,MAAM,EACd,UAAU,EAAE,MAAM,EAClB,KAAK,EAAE,MAAM,WASd"}
|
|
@@ -1,14 +0,0 @@
|
|
|
1
|
-
import crypto from 'node:crypto';
|
|
2
|
-
export function deriveCallbackToken(secret, activityId) {
|
|
3
|
-
return crypto
|
|
4
|
-
.createHmac('sha256', secret)
|
|
5
|
-
.update(activityId)
|
|
6
|
-
.digest('base64url');
|
|
7
|
-
}
|
|
8
|
-
export function isCallbackTokenValid(secret, activityId, token) {
|
|
9
|
-
const expected = Buffer.from(deriveCallbackToken(secret, activityId));
|
|
10
|
-
const candidate = Buffer.from(token);
|
|
11
|
-
return (expected.length === candidate.length &&
|
|
12
|
-
crypto.timingSafeEqual(expected, candidate));
|
|
13
|
-
}
|
|
14
|
-
//# sourceMappingURL=callback-token.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"callback-token.js","sourceRoot":"","sources":["../../src/tools/callback-token.ts"],"names":[],"mappings":"AAAA,OAAO,MAAM,MAAM,aAAa,CAAA;AAEhC,MAAM,UAAU,mBAAmB,CAAC,MAAc,EAAE,UAAkB;IACpE,OAAO,MAAM;SACV,UAAU,CAAC,QAAQ,EAAE,MAAM,CAAC;SAC5B,MAAM,CAAC,UAAU,CAAC;SAClB,MAAM,CAAC,WAAW,CAAC,CAAA;AACxB,CAAC;AAED,MAAM,UAAU,oBAAoB,CAClC,MAAc,EACd,UAAkB,EAClB,KAAa;IAEb,MAAM,QAAQ,GAAG,MAAM,CAAC,IAAI,CAAC,mBAAmB,CAAC,MAAM,EAAE,UAAU,CAAC,CAAC,CAAA;IACrE,MAAM,SAAS,GAAG,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAA;IAEpC,OAAO,CACL,QAAQ,CAAC,MAAM,KAAK,SAAS,CAAC,MAAM;QACpC,MAAM,CAAC,eAAe,CAAC,QAAQ,EAAE,SAAS,CAAC,CAC5C,CAAA;AACH,CAAC"}
|
|
@@ -1,4 +0,0 @@
|
|
|
1
|
-
export type CallbackHeaders = Record<string, string | string[] | undefined>;
|
|
2
|
-
export declare function getHeader(headers: CallbackHeaders, name: string): string | undefined;
|
|
3
|
-
export declare function flattenHeaders(headers: CallbackHeaders): Record<string, string>;
|
|
4
|
-
//# sourceMappingURL=get-header.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"get-header.d.ts","sourceRoot":"","sources":["../../src/tools/get-header.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,eAAe,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,EAAE,GAAG,SAAS,CAAC,CAAA;AAE3E,wBAAgB,SAAS,CACvB,OAAO,EAAE,eAAe,EACxB,IAAI,EAAE,MAAM,GACX,MAAM,GAAG,SAAS,CAYpB;AAED,wBAAgB,cAAc,CAC5B,OAAO,EAAE,eAAe,GACvB,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAUxB"}
|
package/dist/tools/get-header.js
DELETED
|
@@ -1,21 +0,0 @@
|
|
|
1
|
-
export function getHeader(headers, name) {
|
|
2
|
-
const wanted = name.toLowerCase();
|
|
3
|
-
for (const [key, value] of Object.entries(headers)) {
|
|
4
|
-
if (key.toLowerCase() !== wanted)
|
|
5
|
-
continue;
|
|
6
|
-
if (Array.isArray(value))
|
|
7
|
-
return value[0];
|
|
8
|
-
return value;
|
|
9
|
-
}
|
|
10
|
-
return undefined;
|
|
11
|
-
}
|
|
12
|
-
export function flattenHeaders(headers) {
|
|
13
|
-
const result = {};
|
|
14
|
-
for (const [name, value] of Object.entries(headers)) {
|
|
15
|
-
if (value === undefined)
|
|
16
|
-
continue;
|
|
17
|
-
result[name.toLowerCase()] = Array.isArray(value) ? value.join(', ') : value;
|
|
18
|
-
}
|
|
19
|
-
return result;
|
|
20
|
-
}
|
|
21
|
-
//# sourceMappingURL=get-header.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"get-header.js","sourceRoot":"","sources":["../../src/tools/get-header.ts"],"names":[],"mappings":"AAEA,MAAM,UAAU,SAAS,CACvB,OAAwB,EACxB,IAAY;IAEZ,MAAM,MAAM,GAAG,IAAI,CAAC,WAAW,EAAE,CAAA;IAEjC,KAAK,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC,EAAE,CAAC;QACnD,IAAI,GAAG,CAAC,WAAW,EAAE,KAAK,MAAM;YAAE,SAAQ;QAE1C,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC;YAAE,OAAO,KAAK,CAAC,CAAC,CAAC,CAAA;QAEzC,OAAO,KAAK,CAAA;IACd,CAAC;IAED,OAAO,SAAS,CAAA;AAClB,CAAC;AAED,MAAM,UAAU,cAAc,CAC5B,OAAwB;IAExB,MAAM,MAAM,GAA2B,EAAE,CAAA;IAEzC,KAAK,MAAM,CAAC,IAAI,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC,EAAE,CAAC;QACpD,IAAI,KAAK,KAAK,SAAS;YAAE,SAAQ;QAEjC,MAAM,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC,GAAG,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,KAAK,CAAA;IAC9E,CAAC;IAED,OAAO,MAAM,CAAA;AACf,CAAC"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"parse-callback-body.d.ts","sourceRoot":"","sources":["../../src/tools/parse-callback-body.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,6BAA6B,CAAA;AAM9D,wBAAgB,iBAAiB,CAC/B,WAAW,EAAE,MAAM,GAAG,SAAS,EAC/B,OAAO,EAAE,MAAM,GACd,WAAW,GAAG,SAAS,CA2BzB"}
|
|
@@ -1,25 +0,0 @@
|
|
|
1
|
-
const JSON_CONTENT_TYPE = /^application\/([\w.-]+\+)?json$/i;
|
|
2
|
-
const FORM_CONTENT_TYPE = 'application/x-www-form-urlencoded';
|
|
3
|
-
export function parseCallbackBody(contentType, rawBody) {
|
|
4
|
-
if (!rawBody.length)
|
|
5
|
-
return undefined;
|
|
6
|
-
const type = contentType?.split(';')[0]?.trim().toLowerCase() ?? '';
|
|
7
|
-
if (JSON_CONTENT_TYPE.test(type))
|
|
8
|
-
try {
|
|
9
|
-
return JSON.parse(rawBody);
|
|
10
|
-
}
|
|
11
|
-
catch {
|
|
12
|
-
return rawBody;
|
|
13
|
-
}
|
|
14
|
-
if (type === FORM_CONTENT_TYPE) {
|
|
15
|
-
const params = new URLSearchParams(rawBody);
|
|
16
|
-
const result = {};
|
|
17
|
-
for (const key of new Set(params.keys())) {
|
|
18
|
-
const values = params.getAll(key);
|
|
19
|
-
result[key] = values.length === 1 ? values[0] : values;
|
|
20
|
-
}
|
|
21
|
-
return result;
|
|
22
|
-
}
|
|
23
|
-
return rawBody;
|
|
24
|
-
}
|
|
25
|
-
//# sourceMappingURL=parse-callback-body.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"parse-callback-body.js","sourceRoot":"","sources":["../../src/tools/parse-callback-body.ts"],"names":[],"mappings":"AAEA,MAAM,iBAAiB,GAAG,kCAAkC,CAAA;AAE5D,MAAM,iBAAiB,GAAG,mCAAmC,CAAA;AAE7D,MAAM,UAAU,iBAAiB,CAC/B,WAA+B,EAC/B,OAAe;IAEf,IAAI,CAAC,OAAO,CAAC,MAAM;QAAE,OAAO,SAAS,CAAA;IAErC,MAAM,IAAI,GAAG,WAAW,EAAE,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,CAAC,WAAW,EAAE,IAAI,EAAE,CAAA;IAEnE,IAAI,iBAAiB,CAAC,IAAI,CAAC,IAAI,CAAC;QAC9B,IAAI,CAAC;YACH,OAAO,IAAI,CAAC,KAAK,CAAC,OAAO,CAAgB,CAAA;QAC3C,CAAC;QAAC,MAAM,CAAC;YACP,OAAO,OAAO,CAAA;QAChB,CAAC;IAEH,IAAI,IAAI,KAAK,iBAAiB,EAAE,CAAC;QAC/B,MAAM,MAAM,GAAG,IAAI,eAAe,CAAC,OAAO,CAAC,CAAA;QAE3C,MAAM,MAAM,GAAgC,EAAE,CAAA;QAE9C,KAAK,MAAM,GAAG,IAAI,IAAI,GAAG,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC,EAAE,CAAC;YACzC,MAAM,MAAM,GAAG,MAAM,CAAC,MAAM,CAAC,GAAG,CAAC,CAAA;YAEjC,MAAM,CAAC,GAAG,CAAC,GAAG,MAAM,CAAC,MAAM,KAAK,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAE,CAAC,CAAC,CAAC,MAAM,CAAA;QACzD,CAAC;QAED,OAAO,MAAM,CAAA;IACf,CAAC;IAED,OAAO,OAAO,CAAA;AAChB,CAAC"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"timing-safe-equal-string.d.ts","sourceRoot":"","sources":["../../src/tools/timing-safe-equal-string.ts"],"names":[],"mappings":"AAEA,wBAAgB,qBAAqB,CAAC,QAAQ,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,WAOxE"}
|
|
@@ -1,9 +0,0 @@
|
|
|
1
|
-
import crypto from 'node:crypto';
|
|
2
|
-
export function timingSafeEqualString(expected, candidate) {
|
|
3
|
-
const a = Buffer.from(expected, 'utf8');
|
|
4
|
-
const b = Buffer.from(candidate, 'utf8');
|
|
5
|
-
if (a.length !== b.length)
|
|
6
|
-
return false;
|
|
7
|
-
return crypto.timingSafeEqual(a, b);
|
|
8
|
-
}
|
|
9
|
-
//# sourceMappingURL=timing-safe-equal-string.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"timing-safe-equal-string.js","sourceRoot":"","sources":["../../src/tools/timing-safe-equal-string.ts"],"names":[],"mappings":"AAAA,OAAO,MAAM,MAAM,aAAa,CAAA;AAEhC,MAAM,UAAU,qBAAqB,CAAC,QAAgB,EAAE,SAAiB;IACvE,MAAM,CAAC,GAAG,MAAM,CAAC,IAAI,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAA;IACvC,MAAM,CAAC,GAAG,MAAM,CAAC,IAAI,CAAC,SAAS,EAAE,MAAM,CAAC,CAAA;IAExC,IAAI,CAAC,CAAC,MAAM,KAAK,CAAC,CAAC,MAAM;QAAE,OAAO,KAAK,CAAA;IAEvC,OAAO,MAAM,CAAC,eAAe,CAAC,CAAC,EAAE,CAAC,CAAC,CAAA;AACrC,CAAC"}
|
|
@@ -1,9 +0,0 @@
|
|
|
1
|
-
import type { AsyncActivityCallbackAuth } from '@t4h.framework/core';
|
|
2
|
-
import { type CallbackHeaders } from './get-header.js';
|
|
3
|
-
export interface CallbackRequest {
|
|
4
|
-
method: string;
|
|
5
|
-
headers: CallbackHeaders;
|
|
6
|
-
rawBody: string;
|
|
7
|
-
}
|
|
8
|
-
export declare function verifyCallbackAuth(auth: AsyncActivityCallbackAuth | undefined, request: CallbackRequest): Promise<boolean>;
|
|
9
|
-
//# sourceMappingURL=verify-callback-auth.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"verify-callback-auth.d.ts","sourceRoot":"","sources":["../../src/tools/verify-callback-auth.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,yBAAyB,EAM1B,MAAM,qBAAqB,CAAA;AAI5B,OAAO,EAAa,KAAK,eAAe,EAAE,MAAM,iBAAiB,CAAA;AAGjE,MAAM,WAAW,eAAe;IAC9B,MAAM,EAAE,MAAM,CAAA;IACd,OAAO,EAAE,eAAe,CAAA;IACxB,OAAO,EAAE,MAAM,CAAA;CAChB;AAuGD,wBAAsB,kBAAkB,CACtC,IAAI,EAAE,yBAAyB,GAAG,SAAS,EAC3C,OAAO,EAAE,eAAe,GACvB,OAAO,CAAC,OAAO,CAAC,CAmBlB"}
|
|
@@ -1,89 +0,0 @@
|
|
|
1
|
-
import hmac from '@t4h.framework/hmac/authorize';
|
|
2
|
-
import jwks from '@t4h.framework/jwks/authorize';
|
|
3
|
-
import { getHeader } from './get-header.js';
|
|
4
|
-
import { timingSafeEqualString } from './timing-safe-equal-string.js';
|
|
5
|
-
const BEARER = /^Bearer\s+(.+)$/i;
|
|
6
|
-
function getBearerToken(headers, name = 'authorization') {
|
|
7
|
-
const value = getHeader(headers, name);
|
|
8
|
-
if (!value)
|
|
9
|
-
return undefined;
|
|
10
|
-
return BEARER.exec(value)?.[1]?.trim();
|
|
11
|
-
}
|
|
12
|
-
function verifyHmac(auth, request) {
|
|
13
|
-
const signature = getHeader(request.headers, auth.header);
|
|
14
|
-
if (!signature)
|
|
15
|
-
return false;
|
|
16
|
-
const timestamp = auth.timestampHeader
|
|
17
|
-
? getHeader(request.headers, auth.timestampHeader)
|
|
18
|
-
: undefined;
|
|
19
|
-
if (auth.timestampHeader && !timestamp)
|
|
20
|
-
return false;
|
|
21
|
-
const rawPayload = (auth.signedPayload ?? '{body}')
|
|
22
|
-
.replaceAll('{timestamp}', timestamp ?? '')
|
|
23
|
-
.replaceAll('{body}', request.rawBody);
|
|
24
|
-
return hmac({
|
|
25
|
-
secret: auth.secret,
|
|
26
|
-
signature,
|
|
27
|
-
rawPayload,
|
|
28
|
-
algorithm: auth.algorithm,
|
|
29
|
-
signatureFormat: auth.signatureFormat,
|
|
30
|
-
signaturePrefix: auth.signaturePrefix,
|
|
31
|
-
timestamp,
|
|
32
|
-
toleranceInSeconds: auth.toleranceInSeconds,
|
|
33
|
-
});
|
|
34
|
-
}
|
|
35
|
-
function verifyBasic(auth, request) {
|
|
36
|
-
const value = getHeader(request.headers, 'authorization');
|
|
37
|
-
if (!value)
|
|
38
|
-
return false;
|
|
39
|
-
const expected = `Basic ${Buffer.from(`${auth.username}:${auth.password}`).toString('base64')}`;
|
|
40
|
-
return timingSafeEqualString(expected, value);
|
|
41
|
-
}
|
|
42
|
-
function verifyHeader(auth, request) {
|
|
43
|
-
const value = getHeader(request.headers, auth.name);
|
|
44
|
-
if (!value)
|
|
45
|
-
return false;
|
|
46
|
-
return timingSafeEqualString(auth.value, value);
|
|
47
|
-
}
|
|
48
|
-
function verifyBearer(auth, request) {
|
|
49
|
-
const token = getBearerToken(request.headers);
|
|
50
|
-
if (!token)
|
|
51
|
-
return false;
|
|
52
|
-
return timingSafeEqualString(auth.token, token);
|
|
53
|
-
}
|
|
54
|
-
async function verifyJwt(auth, request) {
|
|
55
|
-
const token = getBearerToken(request.headers, auth.header);
|
|
56
|
-
if (!token)
|
|
57
|
-
return false;
|
|
58
|
-
try {
|
|
59
|
-
return await jwks({
|
|
60
|
-
url: auth.jwksUri,
|
|
61
|
-
signature: token,
|
|
62
|
-
rawPayload: '',
|
|
63
|
-
issuer: auth.issuer,
|
|
64
|
-
audience: auth.audience,
|
|
65
|
-
});
|
|
66
|
-
}
|
|
67
|
-
catch {
|
|
68
|
-
return false;
|
|
69
|
-
}
|
|
70
|
-
}
|
|
71
|
-
export async function verifyCallbackAuth(auth, request) {
|
|
72
|
-
if (!auth)
|
|
73
|
-
return true;
|
|
74
|
-
switch (auth.type) {
|
|
75
|
-
case 'hmac':
|
|
76
|
-
return verifyHmac(auth, request);
|
|
77
|
-
case 'basic':
|
|
78
|
-
return verifyBasic(auth, request);
|
|
79
|
-
case 'header':
|
|
80
|
-
return verifyHeader(auth, request);
|
|
81
|
-
case 'bearer':
|
|
82
|
-
return verifyBearer(auth, request);
|
|
83
|
-
case 'jwt':
|
|
84
|
-
return verifyJwt(auth, request);
|
|
85
|
-
default:
|
|
86
|
-
throw new TypeError(`Unsupported callback auth type: ${String(auth.type)}`);
|
|
87
|
-
}
|
|
88
|
-
}
|
|
89
|
-
//# sourceMappingURL=verify-callback-auth.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"verify-callback-auth.js","sourceRoot":"","sources":["../../src/tools/verify-callback-auth.ts"],"names":[],"mappings":"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"}
|