@voltro/plugin-webhooks 0.87.0 → 0.88.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.
- package/CHANGELOG.md +169 -6
- package/THIRD-PARTY-NOTICES.md +644 -48
- package/dist/autoDisable.js +1 -2
- package/dist/deferredEmit.js +1 -2
- package/dist/deliverWorkflow.js +1 -2
- package/dist/dsl.js +1 -2
- package/dist/encode.js +1 -2
- package/dist/errors.js +1 -2
- package/dist/eventAudience.js +1 -2
- package/dist/idempotency.js +1 -2
- package/dist/incoming.js +1 -2
- package/dist/mixin.js +1 -2
- package/dist/plugin.js +1 -2
- package/dist/providers/generic.js +1 -2
- package/dist/providers/github.js +1 -2
- package/dist/providers/slack.js +1 -2
- package/dist/providers/stripe.js +1 -2
- package/dist/rateLimit.js +1 -2
- package/dist/retry.js +1 -2
- package/dist/service.js +1 -2
- package/dist/signing.js +1 -2
- package/dist/standardWebhooks.js +1 -2
- package/package.json +8 -8
package/dist/autoDisable.js
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { and as e, eq as t } from "@voltro/database";
|
|
2
|
-
|
|
2
|
+
// src/autoDisable.ts
|
|
3
3
|
var n = "_voltro_webhook_targets", r = 32, i = async (e, n) => (await e.query({
|
|
4
4
|
table: "_voltro_webhook_targets",
|
|
5
5
|
predicate: t("id", n),
|
|
@@ -37,5 +37,4 @@ var n = "_voltro_webhook_targets", r = 32, i = async (e, n) => (await e.query({
|
|
|
37
37
|
}
|
|
38
38
|
throw Error(`webhook auto-disable: streak CAS contention on target ${a} exceeded ${r} attempts`);
|
|
39
39
|
};
|
|
40
|
-
//#endregion
|
|
41
40
|
export { n as TARGETS_TABLE, a as recordDeliveryOutcome };
|
package/dist/deferredEmit.js
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { defineOutboxHandler as e } from "@voltro/runtime";
|
|
2
|
-
|
|
2
|
+
// src/deferredEmit.ts
|
|
3
3
|
var t = "voltro.webhook.emit", n = (e) => typeof e.event == "string", r = (r) => e({
|
|
4
4
|
effect: t,
|
|
5
5
|
maxAttempts: 1,
|
|
@@ -13,5 +13,4 @@ var t = "voltro.webhook.emit", n = (e) => typeof e.event == "string", r = (r) =>
|
|
|
13
13
|
});
|
|
14
14
|
}
|
|
15
15
|
});
|
|
16
|
-
//#endregion
|
|
17
16
|
export { t as WEBHOOK_EMIT_EFFECT, r as makeDeferredEmitHandler };
|
package/dist/deliverWorkflow.js
CHANGED
|
@@ -9,7 +9,7 @@ import { eq as c } from "@voltro/database";
|
|
|
9
9
|
import { assertPublicUrl as l } from "@voltro/integration-http";
|
|
10
10
|
import { createLogger as u } from "@voltro/logger";
|
|
11
11
|
import { Activity as d, DurableClock as f, Workflow as p } from "effect/workflow";
|
|
12
|
-
|
|
12
|
+
// src/deliverWorkflow.ts
|
|
13
13
|
var m = s.Struct({
|
|
14
14
|
status: s.Number,
|
|
15
15
|
body: s.String,
|
|
@@ -346,5 +346,4 @@ var m = s.Struct({
|
|
|
346
346
|
};
|
|
347
347
|
});
|
|
348
348
|
};
|
|
349
|
-
//#endregion
|
|
350
349
|
export { y as DEFAULT_WEBHOOK_TIMEOUT_MS, x as buildDeliverWebhookExecute, v as deliverWebhookWorkflow };
|
package/dist/dsl.js
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
|
|
1
|
+
// src/dsl.ts
|
|
2
2
|
var e = (e) => ({
|
|
3
3
|
_tag: "incomingWebhook",
|
|
4
4
|
...e
|
|
@@ -10,5 +10,4 @@ var e = (e) => ({
|
|
|
10
10
|
let t = e._tag;
|
|
11
11
|
return t === "outgoingEvent" || t === "incomingWebhook" || t === "webhookProvider";
|
|
12
12
|
};
|
|
13
|
-
//#endregion
|
|
14
13
|
export { e as defineIncomingWebhook, t as defineWebhookProvider, n as isWebhookDescriptor };
|
package/dist/encode.js
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { WebhookPayloadUnrepresentable as e } from "./errors.js";
|
|
2
|
-
|
|
2
|
+
// src/encode.ts
|
|
3
3
|
var t = (t, r) => {
|
|
4
4
|
if (t === "json") return {
|
|
5
5
|
contentType: "application/json",
|
|
@@ -49,5 +49,4 @@ var t = (t, r) => {
|
|
|
49
49
|
default: return "'";
|
|
50
50
|
}
|
|
51
51
|
}), l = (e) => e === null ? "null" : Array.isArray(e) ? "array" : typeof e;
|
|
52
|
-
//#endregion
|
|
53
52
|
export { t as encodePayload };
|
package/dist/errors.js
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { Schema as e } from "effect";
|
|
2
|
-
|
|
2
|
+
// src/errors.ts
|
|
3
3
|
var t = class extends e.TaggedError()("WebhookSubscribeInvalid", {
|
|
4
4
|
field: e.String,
|
|
5
5
|
reason: e.String
|
|
@@ -18,5 +18,4 @@ var t = class extends e.TaggedError()("WebhookSubscribeInvalid", {
|
|
|
18
18
|
]),
|
|
19
19
|
reason: e.String
|
|
20
20
|
}) {};
|
|
21
|
-
//#endregion
|
|
22
21
|
export { n as WebhookDeliveryNotFound, a as WebhookPayloadInvalid, o as WebhookPayloadUnrepresentable, i as WebhookPayloadVersionInvalid, t as WebhookSubscribeInvalid, r as WebhookTargetNotFound };
|
package/dist/eventAudience.js
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
|
|
1
|
+
// src/eventAudience.ts
|
|
2
2
|
var e = (e) => e.webhook !== void 0, t = (e) => {
|
|
3
3
|
let t = e.webhook;
|
|
4
4
|
if (t !== void 0) return {
|
|
@@ -10,5 +10,4 @@ var e = (e) => e.webhook !== void 0, t = (e) => {
|
|
|
10
10
|
...t.rateLimit === void 0 ? {} : { globalRateLimit: t.rateLimit }
|
|
11
11
|
};
|
|
12
12
|
};
|
|
13
|
-
//#endregion
|
|
14
13
|
export { t as asOutgoingEvent, e as hasWebhookAudience };
|
package/dist/idempotency.js
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
|
|
1
|
+
// src/idempotency.ts
|
|
2
2
|
var e = class {
|
|
3
3
|
capacity;
|
|
4
4
|
cache = /* @__PURE__ */ new Map();
|
|
@@ -45,5 +45,4 @@ var e = class {
|
|
|
45
45
|
"7d": 6048e5,
|
|
46
46
|
"30d": 2592e6
|
|
47
47
|
}, i = (e) => e === void 0 ? r["7d"] : r[e] ?? r["7d"];
|
|
48
|
-
//#endregion
|
|
49
48
|
export { e as IdempotencyCache, n as getIdempotencyCache, i as parseTtl };
|
package/dist/incoming.js
CHANGED
|
@@ -3,7 +3,7 @@ import { getIdempotencyCache as t, parseTtl as n } from "./idempotency.js";
|
|
|
3
3
|
import { Schema as r } from "effect";
|
|
4
4
|
import { publishServerError as i } from "@voltro/protocol";
|
|
5
5
|
import { createLogger as a } from "@voltro/logger";
|
|
6
|
-
|
|
6
|
+
// src/incoming.ts
|
|
7
7
|
var o = (e, t) => ({
|
|
8
8
|
status: e,
|
|
9
9
|
contentType: "application/json; charset=utf-8",
|
|
@@ -201,5 +201,4 @@ var o = (e, t) => ({
|
|
|
201
201
|
}
|
|
202
202
|
}, { [s]: v });
|
|
203
203
|
}, f = (e) => `/webhooks/${e}`;
|
|
204
|
-
//#endregion
|
|
205
204
|
export { c as UnverifiedIncomingWebhook, s as WEBHOOK_VERIFICATION_PROPERTY, f as defaultIncomingPath, u as incomingWebhookVerification, d as mountIncomingWebhook };
|
package/dist/mixin.js
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { boolean as e, id as t, integer as n, json as r, registerRetention as i, retentionTtlMsFromEnv as a, table as o, text as s, timestamp as c } from "@voltro/database";
|
|
2
2
|
import { tenant as l } from "@voltro/plugin-multitenancy/mixin";
|
|
3
|
-
|
|
3
|
+
// src/mixin.ts
|
|
4
4
|
var u = o("_voltro_webhook_targets", {
|
|
5
5
|
id: t({ prefix: "whtarget" }),
|
|
6
6
|
event: s(),
|
|
@@ -77,5 +77,4 @@ var u = o("_voltro_webhook_targets", {
|
|
|
77
77
|
f,
|
|
78
78
|
p
|
|
79
79
|
]);
|
|
80
|
-
//#endregion
|
|
81
80
|
export { d as _voltroWebhookDeliveriesTable, p as _voltroWebhookEventStatsTable, f as _voltroWebhookRateWindowsTable, u as _voltroWebhookTargetsTable, m as webhookTables };
|
package/dist/plugin.js
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { Effect as e } from "effect";
|
|
2
2
|
import { definePlugin as t } from "@voltro/protocol";
|
|
3
|
-
|
|
3
|
+
// src/plugin.ts
|
|
4
4
|
var n = ["network:outbound:*"], r = [{
|
|
5
5
|
destination: "runtime:registered webhook targets (_voltro_webhook_targets)",
|
|
6
6
|
purpose: "event deliveries, HMAC-signed",
|
|
@@ -15,5 +15,4 @@ var n = ["network:outbound:*"], r = [{
|
|
|
15
15
|
t.logger.info("webhooks active", { outbound: "network:outbound:* (subscriber-configured target URLs — audit visibility, not a restriction)" });
|
|
16
16
|
})
|
|
17
17
|
});
|
|
18
|
-
//#endregion
|
|
19
18
|
export { r as WEBHOOKS_EGRESS, n as WEBHOOKS_PLUGIN_PERMISSIONS, i as webhooksPlugin };
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { defineWebhookProvider as e } from "../dsl.js";
|
|
2
2
|
import { genericHmacSignature as t } from "../signing.js";
|
|
3
|
-
|
|
3
|
+
// src/providers/generic.ts
|
|
4
4
|
var n = (n) => e({
|
|
5
5
|
id: "generic",
|
|
6
6
|
name: "Generic",
|
|
@@ -15,5 +15,4 @@ var n = (n) => e({
|
|
|
15
15
|
},
|
|
16
16
|
bodyType: "json"
|
|
17
17
|
});
|
|
18
|
-
//#endregion
|
|
19
18
|
export { n as genericProvider };
|
package/dist/providers/github.js
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { defineWebhookProvider as e } from "../dsl.js";
|
|
2
2
|
import { githubSignature as t } from "../signing.js";
|
|
3
|
-
|
|
3
|
+
// src/providers/github.ts
|
|
4
4
|
var n = () => e({
|
|
5
5
|
id: "github",
|
|
6
6
|
name: "GitHub",
|
|
@@ -12,5 +12,4 @@ var n = () => e({
|
|
|
12
12
|
bodyType: "json",
|
|
13
13
|
eventTypeFrom: (e) => {}
|
|
14
14
|
});
|
|
15
|
-
//#endregion
|
|
16
15
|
export { n as githubProvider };
|
package/dist/providers/slack.js
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { defineWebhookProvider as e } from "../dsl.js";
|
|
2
2
|
import { createHmac as t, timingSafeEqual as n } from "node:crypto";
|
|
3
|
-
|
|
3
|
+
// src/providers/slack.ts
|
|
4
4
|
var r = () => ({
|
|
5
5
|
_tag: "custom",
|
|
6
6
|
header: "X-Slack-Signature",
|
|
@@ -35,5 +35,4 @@ var r = () => ({
|
|
|
35
35
|
}
|
|
36
36
|
}
|
|
37
37
|
});
|
|
38
|
-
//#endregion
|
|
39
38
|
export { i as slackProvider };
|
package/dist/providers/stripe.js
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { defineWebhookProvider as e } from "../dsl.js";
|
|
2
2
|
import { stripeSignature as t } from "../signing.js";
|
|
3
|
-
|
|
3
|
+
// src/providers/stripe.ts
|
|
4
4
|
var n = (n) => e({
|
|
5
5
|
id: "stripe",
|
|
6
6
|
name: "Stripe",
|
|
@@ -26,5 +26,4 @@ var n = (n) => e({
|
|
|
26
26
|
}
|
|
27
27
|
}
|
|
28
28
|
});
|
|
29
|
-
//#endregion
|
|
30
29
|
export { n as stripeProvider };
|
package/dist/rateLimit.js
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { and as e, eq as t } from "@voltro/database";
|
|
2
|
-
|
|
2
|
+
// src/rateLimit.ts
|
|
3
3
|
var n = "_voltro_webhook_rate_windows", r = 6e4, i = (e, t) => `${e}@${t}`, a = async (n, r, i) => (await n.query({
|
|
4
4
|
table: "_voltro_webhook_rate_windows",
|
|
5
5
|
predicate: e(t("scope", r), t("bucket", i)),
|
|
@@ -57,5 +57,4 @@ var n = "_voltro_webhook_rate_windows", r = 6e4, i = (e, t) => `${e}@${t}`, a =
|
|
|
57
57
|
retryInMs: 0
|
|
58
58
|
};
|
|
59
59
|
};
|
|
60
|
-
//#endregion
|
|
61
60
|
export { r as RATE_WINDOW_MS, n as RATE_WINDOW_TABLE, l as acquireRateSlots, s as consumeRateSlot, c as releaseRateSlot };
|
package/dist/retry.js
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
|
|
1
|
+
// src/retry.ts
|
|
2
2
|
var e = /^(\d+(?:\.\d+)?)\s*(ms|s|m|h|d)?$/, t = (t) => {
|
|
3
3
|
let n = e.exec(t);
|
|
4
4
|
if (!n) throw Error(`invalid duration literal: ${t}`);
|
|
@@ -61,5 +61,4 @@ var e = /^(\d+(?:\.\d+)?)\s*(ms|s|m|h|d)?$/, t = (t) => {
|
|
|
61
61
|
honourRetryAfter: !0,
|
|
62
62
|
jitter: "full"
|
|
63
63
|
});
|
|
64
|
-
//#endregion
|
|
65
64
|
export { i as defaultRetryPolicy, a as fastRetryPolicy, r as nextRetry, t as parseDuration };
|
package/dist/service.js
CHANGED
|
@@ -7,7 +7,7 @@ import { Context as u, Effect as d, Result as f, Schema as p } from "effect";
|
|
|
7
7
|
import { randomBytes as m, randomUUID as h } from "node:crypto";
|
|
8
8
|
import { and as g, eq as _ } from "@voltro/database";
|
|
9
9
|
import { assertPublicUrl as v } from "@voltro/integration-http";
|
|
10
|
-
|
|
10
|
+
// src/service.ts
|
|
11
11
|
var y = 2592e3, b = class extends u.Service()("@voltro/webhooks/WebhooksService") {}, x = 32, S = 32, C = () => m(x).toString("hex"), w = (e) => e.events ?? (e.event === void 0 ? [] : [e.event]), T = (e, t) => {
|
|
12
12
|
if (e !== void 0 && t?._tag === "standardWebhooks" && !n(e)) throw new c({
|
|
13
13
|
field: "secret",
|
|
@@ -523,5 +523,4 @@ var y = 2592e3, b = class extends u.Service()("@voltro/webhooks/WebhooksService"
|
|
|
523
523
|
if (e.webhooks === void 0) throw Error("useWebhooks: `ctx.webhooks` is not set. Declare an outgoing event with a `webhook:` block in a *.event.ts file, or an incoming endpoint in a *.webhook.tsx file — the service is wired the moment the app has either.");
|
|
524
524
|
return e.webhooks;
|
|
525
525
|
};
|
|
526
|
-
//#endregion
|
|
527
526
|
export { y as MAX_SECRET_OVERLAP_SECONDS, b as WebhooksService, U as buildWebhooksService, M as compareVersions, w as eventsOf, C as generateSecret, N as matchesFilter, D as resolveSubscribe, G as useWebhooks, W as useWebhooksEffect, E as validateSubscribe };
|
package/dist/signing.js
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { standardWebhooksHeaders as e, verifyStandardWebhooks as t } from "./standardWebhooks.js";
|
|
2
2
|
import { createHmac as n, timingSafeEqual as r } from "node:crypto";
|
|
3
|
-
|
|
3
|
+
// src/signing.ts
|
|
4
4
|
var i = (e) => e === "hmacSha256" ? "sha256" : "sha1", a = (e, t, r, a = "hex") => {
|
|
5
5
|
let o = n(i(e), t);
|
|
6
6
|
return o.update(r), o.digest(a);
|
|
@@ -141,5 +141,4 @@ var s = (t, n) => {
|
|
|
141
141
|
encoding: "hex",
|
|
142
142
|
versionPrefix: "v1="
|
|
143
143
|
});
|
|
144
|
-
//#endregion
|
|
145
144
|
export { m as defaultOutgoingSignature, h as genericHmacSignature, d as githubSignature, s as signRequest, f as slackSignature, p as standardWebhooksSignature, u as stripeSignature, c as verifyRequest };
|
package/dist/standardWebhooks.js
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { createHmac as e, randomBytes as t, timingSafeEqual as n } from "node:crypto";
|
|
2
|
-
|
|
2
|
+
// src/standardWebhooks.ts
|
|
3
3
|
var r = "webhook-id", i = "webhook-timestamp", a = "webhook-signature", o = "v1", s = "whsec_", c = 24, l = 64, u = 300, d = () => `${s}${t(32).toString("base64")}`, f = (e) => {
|
|
4
4
|
if (!e.startsWith("whsec_")) throw Error(`standard-webhooks: the signing secret must be the spec's serialization — "${s}" + base64(24..64 random bytes). Mint one with generateStandardWebhooksSecret(). (A hex secret is also valid base64, so accepting it would sign with the wrong key bytes and every conformant consumer would reject the delivery.)`);
|
|
5
5
|
let t = Buffer.from(e.slice(6), "base64");
|
|
@@ -84,5 +84,4 @@ var r = "webhook-id", i = "webhook-timestamp", a = "webhook-signature", o = "v1"
|
|
|
84
84
|
reason: "signature mismatch"
|
|
85
85
|
};
|
|
86
86
|
};
|
|
87
|
-
//#endregion
|
|
88
87
|
export { u as STANDARD_WEBHOOKS_DEFAULT_TOLERANCE_SECONDS, r as STANDARD_WEBHOOKS_ID_HEADER, l as STANDARD_WEBHOOKS_MAX_KEY_BYTES, c as STANDARD_WEBHOOKS_MIN_KEY_BYTES, s as STANDARD_WEBHOOKS_SECRET_PREFIX, a as STANDARD_WEBHOOKS_SIGNATURE_HEADER, i as STANDARD_WEBHOOKS_TIMESTAMP_HEADER, o as STANDARD_WEBHOOKS_VERSION, d as generateStandardWebhooksSecret, p as isStandardWebhooksSecret, _ as standardWebhooksHeaders, f as standardWebhooksKey, g as standardWebhooksSignatureToken, h as standardWebhooksSignedContent, y as verifyStandardWebhooks };
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@voltro/plugin-webhooks",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.88.0",
|
|
4
4
|
"description": "Webhooks plugin — first-class outgoing (multi-target, durable-workflow delivery, HMAC signing, retry policies, rate limits) + incoming (signature verification, idempotency, provider templates for Stripe / GitHub / Slack / generic).",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"voltro",
|
|
@@ -48,15 +48,15 @@
|
|
|
48
48
|
"node": ">=24.0.0"
|
|
49
49
|
},
|
|
50
50
|
"dependencies": {
|
|
51
|
-
"@voltro/database": "0.
|
|
52
|
-
"@voltro/integration-http": "0.
|
|
53
|
-
"@voltro/logger": "0.
|
|
54
|
-
"@voltro/plugin-multitenancy": "0.
|
|
55
|
-
"@voltro/protocol": "0.
|
|
56
|
-
"@voltro/runtime": "0.
|
|
51
|
+
"@voltro/database": "0.88.0",
|
|
52
|
+
"@voltro/integration-http": "0.88.0",
|
|
53
|
+
"@voltro/logger": "0.88.0",
|
|
54
|
+
"@voltro/plugin-multitenancy": "0.88.0",
|
|
55
|
+
"@voltro/protocol": "0.88.0",
|
|
56
|
+
"@voltro/runtime": "0.88.0"
|
|
57
57
|
},
|
|
58
58
|
"peerDependencies": {
|
|
59
|
-
"effect": "4.0
|
|
59
|
+
"effect": "4.1.0"
|
|
60
60
|
},
|
|
61
61
|
"publishConfig": {
|
|
62
62
|
"access": "public"
|