@shdan/submesh 0.1.0 → 1.0.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 (73) hide show
  1. package/README.md +2 -2
  2. package/dist/contracts.d.ts +39 -2
  3. package/dist/contracts.d.ts.map +1 -1
  4. package/dist/drizzle/ensure-schema.d.ts.map +1 -1
  5. package/dist/drizzle/ensure-schema.js +12 -0
  6. package/dist/drizzle/ensure-schema.js.map +1 -1
  7. package/dist/drizzle/schema.d.ts.map +1 -1
  8. package/dist/drizzle/schema.js +4 -1
  9. package/dist/drizzle/schema.js.map +1 -1
  10. package/dist/drizzle/subject-repository.d.ts.map +1 -1
  11. package/dist/drizzle/subject-repository.js +7 -3
  12. package/dist/drizzle/subject-repository.js.map +1 -1
  13. package/dist/drizzle/summary-repository.d.ts.map +1 -1
  14. package/dist/drizzle/summary-repository.js +16 -7
  15. package/dist/drizzle/summary-repository.js.map +1 -1
  16. package/dist/index.d.ts +2 -1
  17. package/dist/index.d.ts.map +1 -1
  18. package/dist/index.js +1 -0
  19. package/dist/index.js.map +1 -1
  20. package/dist/logger.d.ts +27 -0
  21. package/dist/logger.d.ts.map +1 -1
  22. package/dist/logger.js +61 -0
  23. package/dist/logger.js.map +1 -1
  24. package/dist/plugins/builtin-plugins.d.ts.map +1 -1
  25. package/dist/plugins/builtin-plugins.js +2 -1
  26. package/dist/plugins/builtin-plugins.js.map +1 -1
  27. package/dist/providers/stripe/plugin/stripe-plan-sync.d.ts +4 -0
  28. package/dist/providers/stripe/plugin/stripe-plan-sync.d.ts.map +1 -0
  29. package/dist/providers/stripe/plugin/stripe-plan-sync.js +83 -0
  30. package/dist/providers/stripe/plugin/stripe-plan-sync.js.map +1 -0
  31. package/dist/providers/stripe/plugin/stripe.d.ts +20 -0
  32. package/dist/providers/stripe/plugin/stripe.d.ts.map +1 -0
  33. package/dist/providers/stripe/plugin/stripe.js +238 -0
  34. package/dist/providers/stripe/plugin/stripe.js.map +1 -0
  35. package/dist/providers/stripe/security/stripe-signature-verification.d.ts +3 -0
  36. package/dist/providers/stripe/security/stripe-signature-verification.d.ts.map +1 -0
  37. package/dist/providers/stripe/security/stripe-signature-verification.js +162 -0
  38. package/dist/providers/stripe/security/stripe-signature-verification.js.map +1 -0
  39. package/dist/providers/stripe/services/stripe-subscription-verification-service.d.ts +3 -0
  40. package/dist/providers/stripe/services/stripe-subscription-verification-service.d.ts.map +1 -0
  41. package/dist/providers/stripe/services/stripe-subscription-verification-service.js +65 -0
  42. package/dist/providers/stripe/services/stripe-subscription-verification-service.js.map +1 -0
  43. package/dist/services/managed-subscription-service.d.ts +2 -1
  44. package/dist/services/managed-subscription-service.d.ts.map +1 -1
  45. package/dist/services/managed-subscription-service.js +7 -1
  46. package/dist/services/managed-subscription-service.js.map +1 -1
  47. package/dist/services/plan-provisioning-service.d.ts +2 -1
  48. package/dist/services/plan-provisioning-service.d.ts.map +1 -1
  49. package/dist/services/plan-provisioning-service.js +16 -1
  50. package/dist/services/plan-provisioning-service.js.map +1 -1
  51. package/dist/services/provider-subscription-sync-service.d.ts +2 -1
  52. package/dist/services/provider-subscription-sync-service.d.ts.map +1 -1
  53. package/dist/services/provider-subscription-sync-service.js +7 -1
  54. package/dist/services/provider-subscription-sync-service.js.map +1 -1
  55. package/dist/services/retry-event-replay.d.ts +4 -0
  56. package/dist/services/retry-event-replay.d.ts.map +1 -0
  57. package/dist/services/retry-event-replay.js +53 -0
  58. package/dist/services/retry-event-replay.js.map +1 -0
  59. package/dist/services/webhook-ingestion-service.d.ts.map +1 -1
  60. package/dist/services/webhook-ingestion-service.js +23 -7
  61. package/dist/services/webhook-ingestion-service.js.map +1 -1
  62. package/dist/submesh.d.ts +15 -1
  63. package/dist/submesh.d.ts.map +1 -1
  64. package/dist/submesh.js +117 -27
  65. package/dist/submesh.js.map +1 -1
  66. package/dist/utils/validation.d.ts +6 -0
  67. package/dist/utils/validation.d.ts.map +1 -1
  68. package/dist/utils/validation.js +7 -1
  69. package/dist/utils/validation.js.map +1 -1
  70. package/drizzle/0001_steady_perf_indexes.sql +8 -0
  71. package/drizzle/meta/_journal.json +7 -0
  72. package/package.json +10 -10
  73. package/LICENSE +0 -21
