@sakeetech/medusa-payment-viva 0.2.2
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/LICENSE +21 -0
- package/README.md +816 -0
- package/dist/api/index.d.ts +15 -0
- package/dist/api/index.d.ts.map +1 -0
- package/dist/api/index.js +22 -0
- package/dist/api/index.js.map +1 -0
- package/dist/api/middlewares.d.ts +27 -0
- package/dist/api/middlewares.d.ts.map +1 -0
- package/dist/api/middlewares.js +62 -0
- package/dist/api/middlewares.js.map +1 -0
- package/dist/api/viva/admin/_admin-auth.d.ts +26 -0
- package/dist/api/viva/admin/_admin-auth.d.ts.map +1 -0
- package/dist/api/viva/admin/_admin-auth.js +49 -0
- package/dist/api/viva/admin/_admin-auth.js.map +1 -0
- package/dist/api/viva/admin/_mode-gate.d.ts +28 -0
- package/dist/api/viva/admin/_mode-gate.d.ts.map +1 -0
- package/dist/api/viva/admin/_mode-gate.js +45 -0
- package/dist/api/viva/admin/_mode-gate.js.map +1 -0
- package/dist/api/viva/admin/connected-accounts/[id]/reconcile/route.d.ts +21 -0
- package/dist/api/viva/admin/connected-accounts/[id]/reconcile/route.d.ts.map +1 -0
- package/dist/api/viva/admin/connected-accounts/[id]/reconcile/route.js +93 -0
- package/dist/api/viva/admin/connected-accounts/[id]/reconcile/route.js.map +1 -0
- package/dist/api/viva/admin/connected-accounts/[id]/route.d.ts +18 -0
- package/dist/api/viva/admin/connected-accounts/[id]/route.d.ts.map +1 -0
- package/dist/api/viva/admin/connected-accounts/[id]/route.js +59 -0
- package/dist/api/viva/admin/connected-accounts/[id]/route.js.map +1 -0
- package/dist/api/viva/admin/connected-accounts/[id]/sources/route.d.ts +34 -0
- package/dist/api/viva/admin/connected-accounts/[id]/sources/route.d.ts.map +1 -0
- package/dist/api/viva/admin/connected-accounts/[id]/sources/route.js +234 -0
- package/dist/api/viva/admin/connected-accounts/[id]/sources/route.js.map +1 -0
- package/dist/api/viva/admin/connected-accounts/route.d.ts +19 -0
- package/dist/api/viva/admin/connected-accounts/route.d.ts.map +1 -0
- package/dist/api/viva/admin/connected-accounts/route.js +78 -0
- package/dist/api/viva/admin/connected-accounts/route.js.map +1 -0
- package/dist/api/viva/internal/auth-status/route.d.ts +19 -0
- package/dist/api/viva/internal/auth-status/route.d.ts.map +1 -0
- package/dist/api/viva/internal/auth-status/route.js +91 -0
- package/dist/api/viva/internal/auth-status/route.js.map +1 -0
- package/dist/api/viva/internal/metrics/route.d.ts +13 -0
- package/dist/api/viva/internal/metrics/route.d.ts.map +1 -0
- package/dist/api/viva/internal/metrics/route.js +48 -0
- package/dist/api/viva/internal/metrics/route.js.map +1 -0
- package/dist/api/viva/webhook/health/route.d.ts +16 -0
- package/dist/api/viva/webhook/health/route.d.ts.map +1 -0
- package/dist/api/viva/webhook/health/route.js +27 -0
- package/dist/api/viva/webhook/health/route.js.map +1 -0
- package/dist/api/viva/webhook/route.d.ts +57 -0
- package/dist/api/viva/webhook/route.d.ts.map +1 -0
- package/dist/api/viva/webhook/route.js +269 -0
- package/dist/api/viva/webhook/route.js.map +1 -0
- package/dist/cli/bin.d.ts +12 -0
- package/dist/cli/bin.d.ts.map +1 -0
- package/dist/cli/bin.js +78 -0
- package/dist/cli/bin.js.map +1 -0
- package/dist/cli/index.d.ts +12 -0
- package/dist/cli/index.d.ts.map +1 -0
- package/dist/cli/index.js +14 -0
- package/dist/cli/index.js.map +1 -0
- package/dist/cli/plan.d.ts +51 -0
- package/dist/cli/plan.d.ts.map +1 -0
- package/dist/cli/plan.js +128 -0
- package/dist/cli/plan.js.map +1 -0
- package/dist/cli/register-webhooks.d.ts +54 -0
- package/dist/cli/register-webhooks.d.ts.map +1 -0
- package/dist/cli/register-webhooks.js +366 -0
- package/dist/cli/register-webhooks.js.map +1 -0
- package/dist/cli/types.d.ts +62 -0
- package/dist/cli/types.d.ts.map +1 -0
- package/dist/cli/types.js +12 -0
- package/dist/cli/types.js.map +1 -0
- package/dist/config.d.ts +158 -0
- package/dist/config.d.ts.map +1 -0
- package/dist/config.js +236 -0
- package/dist/config.js.map +1 -0
- package/dist/index.d.ts +21 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +29 -0
- package/dist/index.js.map +1 -0
- package/dist/loaders/viva-oauth2-strategy.d.ts +26 -0
- package/dist/loaders/viva-oauth2-strategy.d.ts.map +1 -0
- package/dist/loaders/viva-oauth2-strategy.js +58 -0
- package/dist/loaders/viva-oauth2-strategy.js.map +1 -0
- package/dist/migrations/Migration_20260425000001_init_viva_payments.d.ts +19 -0
- package/dist/migrations/Migration_20260425000001_init_viva_payments.d.ts.map +1 -0
- package/dist/migrations/Migration_20260425000001_init_viva_payments.js +136 -0
- package/dist/migrations/Migration_20260425000001_init_viva_payments.js.map +1 -0
- package/dist/migrations/Migration_20260425000002_allow_null_order_code.d.ts +31 -0
- package/dist/migrations/Migration_20260425000002_allow_null_order_code.d.ts.map +1 -0
- package/dist/migrations/Migration_20260425000002_allow_null_order_code.js +71 -0
- package/dist/migrations/Migration_20260425000002_allow_null_order_code.js.map +1 -0
- package/dist/migrations/Migration_20260425000003_webhook_retry_count.d.ts +18 -0
- package/dist/migrations/Migration_20260425000003_webhook_retry_count.d.ts.map +1 -0
- package/dist/migrations/Migration_20260425000003_webhook_retry_count.js +42 -0
- package/dist/migrations/Migration_20260425000003_webhook_retry_count.js.map +1 -0
- package/dist/migrations/Migration_20260425000004_webhook_error_and_nullable_merchant.d.ts +29 -0
- package/dist/migrations/Migration_20260425000004_webhook_error_and_nullable_merchant.d.ts.map +1 -0
- package/dist/migrations/Migration_20260425000004_webhook_error_and_nullable_merchant.js +74 -0
- package/dist/migrations/Migration_20260425000004_webhook_error_and_nullable_merchant.js.map +1 -0
- package/dist/models/index.d.ts +7 -0
- package/dist/models/index.d.ts.map +1 -0
- package/dist/models/index.js +10 -0
- package/dist/models/index.js.map +1 -0
- package/dist/models/viva-tenant-merchant.d.ts +11 -0
- package/dist/models/viva-tenant-merchant.d.ts.map +1 -0
- package/dist/models/viva-tenant-merchant.js +54 -0
- package/dist/models/viva-tenant-merchant.js.map +1 -0
- package/dist/models/viva-transaction.d.ts +34 -0
- package/dist/models/viva-transaction.d.ts.map +1 -0
- package/dist/models/viva-transaction.js +104 -0
- package/dist/models/viva-transaction.js.map +1 -0
- package/dist/models/viva-webhook-event.d.ts +32 -0
- package/dist/models/viva-webhook-event.d.ts.map +1 -0
- package/dist/models/viva-webhook-event.js +88 -0
- package/dist/models/viva-webhook-event.js.map +1 -0
- package/dist/observability/config.d.ts +34 -0
- package/dist/observability/config.d.ts.map +1 -0
- package/dist/observability/config.js +57 -0
- package/dist/observability/config.js.map +1 -0
- package/dist/observability/index.d.ts +8 -0
- package/dist/observability/index.d.ts.map +1 -0
- package/dist/observability/index.js +15 -0
- package/dist/observability/index.js.map +1 -0
- package/dist/observability/prom-metrics.d.ts +41 -0
- package/dist/observability/prom-metrics.d.ts.map +1 -0
- package/dist/observability/prom-metrics.js +219 -0
- package/dist/observability/prom-metrics.js.map +1 -0
- package/dist/providers/payment-provider.d.ts +19 -0
- package/dist/providers/payment-provider.d.ts.map +1 -0
- package/dist/providers/payment-provider.js +24 -0
- package/dist/providers/payment-provider.js.map +1 -0
- package/dist/resolvers/auth-strategy-factory.d.ts +42 -0
- package/dist/resolvers/auth-strategy-factory.d.ts.map +1 -0
- package/dist/resolvers/auth-strategy-factory.js +60 -0
- package/dist/resolvers/auth-strategy-factory.js.map +1 -0
- package/dist/resolvers/tenant-resolver.d.ts +104 -0
- package/dist/resolvers/tenant-resolver.d.ts.map +1 -0
- package/dist/resolvers/tenant-resolver.js +118 -0
- package/dist/resolvers/tenant-resolver.js.map +1 -0
- package/dist/service.d.ts +200 -0
- package/dist/service.d.ts.map +1 -0
- package/dist/service.js +1003 -0
- package/dist/service.js.map +1 -0
- package/dist/subscribers/index.d.ts +5 -0
- package/dist/subscribers/index.d.ts.map +1 -0
- package/dist/subscribers/index.js +10 -0
- package/dist/subscribers/index.js.map +1 -0
- package/dist/subscribers/viva-webhook-event.d.ts +38 -0
- package/dist/subscribers/viva-webhook-event.d.ts.map +1 -0
- package/dist/subscribers/viva-webhook-event.js +133 -0
- package/dist/subscribers/viva-webhook-event.js.map +1 -0
- package/dist/workflows/cleanup-old-webhook-events.d.ts +39 -0
- package/dist/workflows/cleanup-old-webhook-events.d.ts.map +1 -0
- package/dist/workflows/cleanup-old-webhook-events.js +68 -0
- package/dist/workflows/cleanup-old-webhook-events.js.map +1 -0
- package/dist/workflows/index.d.ts +14 -0
- package/dist/workflows/index.d.ts.map +1 -0
- package/dist/workflows/index.js +19 -0
- package/dist/workflows/index.js.map +1 -0
- package/dist/workflows/per-tenant-semaphore.d.ts +47 -0
- package/dist/workflows/per-tenant-semaphore.d.ts.map +1 -0
- package/dist/workflows/per-tenant-semaphore.js +89 -0
- package/dist/workflows/per-tenant-semaphore.js.map +1 -0
- package/dist/workflows/process-webhook-event.d.ts +80 -0
- package/dist/workflows/process-webhook-event.d.ts.map +1 -0
- package/dist/workflows/process-webhook-event.js +280 -0
- package/dist/workflows/process-webhook-event.js.map +1 -0
- package/dist/workflows/reprocess-unresolved-tenants.d.ts +58 -0
- package/dist/workflows/reprocess-unresolved-tenants.d.ts.map +1 -0
- package/dist/workflows/reprocess-unresolved-tenants.js +121 -0
- package/dist/workflows/reprocess-unresolved-tenants.js.map +1 -0
- package/package.json +63 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"service.js","sourceRoot":"","sources":["../src/service.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/subscribers/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,0BAA0B,EAAE,MAAM,EAAE,MAAM,yBAAyB,CAAC"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* subscribers/index.ts — barrel export for Medusa v2 subscribers.
|
|
4
|
+
*/
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
exports.config = exports.vivaWebhookEventSubscriber = void 0;
|
|
7
|
+
var viva_webhook_event_js_1 = require("./viva-webhook-event.js");
|
|
8
|
+
Object.defineProperty(exports, "vivaWebhookEventSubscriber", { enumerable: true, get: function () { return viva_webhook_event_js_1.vivaWebhookEventSubscriber; } });
|
|
9
|
+
Object.defineProperty(exports, "config", { enumerable: true, get: function () { return viva_webhook_event_js_1.config; } });
|
|
10
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/subscribers/index.ts"],"names":[],"mappings":";AAAA;;GAEG;;;AAEH,iEAA6E;AAApE,mIAAA,0BAA0B,OAAA;AAAE,+GAAA,MAAM,OAAA"}
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* viva-webhook-event.ts — Medusa v2 subscriber for 'viva.webhook.received'.
|
|
3
|
+
*
|
|
4
|
+
* Listens to the event emitted by the webhook POST route handler after a
|
|
5
|
+
* successful INSERT INTO viva_webhook_event (A2 gate: only fires when RETURNING
|
|
6
|
+
* returned a row).
|
|
7
|
+
*
|
|
8
|
+
* Implements:
|
|
9
|
+
* - A11: per-tenant concurrency bounded to 5 via in-process PerTenantSemaphore.
|
|
10
|
+
* - A3: delegates to processWebhookEvent which uses fetch-then-lock pattern.
|
|
11
|
+
* - Error handling: VivaApiError triggers re-throw (job runner retries).
|
|
12
|
+
*
|
|
13
|
+
* @see references/viva-docs/md/isv-partner-program.txt:61 (A11 concurrency, A3 fetch-lock)
|
|
14
|
+
*/
|
|
15
|
+
import type { SubscriberArgs, SubscriberConfig } from '@medusajs/framework/subscribers';
|
|
16
|
+
interface VivaWebhookReceivedData {
|
|
17
|
+
eventId: string;
|
|
18
|
+
tenantId: string | null;
|
|
19
|
+
eventTypeId: number;
|
|
20
|
+
transactionId: string | null;
|
|
21
|
+
vivaMerchantId: string | null;
|
|
22
|
+
connectedAccountId: string | null;
|
|
23
|
+
}
|
|
24
|
+
export declare const config: SubscriberConfig;
|
|
25
|
+
/**
|
|
26
|
+
* Subscriber for 'viva.webhook.received'.
|
|
27
|
+
*
|
|
28
|
+
* 1. Acquire per-tenant semaphore slot (A11: concurrency=5).
|
|
29
|
+
* 2. Resolve the full webhook envelope from DB.
|
|
30
|
+
* 3. Call processWebhookEvent (A3 fetch-then-lock).
|
|
31
|
+
* 4. On VivaApiError: re-throw so the job runner retries with backoff.
|
|
32
|
+
* 5. Release semaphore in finally.
|
|
33
|
+
*
|
|
34
|
+
* @see references/viva-docs/md/isv-partner-program.txt:61 (A11)
|
|
35
|
+
*/
|
|
36
|
+
export declare function vivaWebhookEventSubscriber({ event, container, }: SubscriberArgs<VivaWebhookReceivedData>): Promise<void>;
|
|
37
|
+
export {};
|
|
38
|
+
//# sourceMappingURL=viva-webhook-event.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"viva-webhook-event.d.ts","sourceRoot":"","sources":["../../src/subscribers/viva-webhook-event.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAEH,OAAO,KAAK,EAAE,cAAc,EAAE,gBAAgB,EAAE,MAAM,iCAAiC,CAAC;AAgBxF,UAAU,uBAAuB;IAC/B,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;IACxB,WAAW,EAAE,MAAM,CAAC;IACpB,aAAa,EAAE,MAAM,GAAG,IAAI,CAAC;IAC7B,cAAc,EAAE,MAAM,GAAG,IAAI,CAAC;IAC9B,kBAAkB,EAAE,MAAM,GAAG,IAAI,CAAC;CACnC;AAMD,eAAO,MAAM,MAAM,EAAE,gBAKpB,CAAC;AAEF;;;;;;;;;;GAUG;AACH,wBAAsB,0BAA0B,CAAC,EAC/C,KAAK,EACL,SAAS,GACV,EAAE,cAAc,CAAC,uBAAuB,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC,CA8FzD"}
|
|
@@ -0,0 +1,133 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* viva-webhook-event.ts — Medusa v2 subscriber for 'viva.webhook.received'.
|
|
4
|
+
*
|
|
5
|
+
* Listens to the event emitted by the webhook POST route handler after a
|
|
6
|
+
* successful INSERT INTO viva_webhook_event (A2 gate: only fires when RETURNING
|
|
7
|
+
* returned a row).
|
|
8
|
+
*
|
|
9
|
+
* Implements:
|
|
10
|
+
* - A11: per-tenant concurrency bounded to 5 via in-process PerTenantSemaphore.
|
|
11
|
+
* - A3: delegates to processWebhookEvent which uses fetch-then-lock pattern.
|
|
12
|
+
* - Error handling: VivaApiError triggers re-throw (job runner retries).
|
|
13
|
+
*
|
|
14
|
+
* @see references/viva-docs/md/isv-partner-program.txt:61 (A11 concurrency, A3 fetch-lock)
|
|
15
|
+
*/
|
|
16
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
17
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
18
|
+
};
|
|
19
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
20
|
+
exports.config = void 0;
|
|
21
|
+
exports.vivaWebhookEventSubscriber = vivaWebhookEventSubscriber;
|
|
22
|
+
const utils_1 = require("@medusajs/framework/utils");
|
|
23
|
+
const pg_1 = __importDefault(require("pg"));
|
|
24
|
+
const isv_1 = require("@sakeetech/viva-payments-core/isv");
|
|
25
|
+
const payments_1 = require("@sakeetech/viva-payments-core/payments");
|
|
26
|
+
const errors_1 = require("@sakeetech/viva-payments-core/errors");
|
|
27
|
+
const auth_strategy_factory_js_1 = require("../resolvers/auth-strategy-factory.js");
|
|
28
|
+
const config_js_1 = require("../config.js");
|
|
29
|
+
const process_webhook_event_js_1 = require("../workflows/process-webhook-event.js");
|
|
30
|
+
const per_tenant_semaphore_js_1 = require("../workflows/per-tenant-semaphore.js");
|
|
31
|
+
// ---------------------------------------------------------------------------
|
|
32
|
+
// Subscriber
|
|
33
|
+
// ---------------------------------------------------------------------------
|
|
34
|
+
exports.config = {
|
|
35
|
+
event: 'viva.webhook.received',
|
|
36
|
+
context: {
|
|
37
|
+
subscriberId: 'viva-webhook-event-subscriber',
|
|
38
|
+
},
|
|
39
|
+
};
|
|
40
|
+
/**
|
|
41
|
+
* Subscriber for 'viva.webhook.received'.
|
|
42
|
+
*
|
|
43
|
+
* 1. Acquire per-tenant semaphore slot (A11: concurrency=5).
|
|
44
|
+
* 2. Resolve the full webhook envelope from DB.
|
|
45
|
+
* 3. Call processWebhookEvent (A3 fetch-then-lock).
|
|
46
|
+
* 4. On VivaApiError: re-throw so the job runner retries with backoff.
|
|
47
|
+
* 5. Release semaphore in finally.
|
|
48
|
+
*
|
|
49
|
+
* @see references/viva-docs/md/isv-partner-program.txt:61 (A11)
|
|
50
|
+
*/
|
|
51
|
+
async function vivaWebhookEventSubscriber({ event, container, }) {
|
|
52
|
+
const data = event.data;
|
|
53
|
+
if (!data?.eventId) {
|
|
54
|
+
return;
|
|
55
|
+
}
|
|
56
|
+
const tenantKey = data.tenantId ?? '__unresolved__';
|
|
57
|
+
// A11: acquire per-tenant semaphore slot (max 5 concurrent per tenant)
|
|
58
|
+
const release = await per_tenant_semaphore_js_1.defaultSemaphore.acquire(tenantKey);
|
|
59
|
+
try {
|
|
60
|
+
const logger = container.resolve('logger') ?? { info: () => undefined, warn: () => undefined, error: () => undefined };
|
|
61
|
+
// Build pg pool for this request
|
|
62
|
+
const connString = process.env['DATABASE_URL'] ??
|
|
63
|
+
`postgresql://${process.env['USER'] ?? 'postgres'}@localhost:5432/postgres`;
|
|
64
|
+
const pool = new pg_1.default.Pool({ connectionString: connString, max: 5 });
|
|
65
|
+
try {
|
|
66
|
+
// Fetch the full envelope from the DB (we stored raw_payload at ingest time)
|
|
67
|
+
const client = await pool.connect();
|
|
68
|
+
let envelope = null;
|
|
69
|
+
try {
|
|
70
|
+
const result = await client.query(`SELECT raw_payload FROM viva_webhook_event WHERE viva_webhook_event_id = $1`, [data.eventId]);
|
|
71
|
+
envelope = result.rows[0]?.raw_payload ?? null;
|
|
72
|
+
}
|
|
73
|
+
finally {
|
|
74
|
+
client.release();
|
|
75
|
+
}
|
|
76
|
+
if (!envelope) {
|
|
77
|
+
logger.warn(`[viva] Subscriber: no envelope found for eventId=${data.eventId}. Skipping.`);
|
|
78
|
+
return;
|
|
79
|
+
}
|
|
80
|
+
// Build Payments from config
|
|
81
|
+
let isvPayments;
|
|
82
|
+
let configMode = 'isv';
|
|
83
|
+
try {
|
|
84
|
+
const config = (0, config_js_1.loadConfigFromEnv)(process.env);
|
|
85
|
+
configMode = config.mode;
|
|
86
|
+
const authStrategies = (0, auth_strategy_factory_js_1.buildAuthStrategies)(config);
|
|
87
|
+
const httpClient = new isv_1.IsvHttpClient({
|
|
88
|
+
environment: config.environment,
|
|
89
|
+
authStrategy: authStrategies.primary,
|
|
90
|
+
});
|
|
91
|
+
isvPayments = new payments_1.Payments({ mode: 'isv', client: httpClient });
|
|
92
|
+
}
|
|
93
|
+
catch {
|
|
94
|
+
logger.warn(`[viva] Subscriber: could not load Viva config for eventId=${data.eventId}. Skipping.`);
|
|
95
|
+
return;
|
|
96
|
+
}
|
|
97
|
+
await (0, process_webhook_event_js_1.processWebhookEvent)({
|
|
98
|
+
eventId: data.eventId,
|
|
99
|
+
eventTypeId: data.eventTypeId,
|
|
100
|
+
envelope,
|
|
101
|
+
tenantId: data.tenantId,
|
|
102
|
+
}, {
|
|
103
|
+
pool,
|
|
104
|
+
isvPayments,
|
|
105
|
+
logger,
|
|
106
|
+
mode: configMode,
|
|
107
|
+
});
|
|
108
|
+
}
|
|
109
|
+
catch (err) {
|
|
110
|
+
// Record the failure envelope on viva_webhook_event.error + bump
|
|
111
|
+
// retry_count so the operator playbook (docs/ERRORS.md §6) and the
|
|
112
|
+
// reaper job can see why the event is stuck. Best-effort; failures
|
|
113
|
+
// here are swallowed so they don't mask the original error.
|
|
114
|
+
await (0, process_webhook_event_js_1.recordWebhookFailure)(pool, data.eventId, err);
|
|
115
|
+
if (err instanceof errors_1.VivaApiError) {
|
|
116
|
+
// Let job runner retry on Viva API errors (retriable)
|
|
117
|
+
logger.error(`[viva] Subscriber VivaApiError for eventId=${data.eventId}: ${err.message}. Rethrowing for retry.`);
|
|
118
|
+
throw err;
|
|
119
|
+
}
|
|
120
|
+
throw err;
|
|
121
|
+
}
|
|
122
|
+
finally {
|
|
123
|
+
await pool.end().catch(() => undefined);
|
|
124
|
+
}
|
|
125
|
+
}
|
|
126
|
+
finally {
|
|
127
|
+
release();
|
|
128
|
+
}
|
|
129
|
+
}
|
|
130
|
+
// Suppress unused-variable warning — container.resolve(Modules.EVENT_BUS) is used
|
|
131
|
+
// indirectly via event emission in the route handler; keep the import for type safety.
|
|
132
|
+
void utils_1.Modules;
|
|
133
|
+
//# sourceMappingURL=viva-webhook-event.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"viva-webhook-event.js","sourceRoot":"","sources":["../../src/subscribers/viva-webhook-event.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* cleanup-old-webhook-events.ts — A12 retention cleanup job.
|
|
3
|
+
*
|
|
4
|
+
* Deletes viva_webhook_event rows older than `retentionDays` (default: 90).
|
|
5
|
+
* Runs in batches to avoid long lock windows.
|
|
6
|
+
*
|
|
7
|
+
* Freshness check (A12 extended):
|
|
8
|
+
* TODO: implement metric `viva_webhook_processing_lag_seconds` — emit a gauge
|
|
9
|
+
* measuring time since the latest processed webhook per tenant. If > 25h AND
|
|
10
|
+
* recent transactions exist, emit a warning level event so the operator knows
|
|
11
|
+
* Viva webhooks may have stopped arriving. S10 owns the full implementation.
|
|
12
|
+
*
|
|
13
|
+
* @see references/viva-docs/md/isv-partner-program.txt:104 (A12 retention policy)
|
|
14
|
+
*/
|
|
15
|
+
import pg from 'pg';
|
|
16
|
+
export interface CleanupOldWebhookEventsCtx {
|
|
17
|
+
pool: pg.Pool;
|
|
18
|
+
/** Retention window in days. Default: 90. */
|
|
19
|
+
retentionDays?: number;
|
|
20
|
+
/** Soft cap per iteration to avoid long table locks. Default: 10000. */
|
|
21
|
+
batchSize?: number;
|
|
22
|
+
logger: {
|
|
23
|
+
info(msg: string): void;
|
|
24
|
+
warn(msg: string): void;
|
|
25
|
+
};
|
|
26
|
+
}
|
|
27
|
+
export interface CleanupResult {
|
|
28
|
+
deleted: number;
|
|
29
|
+
}
|
|
30
|
+
/**
|
|
31
|
+
* Delete expired webhook events in batches.
|
|
32
|
+
*
|
|
33
|
+
* Loops until no rows are deleted in a batch (idempotent per invocation).
|
|
34
|
+
* Uses a subquery-based DELETE to stay within `batchSize` rows per iteration.
|
|
35
|
+
*
|
|
36
|
+
* @see references/viva-docs/md/isv-partner-program.txt:104 (A12)
|
|
37
|
+
*/
|
|
38
|
+
export declare function cleanupOldWebhookEvents(ctx: CleanupOldWebhookEventsCtx): Promise<CleanupResult>;
|
|
39
|
+
//# sourceMappingURL=cleanup-old-webhook-events.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cleanup-old-webhook-events.d.ts","sourceRoot":"","sources":["../../src/workflows/cleanup-old-webhook-events.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAEH,OAAO,EAAE,MAAM,IAAI,CAAC;AAMpB,MAAM,WAAW,0BAA0B;IACzC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC;IACd,6CAA6C;IAC7C,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,wEAAwE;IACxE,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,MAAM,EAAE;QACN,IAAI,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI,CAAC;QACxB,IAAI,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI,CAAC;KACzB,CAAC;CACH;AAED,MAAM,WAAW,aAAa;IAC5B,OAAO,EAAE,MAAM,CAAC;CACjB;AAMD;;;;;;;GAOG;AACH,wBAAsB,uBAAuB,CAC3C,GAAG,EAAE,0BAA0B,GAC9B,OAAO,CAAC,aAAa,CAAC,CAkDxB"}
|
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* cleanup-old-webhook-events.ts — A12 retention cleanup job.
|
|
4
|
+
*
|
|
5
|
+
* Deletes viva_webhook_event rows older than `retentionDays` (default: 90).
|
|
6
|
+
* Runs in batches to avoid long lock windows.
|
|
7
|
+
*
|
|
8
|
+
* Freshness check (A12 extended):
|
|
9
|
+
* TODO: implement metric `viva_webhook_processing_lag_seconds` — emit a gauge
|
|
10
|
+
* measuring time since the latest processed webhook per tenant. If > 25h AND
|
|
11
|
+
* recent transactions exist, emit a warning level event so the operator knows
|
|
12
|
+
* Viva webhooks may have stopped arriving. S10 owns the full implementation.
|
|
13
|
+
*
|
|
14
|
+
* @see references/viva-docs/md/isv-partner-program.txt:104 (A12 retention policy)
|
|
15
|
+
*/
|
|
16
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
17
|
+
exports.cleanupOldWebhookEvents = cleanupOldWebhookEvents;
|
|
18
|
+
// ---------------------------------------------------------------------------
|
|
19
|
+
// Main function
|
|
20
|
+
// ---------------------------------------------------------------------------
|
|
21
|
+
/**
|
|
22
|
+
* Delete expired webhook events in batches.
|
|
23
|
+
*
|
|
24
|
+
* Loops until no rows are deleted in a batch (idempotent per invocation).
|
|
25
|
+
* Uses a subquery-based DELETE to stay within `batchSize` rows per iteration.
|
|
26
|
+
*
|
|
27
|
+
* @see references/viva-docs/md/isv-partner-program.txt:104 (A12)
|
|
28
|
+
*/
|
|
29
|
+
async function cleanupOldWebhookEvents(ctx) {
|
|
30
|
+
const { pool, retentionDays = 90, batchSize = 10_000, logger, } = ctx;
|
|
31
|
+
// TODO(S10): implement freshness check metric `viva_webhook_processing_lag_seconds`.
|
|
32
|
+
// For each tenant, SELECT max(received_at) FROM viva_webhook_event.
|
|
33
|
+
// If max(received_at) < now() - interval '25h' AND tenant has recent transactions,
|
|
34
|
+
// emit a warning gauge with label tenant_id.
|
|
35
|
+
// @see references/viva-docs/md/isv-partner-program.txt:104 (A12 freshness)
|
|
36
|
+
let totalDeleted = 0;
|
|
37
|
+
for (;;) {
|
|
38
|
+
const client = await pool.connect();
|
|
39
|
+
let rowCount = 0;
|
|
40
|
+
try {
|
|
41
|
+
const result = await client.query(`DELETE FROM viva_webhook_event
|
|
42
|
+
WHERE viva_webhook_event_id IN (
|
|
43
|
+
SELECT viva_webhook_event_id
|
|
44
|
+
FROM viva_webhook_event
|
|
45
|
+
WHERE received_at < now() - make_interval(days => $1)
|
|
46
|
+
LIMIT $2
|
|
47
|
+
)`, [retentionDays, batchSize]);
|
|
48
|
+
rowCount = result.rowCount ?? 0;
|
|
49
|
+
}
|
|
50
|
+
finally {
|
|
51
|
+
client.release();
|
|
52
|
+
}
|
|
53
|
+
if (rowCount > 0) {
|
|
54
|
+
totalDeleted += rowCount;
|
|
55
|
+
logger.info(`[viva] cleanupOldWebhookEvents: deleted ${rowCount} rows (total so far: ${totalDeleted})`);
|
|
56
|
+
}
|
|
57
|
+
if (rowCount === 0)
|
|
58
|
+
break;
|
|
59
|
+
}
|
|
60
|
+
if (totalDeleted === 0) {
|
|
61
|
+
logger.info(`[viva] cleanupOldWebhookEvents: no events older than ${retentionDays} days to delete.`);
|
|
62
|
+
}
|
|
63
|
+
else {
|
|
64
|
+
logger.info(`[viva] cleanupOldWebhookEvents: complete. Total deleted: ${totalDeleted}`);
|
|
65
|
+
}
|
|
66
|
+
return { deleted: totalDeleted };
|
|
67
|
+
}
|
|
68
|
+
//# sourceMappingURL=cleanup-old-webhook-events.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cleanup-old-webhook-events.js","sourceRoot":"","sources":["../../src/workflows/cleanup-old-webhook-events.ts"],"names":[],"mappings":";AAAA;;;;;;;;;;;;;GAaG;;AAoCH,0DAoDC;AAhED,8EAA8E;AAC9E,gBAAgB;AAChB,8EAA8E;AAE9E;;;;;;;GAOG;AACI,KAAK,UAAU,uBAAuB,CAC3C,GAA+B;IAE/B,MAAM,EACJ,IAAI,EACJ,aAAa,GAAG,EAAE,EAClB,SAAS,GAAG,MAAM,EAClB,MAAM,GACP,GAAG,GAAG,CAAC;IAER,qFAAqF;IACrF,oEAAoE;IACpE,mFAAmF;IACnF,6CAA6C;IAC7C,2EAA2E;IAE3E,IAAI,YAAY,GAAG,CAAC,CAAC;IAErB,SAAS,CAAC;QACR,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,OAAO,EAAE,CAAC;QACpC,IAAI,QAAQ,GAAG,CAAC,CAAC;QACjB,IAAI,CAAC;YACH,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,KAAK,CAC/B;;;;;;YAMI,EACJ,CAAC,aAAa,EAAE,SAAS,CAAC,CAC3B,CAAC;YACF,QAAQ,GAAG,MAAM,CAAC,QAAQ,IAAI,CAAC,CAAC;QAClC,CAAC;gBAAS,CAAC;YACT,MAAM,CAAC,OAAO,EAAE,CAAC;QACnB,CAAC;QAED,IAAI,QAAQ,GAAG,CAAC,EAAE,CAAC;YACjB,YAAY,IAAI,QAAQ,CAAC;YACzB,MAAM,CAAC,IAAI,CAAC,2CAA2C,QAAQ,wBAAwB,YAAY,GAAG,CAAC,CAAC;QAC1G,CAAC;QAED,IAAI,QAAQ,KAAK,CAAC;YAAE,MAAM;IAC5B,CAAC;IAED,IAAI,YAAY,KAAK,CAAC,EAAE,CAAC;QACvB,MAAM,CAAC,IAAI,CAAC,wDAAwD,aAAa,kBAAkB,CAAC,CAAC;IACvG,CAAC;SAAM,CAAC;QACN,MAAM,CAAC,IAAI,CAAC,4DAA4D,YAAY,EAAE,CAAC,CAAC;IAC1F,CAAC;IAED,OAAO,EAAE,OAAO,EAAE,YAAY,EAAE,CAAC;AACnC,CAAC"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* workflows/index.ts — barrel export for workflow functions and utilities.
|
|
3
|
+
*
|
|
4
|
+
* Exports the subscriber-callable workflow functions, reprocess job,
|
|
5
|
+
* cleanup job, and the per-tenant semaphore.
|
|
6
|
+
*/
|
|
7
|
+
export { processWebhookEvent } from './process-webhook-event.js';
|
|
8
|
+
export type { ProcessWebhookInput, ProcessWebhookContext, ProcessWebhookResult, MetricsHook } from './process-webhook-event.js';
|
|
9
|
+
export { reprocessUnresolvedTenants } from './reprocess-unresolved-tenants.js';
|
|
10
|
+
export type { ReprocessUnresolvedCtx, ReprocessResult } from './reprocess-unresolved-tenants.js';
|
|
11
|
+
export { cleanupOldWebhookEvents } from './cleanup-old-webhook-events.js';
|
|
12
|
+
export type { CleanupOldWebhookEventsCtx, CleanupResult } from './cleanup-old-webhook-events.js';
|
|
13
|
+
export { PerTenantSemaphore, defaultSemaphore } from './per-tenant-semaphore.js';
|
|
14
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/workflows/index.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,mBAAmB,EAAE,MAAM,4BAA4B,CAAC;AACjE,YAAY,EAAE,mBAAmB,EAAE,qBAAqB,EAAE,oBAAoB,EAAE,WAAW,EAAE,MAAM,4BAA4B,CAAC;AAEhI,OAAO,EAAE,0BAA0B,EAAE,MAAM,mCAAmC,CAAC;AAC/E,YAAY,EAAE,sBAAsB,EAAE,eAAe,EAAE,MAAM,mCAAmC,CAAC;AAEjG,OAAO,EAAE,uBAAuB,EAAE,MAAM,iCAAiC,CAAC;AAC1E,YAAY,EAAE,0BAA0B,EAAE,aAAa,EAAE,MAAM,iCAAiC,CAAC;AAEjG,OAAO,EAAE,kBAAkB,EAAE,gBAAgB,EAAE,MAAM,2BAA2B,CAAC"}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* workflows/index.ts — barrel export for workflow functions and utilities.
|
|
4
|
+
*
|
|
5
|
+
* Exports the subscriber-callable workflow functions, reprocess job,
|
|
6
|
+
* cleanup job, and the per-tenant semaphore.
|
|
7
|
+
*/
|
|
8
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
9
|
+
exports.defaultSemaphore = exports.PerTenantSemaphore = exports.cleanupOldWebhookEvents = exports.reprocessUnresolvedTenants = exports.processWebhookEvent = void 0;
|
|
10
|
+
var process_webhook_event_js_1 = require("./process-webhook-event.js");
|
|
11
|
+
Object.defineProperty(exports, "processWebhookEvent", { enumerable: true, get: function () { return process_webhook_event_js_1.processWebhookEvent; } });
|
|
12
|
+
var reprocess_unresolved_tenants_js_1 = require("./reprocess-unresolved-tenants.js");
|
|
13
|
+
Object.defineProperty(exports, "reprocessUnresolvedTenants", { enumerable: true, get: function () { return reprocess_unresolved_tenants_js_1.reprocessUnresolvedTenants; } });
|
|
14
|
+
var cleanup_old_webhook_events_js_1 = require("./cleanup-old-webhook-events.js");
|
|
15
|
+
Object.defineProperty(exports, "cleanupOldWebhookEvents", { enumerable: true, get: function () { return cleanup_old_webhook_events_js_1.cleanupOldWebhookEvents; } });
|
|
16
|
+
var per_tenant_semaphore_js_1 = require("./per-tenant-semaphore.js");
|
|
17
|
+
Object.defineProperty(exports, "PerTenantSemaphore", { enumerable: true, get: function () { return per_tenant_semaphore_js_1.PerTenantSemaphore; } });
|
|
18
|
+
Object.defineProperty(exports, "defaultSemaphore", { enumerable: true, get: function () { return per_tenant_semaphore_js_1.defaultSemaphore; } });
|
|
19
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/workflows/index.ts"],"names":[],"mappings":";AAAA;;;;;GAKG;;;AAEH,uEAAiE;AAAxD,+HAAA,mBAAmB,OAAA;AAG5B,qFAA+E;AAAtE,6IAAA,0BAA0B,OAAA;AAGnC,iFAA0E;AAAjE,wIAAA,uBAAuB,OAAA;AAGhC,qEAAiF;AAAxE,6HAAA,kBAAkB,OAAA;AAAE,2HAAA,gBAAgB,OAAA"}
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* per-tenant-semaphore.ts — In-process concurrency limiter keyed by tenant ID.
|
|
3
|
+
*
|
|
4
|
+
* Design choice (A11): in-process semaphore, not Redis-backed.
|
|
5
|
+
* Rationale: the plan requires per-tenant concurrency=5. Medusa v2's built-in
|
|
6
|
+
* job queue does not expose native per-key concurrency limits. A Redis-backed
|
|
7
|
+
* distributed semaphore would require an extra Redis dependency and coordination
|
|
8
|
+
* overhead. For a single-worker deployment (the common plugin scenario) an
|
|
9
|
+
* in-process semaphore is correct and zero-latency.
|
|
10
|
+
*
|
|
11
|
+
* Multi-worker note: in a horizontally-scaled deployment each worker has its own
|
|
12
|
+
* semaphore so effective concurrency per worker is 5, not 5 across all workers.
|
|
13
|
+
* If true cross-worker limiting is needed, S10/S11 should upgrade to a Redis
|
|
14
|
+
* semaphore (e.g. Redlock + a counting key). Document that upgrade path here.
|
|
15
|
+
*
|
|
16
|
+
* Memory: tenant entries are pruned from the map when `active=0` AND `waiters`
|
|
17
|
+
* is empty, preventing unbounded growth after tenant churn.
|
|
18
|
+
*/
|
|
19
|
+
/**
|
|
20
|
+
* In-process per-tenant concurrency semaphore.
|
|
21
|
+
*
|
|
22
|
+
* Usage:
|
|
23
|
+
* const sem = new PerTenantSemaphore(5);
|
|
24
|
+
* const release = await sem.acquire('tenant-123');
|
|
25
|
+
* try { ... } finally { release(); }
|
|
26
|
+
*/
|
|
27
|
+
export declare class PerTenantSemaphore {
|
|
28
|
+
private readonly maxConcurrency;
|
|
29
|
+
private readonly slots;
|
|
30
|
+
constructor(maxConcurrency: number);
|
|
31
|
+
/**
|
|
32
|
+
* Acquire a slot for the given tenant key.
|
|
33
|
+
* Resolves immediately if `active < maxConcurrency`, otherwise queues.
|
|
34
|
+
* Returns a release function — MUST be called in a finally block.
|
|
35
|
+
*/
|
|
36
|
+
acquire(tenantKey: string): Promise<() => void>;
|
|
37
|
+
private makeRelease;
|
|
38
|
+
/** For testing: current active count for a tenant. */
|
|
39
|
+
activeCount(tenantKey: string): number;
|
|
40
|
+
/** For testing: number of waiters queued for a tenant. */
|
|
41
|
+
waiterCount(tenantKey: string): number;
|
|
42
|
+
/** For testing: total number of tracked tenant keys. */
|
|
43
|
+
trackedKeys(): number;
|
|
44
|
+
}
|
|
45
|
+
/** Module-level singleton with the plan-specified max concurrency of 5. */
|
|
46
|
+
export declare const defaultSemaphore: PerTenantSemaphore;
|
|
47
|
+
//# sourceMappingURL=per-tenant-semaphore.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"per-tenant-semaphore.d.ts","sourceRoot":"","sources":["../../src/workflows/per-tenant-semaphore.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;GAiBG;AAOH;;;;;;;GAOG;AACH,qBAAa,kBAAkB;IAGjB,OAAO,CAAC,QAAQ,CAAC,cAAc;IAF3C,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAoC;gBAE7B,cAAc,EAAE,MAAM;IAEnD;;;;OAIG;IACH,OAAO,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,IAAI,CAAC;IAuB/C,OAAO,CAAC,WAAW;IAanB,sDAAsD;IACtD,WAAW,CAAC,SAAS,EAAE,MAAM,GAAG,MAAM;IAItC,0DAA0D;IAC1D,WAAW,CAAC,SAAS,EAAE,MAAM,GAAG,MAAM;IAItC,wDAAwD;IACxD,WAAW,IAAI,MAAM;CAGtB;AAED,2EAA2E;AAC3E,eAAO,MAAM,gBAAgB,oBAA4B,CAAC"}
|
|
@@ -0,0 +1,89 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* per-tenant-semaphore.ts — In-process concurrency limiter keyed by tenant ID.
|
|
4
|
+
*
|
|
5
|
+
* Design choice (A11): in-process semaphore, not Redis-backed.
|
|
6
|
+
* Rationale: the plan requires per-tenant concurrency=5. Medusa v2's built-in
|
|
7
|
+
* job queue does not expose native per-key concurrency limits. A Redis-backed
|
|
8
|
+
* distributed semaphore would require an extra Redis dependency and coordination
|
|
9
|
+
* overhead. For a single-worker deployment (the common plugin scenario) an
|
|
10
|
+
* in-process semaphore is correct and zero-latency.
|
|
11
|
+
*
|
|
12
|
+
* Multi-worker note: in a horizontally-scaled deployment each worker has its own
|
|
13
|
+
* semaphore so effective concurrency per worker is 5, not 5 across all workers.
|
|
14
|
+
* If true cross-worker limiting is needed, S10/S11 should upgrade to a Redis
|
|
15
|
+
* semaphore (e.g. Redlock + a counting key). Document that upgrade path here.
|
|
16
|
+
*
|
|
17
|
+
* Memory: tenant entries are pruned from the map when `active=0` AND `waiters`
|
|
18
|
+
* is empty, preventing unbounded growth after tenant churn.
|
|
19
|
+
*/
|
|
20
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
21
|
+
exports.defaultSemaphore = exports.PerTenantSemaphore = void 0;
|
|
22
|
+
/**
|
|
23
|
+
* In-process per-tenant concurrency semaphore.
|
|
24
|
+
*
|
|
25
|
+
* Usage:
|
|
26
|
+
* const sem = new PerTenantSemaphore(5);
|
|
27
|
+
* const release = await sem.acquire('tenant-123');
|
|
28
|
+
* try { ... } finally { release(); }
|
|
29
|
+
*/
|
|
30
|
+
class PerTenantSemaphore {
|
|
31
|
+
maxConcurrency;
|
|
32
|
+
slots = new Map();
|
|
33
|
+
constructor(maxConcurrency) {
|
|
34
|
+
this.maxConcurrency = maxConcurrency;
|
|
35
|
+
}
|
|
36
|
+
/**
|
|
37
|
+
* Acquire a slot for the given tenant key.
|
|
38
|
+
* Resolves immediately if `active < maxConcurrency`, otherwise queues.
|
|
39
|
+
* Returns a release function — MUST be called in a finally block.
|
|
40
|
+
*/
|
|
41
|
+
acquire(tenantKey) {
|
|
42
|
+
let slot = this.slots.get(tenantKey);
|
|
43
|
+
if (!slot) {
|
|
44
|
+
slot = { active: 0, waiters: [] };
|
|
45
|
+
this.slots.set(tenantKey, slot);
|
|
46
|
+
}
|
|
47
|
+
const s = slot;
|
|
48
|
+
if (s.active < this.maxConcurrency) {
|
|
49
|
+
s.active++;
|
|
50
|
+
return Promise.resolve(this.makeRelease(tenantKey, s));
|
|
51
|
+
}
|
|
52
|
+
// Queue: push a resolver and wait.
|
|
53
|
+
return new Promise((resolve) => {
|
|
54
|
+
s.waiters.push(() => {
|
|
55
|
+
s.active++;
|
|
56
|
+
resolve(this.makeRelease(tenantKey, s));
|
|
57
|
+
});
|
|
58
|
+
});
|
|
59
|
+
}
|
|
60
|
+
makeRelease(tenantKey, s) {
|
|
61
|
+
return () => {
|
|
62
|
+
s.active--;
|
|
63
|
+
if (s.waiters.length > 0) {
|
|
64
|
+
const next = s.waiters.shift();
|
|
65
|
+
next();
|
|
66
|
+
}
|
|
67
|
+
else if (s.active === 0) {
|
|
68
|
+
// Prune empty entries (no waiters, no active) to prevent map growth.
|
|
69
|
+
this.slots.delete(tenantKey);
|
|
70
|
+
}
|
|
71
|
+
};
|
|
72
|
+
}
|
|
73
|
+
/** For testing: current active count for a tenant. */
|
|
74
|
+
activeCount(tenantKey) {
|
|
75
|
+
return this.slots.get(tenantKey)?.active ?? 0;
|
|
76
|
+
}
|
|
77
|
+
/** For testing: number of waiters queued for a tenant. */
|
|
78
|
+
waiterCount(tenantKey) {
|
|
79
|
+
return this.slots.get(tenantKey)?.waiters.length ?? 0;
|
|
80
|
+
}
|
|
81
|
+
/** For testing: total number of tracked tenant keys. */
|
|
82
|
+
trackedKeys() {
|
|
83
|
+
return this.slots.size;
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
exports.PerTenantSemaphore = PerTenantSemaphore;
|
|
87
|
+
/** Module-level singleton with the plan-specified max concurrency of 5. */
|
|
88
|
+
exports.defaultSemaphore = new PerTenantSemaphore(5);
|
|
89
|
+
//# sourceMappingURL=per-tenant-semaphore.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"per-tenant-semaphore.js","sourceRoot":"","sources":["../../src/workflows/per-tenant-semaphore.ts"],"names":[],"mappings":";AAAA;;;;;;;;;;;;;;;;;GAiBG;;;AAOH;;;;;;;GAOG;AACH,MAAa,kBAAkB;IAGA;IAFZ,KAAK,GAAG,IAAI,GAAG,EAAyB,CAAC;IAE1D,YAA6B,cAAsB;QAAtB,mBAAc,GAAd,cAAc,CAAQ;IAAG,CAAC;IAEvD;;;;OAIG;IACH,OAAO,CAAC,SAAiB;QACvB,IAAI,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC;QACrC,IAAI,CAAC,IAAI,EAAE,CAAC;YACV,IAAI,GAAG,EAAE,MAAM,EAAE,CAAC,EAAE,OAAO,EAAE,EAAE,EAAE,CAAC;YAClC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,SAAS,EAAE,IAAI,CAAC,CAAC;QAClC,CAAC;QAED,MAAM,CAAC,GAAG,IAAI,CAAC;QAEf,IAAI,CAAC,CAAC,MAAM,GAAG,IAAI,CAAC,cAAc,EAAE,CAAC;YACnC,CAAC,CAAC,MAAM,EAAE,CAAC;YACX,OAAO,OAAO,CAAC,OAAO,CAAC,IAAI,CAAC,WAAW,CAAC,SAAS,EAAE,CAAC,CAAC,CAAC,CAAC;QACzD,CAAC;QAED,mCAAmC;QACnC,OAAO,IAAI,OAAO,CAAa,CAAC,OAAO,EAAE,EAAE;YACzC,CAAC,CAAC,OAAO,CAAC,IAAI,CAAC,GAAG,EAAE;gBAClB,CAAC,CAAC,MAAM,EAAE,CAAC;gBACX,OAAO,CAAC,IAAI,CAAC,WAAW,CAAC,SAAS,EAAE,CAAC,CAAC,CAAC,CAAC;YAC1C,CAAC,CAAC,CAAC;QACL,CAAC,CAAC,CAAC;IACL,CAAC;IAEO,WAAW,CAAC,SAAiB,EAAE,CAAgB;QACrD,OAAO,GAAG,EAAE;YACV,CAAC,CAAC,MAAM,EAAE,CAAC;YACX,IAAI,CAAC,CAAC,OAAO,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;gBACzB,MAAM,IAAI,GAAG,CAAC,CAAC,OAAO,CAAC,KAAK,EAAG,CAAC;gBAChC,IAAI,EAAE,CAAC;YACT,CAAC;iBAAM,IAAI,CAAC,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;gBAC1B,qEAAqE;gBACrE,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC;YAC/B,CAAC;QACH,CAAC,CAAC;IACJ,CAAC;IAED,sDAAsD;IACtD,WAAW,CAAC,SAAiB;QAC3B,OAAO,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,SAAS,CAAC,EAAE,MAAM,IAAI,CAAC,CAAC;IAChD,CAAC;IAED,0DAA0D;IAC1D,WAAW,CAAC,SAAiB;QAC3B,OAAO,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,SAAS,CAAC,EAAE,OAAO,CAAC,MAAM,IAAI,CAAC,CAAC;IACxD,CAAC;IAED,wDAAwD;IACxD,WAAW;QACT,OAAO,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC;IACzB,CAAC;CACF;AA5DD,gDA4DC;AAED,2EAA2E;AAC9D,QAAA,gBAAgB,GAAG,IAAI,kBAAkB,CAAC,CAAC,CAAC,CAAC"}
|