@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.
@@ -1,5 +1,5 @@
1
1
  import { and as e, eq as t } from "@voltro/database";
2
- //#region src/autoDisable.ts
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 };
@@ -1,5 +1,5 @@
1
1
  import { defineOutboxHandler as e } from "@voltro/runtime";
2
- //#region src/deferredEmit.ts
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 };
@@ -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
- //#region src/deliverWorkflow.ts
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
- //#region src/dsl.ts
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
- //#region src/encode.ts
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
- //#region src/errors.ts
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 };
@@ -1,4 +1,4 @@
1
- //#region src/eventAudience.ts
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 };
@@ -1,4 +1,4 @@
1
- //#region src/idempotency.ts
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
- //#region src/incoming.ts
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
- //#region src/mixin.ts
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
- //#region src/plugin.ts
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
- //#region src/providers/generic.ts
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 };
@@ -1,6 +1,6 @@
1
1
  import { defineWebhookProvider as e } from "../dsl.js";
2
2
  import { githubSignature as t } from "../signing.js";
3
- //#region src/providers/github.ts
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 };
@@ -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
- //#region src/providers/slack.ts
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 };
@@ -1,6 +1,6 @@
1
1
  import { defineWebhookProvider as e } from "../dsl.js";
2
2
  import { stripeSignature as t } from "../signing.js";
3
- //#region src/providers/stripe.ts
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
- //#region src/rateLimit.ts
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
- //#region src/retry.ts
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
- //#region src/service.ts
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
- //#region src/signing.ts
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 };
@@ -1,5 +1,5 @@
1
1
  import { createHmac as e, randomBytes as t, timingSafeEqual as n } from "node:crypto";
2
- //#region src/standardWebhooks.ts
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.87.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.87.0",
52
- "@voltro/integration-http": "0.87.0",
53
- "@voltro/logger": "0.87.0",
54
- "@voltro/plugin-multitenancy": "0.87.0",
55
- "@voltro/protocol": "0.87.0",
56
- "@voltro/runtime": "0.87.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.1"
59
+ "effect": "4.1.0"
60
60
  },
61
61
  "publishConfig": {
62
62
  "access": "public"