@@ -1 +1 @@
1
- {"version":3,"file":"provider-subscription-sync-service.d.ts","sourceRoot":"","sources":["../../src/services/provider-subscription-sync-service.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,0BAA0B,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AAGpF,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,0BAA0B,CAAC;AAGpE,wBAAsB,gCAAgC,CACpD,YAAY,EAAE,mBAAmB,EACjC,KAAK,EAAE,0BAA0B,GAChC,OAAO,CAAC,YAAY,CAAC,CAgBvB"}
1
+ {"version":3,"file":"provider-subscription-sync-service.d.ts","sourceRoot":"","sources":["../../src/services/provider-subscription-sync-service.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,0BAA0B,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AAGpF,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,0BAA0B,CAAC;AACpE,OAAO,EAAE,aAAa,EAAc,MAAM,cAAc,CAAC;AAGzD,wBAAsB,gCAAgC,CACpD,YAAY,EAAE,mBAAmB,EACjC,KAAK,EAAE,0BAA0B,EACjC,MAAM,GAAE,aAA0B,GACjC,OAAO,CAAC,YAAY,CAAC,CAsBvB"}
@@ -1,9 +1,15 @@
1
1
  import { ConflictError } from "../errors.js";
2
+ import { noopLogger } from "../logger.js";
2
3
  import { ingestCanonicalSubscription } from "./canonical-subscription-service.js";
3
- export async function syncVerifiedProviderSubscription(repositories, input) {
4
+ export async function syncVerifiedProviderSubscription(repositories, input, logger = noopLogger) {
4
5
  if (!input.subjectId) {
5
6
  throw new Error("Verified provider subscription sync requires subjectId.");
6
7
  }
8
+ logger.info("Syncing verified provider subscription", {
9
+ subjectId: input.subjectId,
10
+ pluginKey: input.pluginKey,
11
+ sourceRef: input.sourceRef,
12
+ });
7
13
  const existing = await repositories.subscriptions.getBySource(input.pluginKey, input.sourceRef);
8
14
  if (existing && existing.subjectId !== input.subjectId) {
9
15
  throw new ConflictError(`Provider subscription ${input.pluginKey}:${input.sourceRef} is already linked to subject ${existing.subjectId}.`);
@@ -1 +1 @@
1
- {"version":3,"file":"provider-subscription-sync-service.js","sourceRoot":"","sources":["../../src/services/provider-subscription-sync-service.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,aAAa,EAAE,MAAM,cAAc,CAAC;AAE7C,OAAO,EAAE,2BAA2B,EAAE,MAAM,qCAAqC,CAAC;AAElF,MAAM,CAAC,KAAK,UAAU,gCAAgC,CACpD,YAAiC,EACjC,KAAiC;IAEjC,IAAI,CAAC,KAAK,CAAC,SAAS,EAAE,CAAC;QACrB,MAAM,IAAI,KAAK,CAAC,yDAAyD,CAAC,CAAC;IAC7E,CAAC;IAED,MAAM,QAAQ,GAAG,MAAM,YAAY,CAAC,aAAa,CAAC,WAAW,CAC3D,KAAK,CAAC,SAAS,EACf,KAAK,CAAC,SAAS,CAChB,CAAC;IACF,IAAI,QAAQ,IAAI,QAAQ,CAAC,SAAS,KAAK,KAAK,CAAC,SAAS,EAAE,CAAC;QACvD,MAAM,IAAI,aAAa,CACrB,yBAAyB,KAAK,CAAC,SAAS,IAAI,KAAK,CAAC,SAAS,iCAAiC,QAAQ,CAAC,SAAS,GAAG,CAClH,CAAC;IACJ,CAAC;IAED,OAAO,YAAY,CAAC,WAAW,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,2BAA2B,CAAC,EAAE,EAAE,KAAK,CAAC,CAAC,CAAC;AAClF,CAAC"}
1
+ {"version":3,"file":"provider-subscription-sync-service.js","sourceRoot":"","sources":["../../src/services/provider-subscription-sync-service.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,aAAa,EAAE,MAAM,cAAc,CAAC;AAE7C,OAAO,EAAiB,UAAU,EAAE,MAAM,cAAc,CAAC;AACzD,OAAO,EAAE,2BAA2B,EAAE,MAAM,qCAAqC,CAAC;AAElF,MAAM,CAAC,KAAK,UAAU,gCAAgC,CACpD,YAAiC,EACjC,KAAiC,EACjC,SAAwB,UAAU;IAElC,IAAI,CAAC,KAAK,CAAC,SAAS,EAAE,CAAC;QACrB,MAAM,IAAI,KAAK,CAAC,yDAAyD,CAAC,CAAC;IAC7E,CAAC;IAED,MAAM,CAAC,IAAI,CAAC,wCAAwC,EAAE;QACpD,SAAS,EAAE,KAAK,CAAC,SAAS;QAC1B,SAAS,EAAE,KAAK,CAAC,SAAS;QAC1B,SAAS,EAAE,KAAK,CAAC,SAAS;KAC3B,CAAC,CAAC;IAEH,MAAM,QAAQ,GAAG,MAAM,YAAY,CAAC,aAAa,CAAC,WAAW,CAC3D,KAAK,CAAC,SAAS,EACf,KAAK,CAAC,SAAS,CAChB,CAAC;IACF,IAAI,QAAQ,IAAI,QAAQ,CAAC,SAAS,KAAK,KAAK,CAAC,SAAS,EAAE,CAAC;QACvD,MAAM,IAAI,aAAa,CACrB,yBAAyB,KAAK,CAAC,SAAS,IAAI,KAAK,CAAC,SAAS,iCAAiC,QAAQ,CAAC,SAAS,GAAG,CAClH,CAAC;IACJ,CAAC;IAED,OAAO,YAAY,CAAC,WAAW,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,2BAA2B,CAAC,EAAE,EAAE,KAAK,CAAC,CAAC,CAAC;AAClF,CAAC"}
@@ -0,0 +1,4 @@
1
+ import type { ParsedWebhookEvent } from "@shdan/submesh-core";
2
+ export declare function extractRetryBody(payload: Record<string, unknown>, eventId: string): unknown;
3
+ export declare function extractRetryParsedEvents(payload: Record<string, unknown>): ParsedWebhookEvent[];
4
+ //# sourceMappingURL=retry-event-replay.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"retry-event-replay.d.ts","sourceRoot":"","sources":["../../src/services/retry-event-replay.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,qBAAqB,CAAC;AAqD9D,wBAAgB,gBAAgB,CAAC,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,OAAO,EAAE,MAAM,GAAG,OAAO,CAO3F;AAED,wBAAgB,wBAAwB,CACtC,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAC/B,kBAAkB,EAAE,CAWtB"}
@@ -0,0 +1,53 @@
1
+ import { ValidationError } from "../errors.js";
2
+ function asRecord(value) {
3
+ if (!value || typeof value !== "object" || Array.isArray(value)) {
4
+ return undefined;
5
+ }
6
+ return value;
7
+ }
8
+ function isParsedWebhookEvent(value) {
9
+ const record = asRecord(value);
10
+ if (!record) {
11
+ return false;
12
+ }
13
+ return (typeof record.eventKey === "string" &&
14
+ typeof record.eventType === "string" &&
15
+ (record.sourceRef === undefined ||
16
+ record.sourceRef === null ||
17
+ typeof record.sourceRef === "string") &&
18
+ Array.isArray(record.records));
19
+ }
20
+ function unwrapStoredPayloadValue(value, eventId) {
21
+ const record = asRecord(value);
22
+ if (!record) {
23
+ return value;
24
+ }
25
+ if (record._truncated) {
26
+ throw new ValidationError(`Event ${eventId} payload was truncated and cannot be replayed automatically. Request a fresh webhook delivery.`);
27
+ }
28
+ if (record._unserializable) {
29
+ throw new ValidationError(`Event ${eventId} payload was not serializable and cannot be replayed automatically.`);
30
+ }
31
+ if (Object.prototype.hasOwnProperty.call(record, "value")) {
32
+ return record.value;
33
+ }
34
+ return record;
35
+ }
36
+ export function extractRetryBody(payload, eventId) {
37
+ const request = asRecord(payload.request);
38
+ if (request) {
39
+ return unwrapStoredPayloadValue(request, eventId);
40
+ }
41
+ return unwrapStoredPayloadValue(payload, eventId);
42
+ }
43
+ export function extractRetryParsedEvents(payload) {
44
+ if (!Object.prototype.hasOwnProperty.call(payload, "parsedEvent")) {
45
+ return [];
46
+ }
47
+ const parsed = asRecord(payload.parsedEvent);
48
+ if (!parsed || parsed._truncated || parsed._unserializable) {
49
+ return [];
50
+ }
51
+ return isParsedWebhookEvent(parsed) ? [parsed] : [];
52
+ }
53
+ //# sourceMappingURL=retry-event-replay.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"retry-event-replay.js","sourceRoot":"","sources":["../../src/services/retry-event-replay.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,eAAe,EAAE,MAAM,cAAc,CAAC;AAE/C,SAAS,QAAQ,CAAC,KAAc;IAC9B,IAAI,CAAC,KAAK,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC;QAChE,OAAO,SAAS,CAAC;IACnB,CAAC;IAED,OAAO,KAAgC,CAAC;AAC1C,CAAC;AAED,SAAS,oBAAoB,CAAC,KAAc;IAC1C,MAAM,MAAM,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAC;IAC/B,IAAI,CAAC,MAAM,EAAE,CAAC;QACZ,OAAO,KAAK,CAAC;IACf,CAAC;IAED,OAAO,CACL,OAAO,MAAM,CAAC,QAAQ,KAAK,QAAQ;QACnC,OAAO,MAAM,CAAC,SAAS,KAAK,QAAQ;QACpC,CAAC,MAAM,CAAC,SAAS,KAAK,SAAS;YAC7B,MAAM,CAAC,SAAS,KAAK,IAAI;YACzB,OAAO,MAAM,CAAC,SAAS,KAAK,QAAQ,CAAC;QACvC,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,OAAO,CAAC,CAC9B,CAAC;AACJ,CAAC;AAED,SAAS,wBAAwB,CAAC,KAAc,EAAE,OAAe;IAC/D,MAAM,MAAM,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAC;IAC/B,IAAI,CAAC,MAAM,EAAE,CAAC;QACZ,OAAO,KAAK,CAAC;IACf,CAAC;IAED,IAAI,MAAM,CAAC,UAAU,EAAE,CAAC;QACtB,MAAM,IAAI,eAAe,CACvB,SAAS,OAAO,gGAAgG,CACjH,CAAC;IACJ,CAAC;IAED,IAAI,MAAM,CAAC,eAAe,EAAE,CAAC;QAC3B,MAAM,IAAI,eAAe,CACvB,SAAS,OAAO,qEAAqE,CACtF,CAAC;IACJ,CAAC;IAED,IAAI,MAAM,CAAC,SAAS,CAAC,cAAc,CAAC,IAAI,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,CAAC;QAC1D,OAAO,MAAM,CAAC,KAAK,CAAC;IACtB,CAAC;IAED,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,MAAM,UAAU,gBAAgB,CAAC,OAAgC,EAAE,OAAe;IAChF,MAAM,OAAO,GAAG,QAAQ,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;IAC1C,IAAI,OAAO,EAAE,CAAC;QACZ,OAAO,wBAAwB,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;IACpD,CAAC;IAED,OAAO,wBAAwB,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;AACpD,CAAC;AAED,MAAM,UAAU,wBAAwB,CACtC,OAAgC;IAEhC,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,cAAc,CAAC,IAAI,CAAC,OAAO,EAAE,aAAa,CAAC,EAAE,CAAC;QAClE,OAAO,EAAE,CAAC;IACZ,CAAC;IAED,MAAM,MAAM,GAAG,QAAQ,CAAC,OAAO,CAAC,WAAW,CAAC,CAAC;IAC7C,IAAI,CAAC,MAAM,IAAI,MAAM,CAAC,UAAU,IAAI,MAAM,CAAC,eAAe,EAAE,CAAC;QAC3D,OAAO,EAAE,CAAC;IACZ,CAAC;IAED,OAAO,oBAAoB,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;AACtD,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"webhook-ingestion-service.d.ts","sourceRoot":"","sources":["../../src/services/webhook-ingestion-service.ts"],"names":[],"mappings":"AAOA,OAAO,KAAK,EAAE,oBAAoB,EAAE,mBAAmB,EAAE,MAAM,iBAAiB,CAAC;AAEjF,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,+BAA+B,CAAC;AACpE,OAAO,KAAK,EAAiB,mBAAmB,EAAE,MAAM,0BAA0B,CAAC;AAEnF,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,cAAc,CAAC;AAClD,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAEhD,UAAU,uBAAuB;IAC/B,YAAY,EAAE,mBAAmB,CAAC;IAClC,cAAc,EAAE,cAAc,CAAC;IAC/B,MAAM,EAAE,aAAa,CAAC;IACtB,KAAK,EAAE,YAAY,CAAC;CACrB;AAyFD,wBAAsB,kBAAkB,CACtC,OAAO,EAAE,uBAAuB,EAChC,SAAS,EAAE,MAAM,EACjB,IAAI,EAAE,OAAO,EACb,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,EAAE,GAAG,SAAS,CAAC,EACtD,aAAa,GAAE,oBAAyB,GACvC,OAAO,CAAC,mBAAmB,CAAC,CAuG9B"}
1
+ {"version":3,"file":"webhook-ingestion-service.d.ts","sourceRoot":"","sources":["../../src/services/webhook-ingestion-service.ts"],"names":[],"mappings":"AAQA,OAAO,KAAK,EAAE,oBAAoB,EAAE,mBAAmB,EAAE,MAAM,iBAAiB,CAAC;AAEjF,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,+BAA+B,CAAC;AACpE,OAAO,KAAK,EAAiB,mBAAmB,EAAE,MAAM,0BAA0B,CAAC;AAEnF,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,cAAc,CAAC;AAClD,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAEhD,UAAU,uBAAuB;IAC/B,YAAY,EAAE,mBAAmB,CAAC;IAClC,cAAc,EAAE,cAAc,CAAC;IAC/B,MAAM,EAAE,aAAa,CAAC;IACtB,KAAK,EAAE,YAAY,CAAC;CACrB;AAmGD,wBAAsB,kBAAkB,CACtC,OAAO,EAAE,uBAAuB,EAChC,SAAS,EAAE,MAAM,EACjB,IAAI,EAAE,OAAO,EACb,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,EAAE,GAAG,SAAS,CAAC,EACtD,aAAa,GAAE,oBAAyB,GACvC,OAAO,CAAC,mBAAmB,CAAC,CAkH9B"}
@@ -39,6 +39,12 @@ function toStoredErrorMessage(error) {
39
39
  const message = error instanceof Error ? error.message : "Unknown webhook ingestion error.";
40
40
  return truncate(message, MAX_STORED_ERROR_MESSAGE_LENGTH);
41
41
  }
42
+ function toPersistedEventEnvelope(requestBody, event) {
43
+ return {
44
+ request: toPersistedPayload(requestBody),
45
+ parsedEvent: toPersistedPayload(event),
46
+ };
47
+ }
42
48
  async function processParsedEvent(options, event, records) {
43
49
  const transitions = [];
44
50
  const subscriptions = await options.repositories.transaction(async (tx) => {
@@ -83,26 +89,36 @@ export async function ingestWebhookEvent(options, pluginKey, body, headers, inge
83
89
  receivedAt,
84
90
  rawBody: ingestOptions.rawBody,
85
91
  };
86
- if (plugin.verifyWebhook) {
92
+ if (ingestOptions.skipVerification) {
93
+ options.logger.warn("Webhook verification skipped for ingestion request", {
94
+ pluginKey,
95
+ });
96
+ }
97
+ else if (plugin.verifyWebhook) {
87
98
  const verification = await plugin.verifyWebhook(envelope, { config });
88
99
  if (!verification.verified) {
89
100
  throw new ValidationError(`Webhook verification failed for ${pluginKey}.`);
90
101
  }
91
102
  }
92
- const parsed = await plugin.parseWebhook({
93
- ...envelope,
94
- });
95
- const events = Array.isArray(parsed) ? parsed : [parsed];
103
+ const events = ingestOptions.parsedEventsOverride
104
+ ? ingestOptions.parsedEventsOverride
105
+ : (() => {
106
+ const parsed = plugin.parseWebhook({
107
+ ...envelope,
108
+ });
109
+ return Promise.resolve(parsed).then((value) => Array.isArray(value) ? value : [value]);
110
+ })();
111
+ const parsedEvents = await events;
96
112
  const subscriptions = [];
97
113
  let processedEvents = 0;
98
114
  let duplicateEvents = 0;
99
- for (const event of events) {
115
+ for (const event of parsedEvents) {
100
116
  const received = await options.repositories.inboundEvents.markReceived({
101
117
  pluginKey,
102
118
  eventKey: event.eventKey,
103
119
  eventType: event.eventType,
104
120
  sourceRef: event.sourceRef,
105
- payload: toPersistedPayload(body),
121
+ payload: toPersistedEventEnvelope(body, event),
106
122
  });
107
123
  if (!received.claimed) {
108
124
  duplicateEvents += 1;
@@ -1 +1 @@
1
- {"version":3,"file":"webhook-ingestion-service.js","sourceRoot":"","sources":["../../src/services/webhook-ingestion-service.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"webhook-ingestion-service.js","sourceRoot":"","sources":["../../src/services/webhook-ingestion-service.ts"],"names":[],"mappings":"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"}
package/dist/submesh.d.ts CHANGED
@@ -1,5 +1,5 @@
1
1
  import { EntitlementEvaluationOptions, SubscriptionPlugin, type AccessDecision, type CanonicalSubscriptionInput, type CatalogMapping, type DashboardSummary, type InboundEvent, type Plan, type PluginInstallation, type Subject, type Subscription, type SubscriptionWithPlan } from "@shdan/submesh-core";
2
- import type { CreateManagedSubscriptionInput, CreatePlanInput, IngestWebhookOptions, IngestWebhookResult, InstallPluginInput, LinkProviderIdentityInput, PluginListItem, SyncAppleAppStoreSubscriptionInput, SyncGooglePlaySubscriptionInput, SubmeshOptions, SyncedProviderSubscription, UpsertCatalogMappingInput, UpsertSubjectInput, VerifyAppleAppStoreSubscriptionInput, VerifyGooglePlaySubscriptionInput, UpdatePlanInput, UpdateSubscriptionInput, CancelSubscriptionOptions, VerifiedProviderSubscription } from "./contracts.js";
2
+ import type { CreateManagedSubscriptionInput, CreatePlanInput, IngestWebhookOptions, IngestWebhookResult, InstallPluginInput, LinkProviderIdentityInput, PluginListItem, SyncAppleAppStoreSubscriptionInput, SyncGooglePlaySubscriptionInput, SyncStripeSubscriptionInput, SubmeshOptions, SyncedProviderSubscription, UpsertCatalogMappingInput, UpsertSubjectInput, VerifyAppleAppStoreSubscriptionInput, VerifyGooglePlaySubscriptionInput, VerifyStripeSubscriptionInput, UpdatePlanInput, UpdateSubscriptionInput, CancelSubscriptionOptions, VerifiedProviderSubscription } from "./contracts.js";
3
3
  /**
4
4
  * Main Submesh SDK client.
5
5
  *
@@ -241,6 +241,20 @@ export declare class Submesh {
241
241
  * @returns Verified data plus the synchronized subscription record.
242
242
  */
243
243
  syncGooglePlaySubscription(input: SyncGooglePlaySubscriptionInput): Promise<SyncedProviderSubscription>;
244
+ /**
245
+ * Verifies a Stripe subscription and returns canonical data.
246
+ *
247
+ * @param input Stripe verification payload.
248
+ * @returns Verified provider response with canonical subscription data.
249
+ */
250
+ verifyStripeSubscription(input: VerifyStripeSubscriptionInput): Promise<VerifiedProviderSubscription>;
251
+ /**
252
+ * Verifies and syncs a Stripe subscription.
253
+ *
254
+ * @param input Stripe verification payload plus target subject.
255
+ * @returns Verified data plus the synchronized subscription record.
256
+ */
257
+ syncStripeSubscription(input: SyncStripeSubscriptionInput): Promise<SyncedProviderSubscription>;
244
258
  /**
245
259
  * Verifies an Apple App Store transaction and returns canonical data.
246
260
  *
@@ -1 +1 @@
1
- {"version":3,"file":"submesh.d.ts","sourceRoot":"","sources":["../src/submesh.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"submesh.d.ts","sourceRoot":"","sources":["../src/submesh.ts"],"names":[],"mappings":"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"}
package/dist/submesh.js CHANGED
@@ -2,7 +2,7 @@ import { evaluateEntitlementAccess, } from "@shdan/submesh-core";
2
2
  import { collectGrantedEntitlements } from "@shdan/submesh-core";
3
3
  import { ConflictError, NotFoundError, ValidationError } from "./errors.js";
4
4
  import { DrizzleSubmeshRepositories } from "./drizzle/index.js";
5
- import { noopLogger } from "./logger.js";
5
+ import { noopLogger, ConsoleLogger } from "./logger.js";
6
6
  import { getBuiltinPlugins } from "./plugins/builtin-plugins.js";
7
7
  import { PluginRegistry } from "./plugins/plugin-registry.js";
8
8
  import { ingestCanonicalSubscription } from "./services/canonical-subscription-service.js";
@@ -11,9 +11,11 @@ import { createManagedSubscription } from "./services/managed-subscription-servi
11
11
  import { verifyGooglePlaySubscription } from "./providers/google/services/play-subscription-verification-service.js";
12
12
  import { createPlanWithProvisioning } from "./services/plan-provisioning-service.js";
13
13
  import { installPlugin } from "./services/plugin-installation-service.js";
14
+ import { extractRetryBody, extractRetryParsedEvents, } from "./services/retry-event-replay.js";
14
15
  import { syncVerifiedProviderSubscription } from "./services/provider-subscription-sync-service.js";
15
16
  import { ingestWebhookEvent } from "./services/webhook-ingestion-service.js";
16
- import { requireString } from "./utils/validation.js";
17
+ import { verifyStripeSubscription } from "./providers/stripe/services/stripe-subscription-verification-service.js";
18
+ import { assertMaxLength, MAX_ENTITLEMENT_LENGTH, MAX_EVENT_ID_LENGTH, MAX_EXTERNAL_ID_LENGTH, MAX_PLAN_CODE_LENGTH, MAX_PROVIDER_KEY_LENGTH, MAX_SUBJECT_ID_LENGTH, requireString, } from "./utils/validation.js";
17
19
  /**
18
20
  * Main Submesh SDK client.
19
21
  *
@@ -64,7 +66,15 @@ export class Submesh {
64
66
  else {
65
67
  throw new ValidationError("Provide repositories, drizzle options, or a Postgres connectionString / DATABASE_URL.");
66
68
  }
67
- this.logger = options.logger ?? noopLogger;
69
+ if (options.logger) {
70
+ this.logger = options.logger;
71
+ }
72
+ else if (process.env.NODE_ENV === "development") {
73
+ this.logger = new ConsoleLogger();
74
+ }
75
+ else {
76
+ this.logger = noopLogger;
77
+ }
68
78
  this.hooks = options.hooks ?? {};
69
79
  if (options.autoRegisterBuiltinPlugins !== false) {
70
80
  for (const plugin of getBuiltinPlugins()) {
@@ -106,7 +116,9 @@ export class Submesh {
106
116
  */
107
117
  async installPlugin(input) {
108
118
  await this.ensureReady();
109
- return installPlugin(this.repositories, this.pluginRegistry, input);
119
+ const result = await installPlugin(this.repositories, this.pluginRegistry, input);
120
+ this.logger.info("Plugin installed", { pluginKey: input.pluginKey });
121
+ return result;
110
122
  }
111
123
  /**
112
124
  * Returns registered plugins with their current installation state.
@@ -133,6 +145,7 @@ export class Submesh {
133
145
  displayName: plugin.displayName,
134
146
  enabled: false,
135
147
  });
148
+ this.logger.info("Plugin disabled", { pluginKey });
136
149
  }
137
150
  /**
138
151
  * Returns all subjects.
@@ -152,7 +165,10 @@ export class Submesh {
152
165
  async upsertSubject(input) {
153
166
  await this.ensureReady();
154
167
  requireString(input.id, "Subject id");
155
- return this.repositories.subjects.upsert(input);
168
+ assertMaxLength(input.id, MAX_SUBJECT_ID_LENGTH, "Subject id");
169
+ const result = await this.repositories.subjects.upsert(input);
170
+ this.logger.debug("Subject upserted", { id: input.id });
171
+ return result;
156
172
  }
157
173
  /**
158
174
  * Returns a subject by their ID.
@@ -163,7 +179,10 @@ export class Submesh {
163
179
  async getSubject(id) {
164
180
  await this.ensureReady();
165
181
  requireString(id, "Subject id");
166
- return this.repositories.subjects.getById(id);
182
+ assertMaxLength(id, MAX_SUBJECT_ID_LENGTH, "Subject id");
183
+ const result = await this.repositories.subjects.getById(id);
184
+ this.logger.debug("Subject fetched", { id, found: !!result });
185
+ return result;
167
186
  }
168
187
  /**
169
188
  * Links an external provider identity to a subject.
@@ -176,8 +195,16 @@ export class Submesh {
176
195
  requireString(input.subjectId, "Subject id");
177
196
  requireString(input.provider, "Provider");
178
197
  requireString(input.externalId, "External id");
198
+ assertMaxLength(input.subjectId, MAX_SUBJECT_ID_LENGTH, "Subject id");
199
+ assertMaxLength(input.provider, MAX_PROVIDER_KEY_LENGTH, "Provider");
200
+ assertMaxLength(input.externalId, MAX_EXTERNAL_ID_LENGTH, "External id");
179
201
  await this.repositories.subjects.upsert({ id: input.subjectId });
180
202
  await this.repositories.subjects.upsertIdentity(input);
203
+ this.logger.info("Provider identity linked", {
204
+ subjectId: input.subjectId,
205
+ provider: input.provider,
206
+ externalId: input.externalId,
207
+ });
181
208
  }
182
209
  /**
183
210
  * Returns all plans.
@@ -198,11 +225,12 @@ export class Submesh {
198
225
  await this.ensureReady();
199
226
  requireString(input.code, "Plan code");
200
227
  requireString(input.name, "Plan name");
228
+ assertMaxLength(input.code, MAX_PLAN_CODE_LENGTH, "Plan code");
201
229
  const existing = await this.repositories.plans.getByCode(input.code);
202
230
  if (existing) {
203
231
  throw new ConflictError(`Plan ${input.code} already exists.`);
204
232
  }
205
- return createPlanWithProvisioning(this.repositories, this.pluginRegistry, input);
233
+ return createPlanWithProvisioning(this.repositories, this.pluginRegistry, input, this.logger);
206
234
  }
207
235
  /**
208
236
  * Updates a plan's details.
@@ -214,10 +242,12 @@ export class Submesh {
214
242
  async updatePlan(code, input) {
215
243
  await this.ensureReady();
216
244
  requireString(code, "Plan code");
245
+ assertMaxLength(code, MAX_PLAN_CODE_LENGTH, "Plan code");
217
246
  const updated = await this.repositories.plans.update(code, input);
218
247
  if (!updated) {
219
248
  throw new NotFoundError(`Plan ${code} was not found.`);
220
249
  }
250
+ this.logger.info("Plan updated", { planCode: code });
221
251
  return updated;
222
252
  }
223
253
  /**
@@ -228,10 +258,12 @@ export class Submesh {
228
258
  async deletePlan(code) {
229
259
  await this.ensureReady();
230
260
  requireString(code, "Plan code");
261
+ assertMaxLength(code, MAX_PLAN_CODE_LENGTH, "Plan code");
231
262
  const deleted = await this.repositories.plans.delete(code);
232
263
  if (!deleted) {
233
264
  throw new NotFoundError(`Plan ${code} was not found.`);
234
265
  }
266
+ this.logger.info("Plan deleted", { planCode: code });
235
267
  }
236
268
  /**
237
269
  * Returns catalog mappings from provider products to internal plan codes.
@@ -253,11 +285,20 @@ export class Submesh {
253
285
  requireString(input.pluginKey, "Plugin key");
254
286
  requireString(input.externalProductId, "External product id");
255
287
  requireString(input.planCode, "Plan code");
288
+ assertMaxLength(input.pluginKey, MAX_PROVIDER_KEY_LENGTH, "Plugin key");
289
+ assertMaxLength(input.externalProductId, MAX_EXTERNAL_ID_LENGTH, "External product id");
290
+ assertMaxLength(input.planCode, MAX_PLAN_CODE_LENGTH, "Plan code");
256
291
  const plan = await this.repositories.plans.getByCode(input.planCode);
257
292
  if (!plan) {
258
293
  throw new NotFoundError(`Plan ${input.planCode} was not found.`);
259
294
  }
260
- return this.repositories.catalogMappings.upsert(input);
295
+ const result = await this.repositories.catalogMappings.upsert(input);
296
+ this.logger.info("Catalog mapping upserted", {
297
+ pluginKey: input.pluginKey,
298
+ externalProductId: input.externalProductId,
299
+ planCode: input.planCode,
300
+ });
301
+ return result;
261
302
  }
262
303
  /**
263
304
  * Removes a catalog mapping.
@@ -269,10 +310,13 @@ export class Submesh {
269
310
  await this.ensureReady();
270
311
  requireString(pluginKey, "Plugin key");
271
312
  requireString(externalProductId, "External product id");
313
+ assertMaxLength(pluginKey, MAX_PROVIDER_KEY_LENGTH, "Plugin key");
314
+ assertMaxLength(externalProductId, MAX_EXTERNAL_ID_LENGTH, "External product id");
272
315
  const deleted = await this.repositories.catalogMappings.delete(pluginKey, externalProductId);
273
316
  if (!deleted) {
274
317
  throw new NotFoundError(`Mapping for ${pluginKey} / ${externalProductId} not found.`);
275
318
  }
319
+ this.logger.info("Catalog mapping deleted", { pluginKey, externalProductId });
276
320
  }
277
321
  /**
278
322
  * Returns subscriptions with resolved plan details.
@@ -291,7 +335,10 @@ export class Submesh {
291
335
  async getSubscription(id) {
292
336
  await this.ensureReady();
293
337
  requireString(id, "Subscription id");
294
- return this.repositories.subscriptions.getById(id);
338
+ assertMaxLength(id, MAX_EXTERNAL_ID_LENGTH, "Subscription id");
339
+ const result = await this.repositories.subscriptions.getById(id);
340
+ this.logger.debug("Subscription fetched", { id, found: !!result });
341
+ return result;
295
342
  }
296
343
  /**
297
344
  * Returns subscriptions for a specific subject.
@@ -301,6 +348,7 @@ export class Submesh {
301
348
  async listSubscriptionsBySubject(subjectId) {
302
349
  await this.ensureReady();
303
350
  requireString(subjectId, "Subject id");
351
+ assertMaxLength(subjectId, MAX_SUBJECT_ID_LENGTH, "Subject id");
304
352
  return this.repositories.subscriptions.listBySubjectId(subjectId);
305
353
  }
306
354
  /**
@@ -313,7 +361,9 @@ export class Submesh {
313
361
  await this.ensureReady();
314
362
  requireString(input.subjectId, "Subject id");
315
363
  requireString(input.planCode, "Plan code");
316
- const sub = await createManagedSubscription(this.repositories, input);
364
+ assertMaxLength(input.subjectId, MAX_SUBJECT_ID_LENGTH, "Subject id");
365
+ assertMaxLength(input.planCode, MAX_PLAN_CODE_LENGTH, "Plan code");
366
+ const sub = await createManagedSubscription(this.repositories, input, this.logger);
317
367
  this.logger.info("Subscription created", { id: sub.id, subjectId: sub.subjectId });
318
368
  if (this.hooks.onSubscriptionChanged) {
319
369
  await Promise.resolve(this.hooks.onSubscriptionChanged(sub, null)).catch((e) => this.logger.error("Error in onSubscriptionChanged hook", { error: e }));
@@ -329,6 +379,7 @@ export class Submesh {
329
379
  async updateSubscription(id, input) {
330
380
  await this.ensureReady();
331
381
  requireString(id, "Subscription id");
382
+ assertMaxLength(id, MAX_EXTERNAL_ID_LENGTH, "Subscription id");
332
383
  // We fetch it first to get existing status for hooks
333
384
  const existing = await this.repositories.subscriptions.getById(id);
334
385
  if (!existing) {
@@ -357,8 +408,12 @@ export class Submesh {
357
408
  * @param options Cancellation options.
358
409
  */
359
410
  async cancelSubscription(id, options = {}) {
411
+ if (!options.immediate && options.cancelAt === undefined) {
412
+ throw new ValidationError("cancelSubscription requires cancelAt when immediate is false.");
413
+ }
414
+ const effectiveCancelAt = options.immediate ? options.cancelAt ?? new Date().toISOString() : options.cancelAt;
360
415
  return this.updateSubscription(id, {
361
- cancelAt: options.cancelAt ?? new Date().toISOString(),
416
+ cancelAt: effectiveCancelAt,
362
417
  status: options.immediate ? "canceled" : undefined,
363
418
  });
364
419
  }
@@ -373,6 +428,8 @@ export class Submesh {
373
428
  await this.ensureReady();
374
429
  requireString(subjectId, "Subject id");
375
430
  requireString(entitlement, "Entitlement");
431
+ assertMaxLength(subjectId, MAX_SUBJECT_ID_LENGTH, "Subject id");
432
+ assertMaxLength(entitlement, MAX_ENTITLEMENT_LENGTH, "Entitlement");
376
433
  const subject = await this.repositories.subjects.getById(subjectId);
377
434
  if (!subject) {
378
435
  return {
@@ -391,6 +448,7 @@ export class Submesh {
391
448
  async listEntitlements(subjectId, options = {}) {
392
449
  await this.ensureReady();
393
450
  requireString(subjectId, "Subject id");
451
+ assertMaxLength(subjectId, MAX_SUBJECT_ID_LENGTH, "Subject id");
394
452
  const subscriptions = await this.repositories.subscriptions.listBySubjectId(subjectId);
395
453
  return collectGrantedEntitlements(subscriptions, options);
396
454
  }
@@ -430,6 +488,7 @@ export class Submesh {
430
488
  async retryEvent(eventId) {
431
489
  await this.ensureReady();
432
490
  requireString(eventId, "Event id");
491
+ assertMaxLength(eventId, MAX_EVENT_ID_LENGTH, "Event id");
433
492
  const event = await this.repositories.inboundEvents.getById(eventId);
434
493
  if (!event) {
435
494
  throw new NotFoundError(`Event ${eventId} not found.`);
@@ -438,18 +497,12 @@ export class Submesh {
438
497
  throw new ValidationError(`Event ${eventId} is not in a failed state (${event.status}).`);
439
498
  }
440
499
  this.logger.info("Retrying failed event", { eventId, pluginKey: event.pluginKey });
441
- // Mark it as received again to permit re-processing in a fresh state
442
- await this.repositories.inboundEvents.markReceived({
443
- pluginKey: event.pluginKey,
444
- eventKey: event.eventKey + "_retry_" + Date.now().toString(),
445
- eventType: event.eventType,
446
- sourceRef: event.sourceRef,
447
- payload: event.payload,
500
+ const retryBody = extractRetryBody(event.payload, eventId);
501
+ const parsedEventsOverride = extractRetryParsedEvents(event.payload);
502
+ return this.ingestWebhook(event.pluginKey, retryBody, {}, {
503
+ skipVerification: true,
504
+ parsedEventsOverride: parsedEventsOverride.length > 0 ? parsedEventsOverride : undefined,
448
505
  });
449
- // Re-ingest the payload through the standard processing pipeline via manual execution bypassing webhook source checks.
450
- // For safety, this delegates to ingestWebhookEvent but since the event is already received, we reconstruct the payload.
451
- // However, ingestWebhookEvent requires the raw payload. We assume event.payload is close enough to raw payload.
452
- return this.ingestWebhook(event.pluginKey, event.payload.value ?? event.payload, {}, { rawBody: undefined });
453
506
  }
454
507
  /**
455
508
  * Ingests a canonical subscription event.
@@ -459,7 +512,13 @@ export class Submesh {
459
512
  */
460
513
  async ingestCanonicalEvent(input) {
461
514
  await this.ensureReady();
462
- return this.repositories.transaction((tx) => ingestCanonicalSubscription(tx, input));
515
+ const result = await this.repositories.transaction((tx) => ingestCanonicalSubscription(tx, input));
516
+ this.logger.info("Canonical event ingested", {
517
+ subjectId: input.subjectId,
518
+ pluginKey: input.pluginKey,
519
+ sourceRef: input.sourceRef,
520
+ });
521
+ return result;
463
522
  }
464
523
  /**
465
524
  * Ingests a plugin webhook payload and applies subscription updates.
@@ -473,6 +532,7 @@ export class Submesh {
473
532
  async ingestWebhook(pluginKey, body, headers = {}, options = {}) {
474
533
  await this.ensureReady();
475
534
  requireString(pluginKey, "Plugin key");
535
+ assertMaxLength(pluginKey, MAX_PROVIDER_KEY_LENGTH, "Plugin key");
476
536
  return ingestWebhookEvent({
477
537
  repositories: this.repositories,
478
538
  pluginRegistry: this.pluginRegistry,
@@ -491,13 +551,14 @@ export class Submesh {
491
551
  return async (req) => {
492
552
  try {
493
553
  const bodyBuffer = await req.arrayBuffer();
494
- const rawBody = Buffer.from(bodyBuffer);
554
+ const rawBody = new Uint8Array(bodyBuffer);
555
+ const decodedBody = new TextDecoder().decode(rawBody);
495
556
  const headers = {};
496
557
  req.headers.forEach((value, key) => {
497
558
  headers[key] = value;
498
559
  });
499
560
  const contentType = req.headers.get("content-type") || "";
500
- let body = rawBody.toString("utf8");
561
+ let body = decodedBody;
501
562
  if (contentType.includes("application/json")) {
502
563
  try {
503
564
  body = JSON.parse(body);
@@ -548,7 +609,36 @@ export class Submesh {
548
609
  return {
549
610
  ...verified,
550
611
  canonical,
551
- subscription: await syncVerifiedProviderSubscription(this.repositories, canonical),
612
+ subscription: await syncVerifiedProviderSubscription(this.repositories, canonical, this.logger),
613
+ };
614
+ }
615
+ /**
616
+ * Verifies a Stripe subscription and returns canonical data.
617
+ *
618
+ * @param input Stripe verification payload.
619
+ * @returns Verified provider response with canonical subscription data.
620
+ */
621
+ async verifyStripeSubscription(input) {
622
+ await this.ensureReady();
623
+ return verifyStripeSubscription(input, await this.getPluginConfig("stripe"));
624
+ }
625
+ /**
626
+ * Verifies and syncs a Stripe subscription.
627
+ *
628
+ * @param input Stripe verification payload plus target subject.
629
+ * @returns Verified data plus the synchronized subscription record.
630
+ */
631
+ async syncStripeSubscription(input) {
632
+ await this.ensureReady();
633
+ const verified = await this.verifyStripeSubscription(input);
634
+ const canonical = {
635
+ ...verified.canonical,
636
+ subjectId: input.subjectId,
637
+ };
638
+ return {
639
+ ...verified,
640
+ canonical,
641
+ subscription: await syncVerifiedProviderSubscription(this.repositories, canonical, this.logger),
552
642
  };
553
643
  }
554
644
  /**
@@ -577,7 +667,7 @@ export class Submesh {
577
667
  return {
578
668
  ...verified,
579
669
  canonical,
580
- subscription: await syncVerifiedProviderSubscription(this.repositories, canonical),
670
+ subscription: await syncVerifiedProviderSubscription(this.repositories, canonical, this.logger),
581
671
  };
582
672
  }
583
673
  /**