@sakeetech/vendure-payment-viva 0.2.1
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 +952 -0
- package/dist/api/admin-internal.controller.d.ts +59 -0
- package/dist/api/admin-internal.controller.d.ts.map +1 -0
- package/dist/api/admin-internal.controller.js +229 -0
- package/dist/api/admin-internal.controller.js.map +1 -0
- package/dist/api/admin-onboarding.controller.d.ts +72 -0
- package/dist/api/admin-onboarding.controller.d.ts.map +1 -0
- package/dist/api/admin-onboarding.controller.js +496 -0
- package/dist/api/admin-onboarding.controller.js.map +1 -0
- package/dist/api/admin-sources.controller.d.ts +50 -0
- package/dist/api/admin-sources.controller.d.ts.map +1 -0
- package/dist/api/admin-sources.controller.js +283 -0
- package/dist/api/admin-sources.controller.js.map +1 -0
- package/dist/api/shop-api.extension.d.ts +15 -0
- package/dist/api/shop-api.extension.d.ts.map +1 -0
- package/dist/api/shop-api.extension.js +35 -0
- package/dist/api/shop-api.extension.js.map +1 -0
- package/dist/api/shop-api.resolver.d.ts +42 -0
- package/dist/api/shop-api.resolver.d.ts.map +1 -0
- package/dist/api/shop-api.resolver.js +256 -0
- package/dist/api/shop-api.resolver.js.map +1 -0
- package/dist/api/webhook.controller.d.ts +58 -0
- package/dist/api/webhook.controller.d.ts.map +1 -0
- package/dist/api/webhook.controller.js +204 -0
- package/dist/api/webhook.controller.js.map +1 -0
- package/dist/cli/bin.d.ts +28 -0
- package/dist/cli/bin.d.ts.map +1 -0
- package/dist/cli/bin.js +104 -0
- package/dist/cli/bin.js.map +1 -0
- package/dist/cli/plan.d.ts +41 -0
- package/dist/cli/plan.d.ts.map +1 -0
- package/dist/cli/plan.js +115 -0
- package/dist/cli/plan.js.map +1 -0
- package/dist/cli/register-webhooks.d.ts +45 -0
- package/dist/cli/register-webhooks.d.ts.map +1 -0
- package/dist/cli/register-webhooks.js +400 -0
- package/dist/cli/register-webhooks.js.map +1 -0
- package/dist/cli/types.d.ts +75 -0
- package/dist/cli/types.d.ts.map +1 -0
- package/dist/cli/types.js +10 -0
- package/dist/cli/types.js.map +1 -0
- package/dist/constants.d.ts +35 -0
- package/dist/constants.d.ts.map +1 -0
- package/dist/constants.js +40 -0
- package/dist/constants.js.map +1 -0
- package/dist/entities/index.d.ts +4 -0
- package/dist/entities/index.d.ts.map +1 -0
- package/dist/entities/index.js +3 -0
- package/dist/entities/index.js.map +1 -0
- package/dist/entities/viva-transaction.entity.d.ts +70 -0
- package/dist/entities/viva-transaction.entity.d.ts.map +1 -0
- package/dist/entities/viva-transaction.entity.js +133 -0
- package/dist/entities/viva-transaction.entity.js.map +1 -0
- package/dist/entities/viva-webhook-event.entity.d.ts +71 -0
- package/dist/entities/viva-webhook-event.entity.d.ts.map +1 -0
- package/dist/entities/viva-webhook-event.entity.js +138 -0
- package/dist/entities/viva-webhook-event.entity.js.map +1 -0
- package/dist/index.d.ts +27 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +23 -0
- package/dist/index.js.map +1 -0
- package/dist/jobs/process-viva-webhook.handler.d.ts +95 -0
- package/dist/jobs/process-viva-webhook.handler.d.ts.map +1 -0
- package/dist/jobs/process-viva-webhook.handler.js +530 -0
- package/dist/jobs/process-viva-webhook.handler.js.map +1 -0
- package/dist/jobs/queue-names.d.ts +18 -0
- package/dist/jobs/queue-names.d.ts.map +1 -0
- package/dist/jobs/queue-names.js +19 -0
- package/dist/jobs/queue-names.js.map +1 -0
- package/dist/jobs/retention-cleanup.handler.d.ts +31 -0
- package/dist/jobs/retention-cleanup.handler.d.ts.map +1 -0
- package/dist/jobs/retention-cleanup.handler.js +94 -0
- package/dist/jobs/retention-cleanup.handler.js.map +1 -0
- package/dist/loaders/bootstrap.d.ts +28 -0
- package/dist/loaders/bootstrap.d.ts.map +1 -0
- package/dist/loaders/bootstrap.js +90 -0
- package/dist/loaders/bootstrap.js.map +1 -0
- package/dist/migrations/1714000000000-create-viva-tables.d.ts +22 -0
- package/dist/migrations/1714000000000-create-viva-tables.d.ts.map +1 -0
- package/dist/migrations/1714000000000-create-viva-tables.js +105 -0
- package/dist/migrations/1714000000000-create-viva-tables.js.map +1 -0
- package/dist/observability/metrics-state.service.d.ts +43 -0
- package/dist/observability/metrics-state.service.d.ts.map +1 -0
- package/dist/observability/metrics-state.service.js +207 -0
- package/dist/observability/metrics-state.service.js.map +1 -0
- package/dist/payment-method-handler.d.ts +26 -0
- package/dist/payment-method-handler.d.ts.map +1 -0
- package/dist/payment-method-handler.js +693 -0
- package/dist/payment-method-handler.js.map +1 -0
- package/dist/plugin.d.ts +95 -0
- package/dist/plugin.d.ts.map +1 -0
- package/dist/plugin.js +241 -0
- package/dist/plugin.js.map +1 -0
- package/dist/providers/viva-oauth2-strategy.provider.d.ts +41 -0
- package/dist/providers/viva-oauth2-strategy.provider.d.ts.map +1 -0
- package/dist/providers/viva-oauth2-strategy.provider.js +60 -0
- package/dist/providers/viva-oauth2-strategy.provider.js.map +1 -0
- package/dist/services/connected-accounts.service.d.ts +53 -0
- package/dist/services/connected-accounts.service.d.ts.map +1 -0
- package/dist/services/connected-accounts.service.js +108 -0
- package/dist/services/connected-accounts.service.js.map +1 -0
- package/dist/services/per-merchant-semaphore.service.d.ts +49 -0
- package/dist/services/per-merchant-semaphore.service.d.ts.map +1 -0
- package/dist/services/per-merchant-semaphore.service.js +156 -0
- package/dist/services/per-merchant-semaphore.service.js.map +1 -0
- package/dist/services/state-machine.service.d.ts +100 -0
- package/dist/services/state-machine.service.d.ts.map +1 -0
- package/dist/services/state-machine.service.js +233 -0
- package/dist/services/state-machine.service.js.map +1 -0
- package/dist/types.d.ts +286 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +23 -0
- package/dist/types.js.map +1 -0
- package/dist/util/currency.d.ts +32 -0
- package/dist/util/currency.d.ts.map +1 -0
- package/dist/util/currency.js +90 -0
- package/dist/util/currency.js.map +1 -0
- package/dist/util/error-envelope.d.ts +51 -0
- package/dist/util/error-envelope.d.ts.map +1 -0
- package/dist/util/error-envelope.js +157 -0
- package/dist/util/error-envelope.js.map +1 -0
- package/dist/util/ip-allowlist.d.ts +44 -0
- package/dist/util/ip-allowlist.d.ts.map +1 -0
- package/dist/util/ip-allowlist.js +139 -0
- package/dist/util/ip-allowlist.js.map +1 -0
- package/dist/util/normalize-options.d.ts +24 -0
- package/dist/util/normalize-options.d.ts.map +1 -0
- package/dist/util/normalize-options.js +189 -0
- package/dist/util/normalize-options.js.map +1 -0
- package/dist/util/url-template.d.ts +18 -0
- package/dist/util/url-template.d.ts.map +1 -0
- package/dist/util/url-template.js +22 -0
- package/dist/util/url-template.js.map +1 -0
- package/package.json +75 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"register-webhooks.d.ts","sourceRoot":"","sources":["../../src/cli/register-webhooks.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA+BG;AAGH,KAAK,UAAU,GAAG,GAAG,CAAC;AAetB,OAAO,KAAK,EAAiD,UAAU,EAAE,MAAM,YAAY,CAAC;AAG5F,YAAY,EAAE,UAAU,EAAE,CAAC;AAwD3B;;;;;;;GAOG;AACH,wBAAsB,GAAG,CACvB,IAAI,EAAE,UAAU,EAChB,GAAG,CAAC,EAAE,MAAM,CAAC,UAAU,EACvB,UAAU,CAAC,EAAE,UAAU,GACtB,OAAO,CAAC,MAAM,CAAC,CA+BjB"}
|
|
@@ -0,0 +1,400 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* cli/register-webhooks.ts — Main CLI logic for idempotent webhook registration.
|
|
3
|
+
*
|
|
4
|
+
* Mode-aware:
|
|
5
|
+
* - ISV mode: builds the ISV webhook client and POSTs one /isv/v1/webhooks
|
|
6
|
+
* registration per V1 event type (1796, 1797, 1798, 4865, 8193, 8194).
|
|
7
|
+
* All merchants on the platform share the same webhook URL.
|
|
8
|
+
* - Merchant mode: Viva offers no programmatic registration. The CLI fetches
|
|
9
|
+
* the verification key from GET /api/messages/config/token (Basic auth,
|
|
10
|
+
* merchant variant) and prints the URLs the operator must paste into Viva
|
|
11
|
+
* Self Care → Sales → API Access → Webhooks. `--reconcile-drift` is
|
|
12
|
+
* non-applicable in merchant mode.
|
|
13
|
+
*
|
|
14
|
+
* Verification key (ISV mode):
|
|
15
|
+
* CLI generates a UUIDv4 if VIVA_WEBHOOK_VERIFICATION_KEY is not set.
|
|
16
|
+
* The key is surfaced for the operator to paste into plugin options + Viva Self Care.
|
|
17
|
+
* It is NOT posted to Viva — Viva sends a GET probe to /viva/webhook and the
|
|
18
|
+
* WebhookController returns {"key":"<that-uuid>"} from plugin config.
|
|
19
|
+
* @see src/api/webhook.controller.ts#handleVerification
|
|
20
|
+
*
|
|
21
|
+
* Exit codes:
|
|
22
|
+
* 0 — clean (no actions OR all applied successfully OR merchant manual setup printed)
|
|
23
|
+
* 1 — plan has actions but --apply was not passed (CI gate use case — ISV mode only)
|
|
24
|
+
* 2 — apply failed (HTTP/Viva error)
|
|
25
|
+
* 3 — fatal precondition (config invalid, ABORT_LIMIT_HIT)
|
|
26
|
+
*
|
|
27
|
+
* Mirrors medusa-payment-viva/src/cli/register-webhooks.ts conventions.
|
|
28
|
+
*
|
|
29
|
+
* @see docs/plans/vendure-plugin-v0.md §"CLI vendure-viva-register-webhooks" (V10)
|
|
30
|
+
* @see references/viva-docs/md/webhooks-for-payments.txt:134 (10-URL limit)
|
|
31
|
+
* @see docs/plans/multi-mode-v0.md §9.5 (CLI behaviour matrix)
|
|
32
|
+
*/
|
|
33
|
+
import { randomUUID } from 'node:crypto';
|
|
34
|
+
import { IsvWebhooks, IsvHttpClient, } from '@sakeetech/viva-payments-core/isv';
|
|
35
|
+
import { OAuth2ClientCredentialsStrategy, InMemoryTokenCache, AsyncMutex, } from '@sakeetech/viva-payments-core/auth';
|
|
36
|
+
import { BasicAuthClient } from '@sakeetech/viva-payments-core/legacy';
|
|
37
|
+
import { V1_EVENT_TYPE_IDS } from '@sakeetech/viva-payments-core/webhooks';
|
|
38
|
+
import { VivaApiError } from '@sakeetech/viva-payments-core/errors';
|
|
39
|
+
import { computePlan, buildOwnedPattern } from './plan.js';
|
|
40
|
+
const MERCHANT_EVENTS = Object.freeze([
|
|
41
|
+
{ id: 1796, name: 'Transaction Payment Created' },
|
|
42
|
+
{ id: 1797, name: 'Transaction Reversal Created' },
|
|
43
|
+
{ id: 1798, name: 'Transaction Payment Failed' },
|
|
44
|
+
{ id: 4865, name: 'Order Updated' },
|
|
45
|
+
]);
|
|
46
|
+
// ---------------------------------------------------------------------------
|
|
47
|
+
// Mode detection
|
|
48
|
+
// ---------------------------------------------------------------------------
|
|
49
|
+
function detectMode(env) {
|
|
50
|
+
const explicit = env['VIVA_MODE'];
|
|
51
|
+
if (explicit === 'isv' || explicit === 'merchant')
|
|
52
|
+
return explicit;
|
|
53
|
+
// Default must match the plugin runtime default (merchant) so the CLI
|
|
54
|
+
// doesn't silently dispatch ISV-only API calls for an unset operator who
|
|
55
|
+
// is actually running in merchant mode.
|
|
56
|
+
return 'merchant';
|
|
57
|
+
}
|
|
58
|
+
// ---------------------------------------------------------------------------
|
|
59
|
+
// Retry helper (Viva 5xx → one retry after 2 s)
|
|
60
|
+
// ---------------------------------------------------------------------------
|
|
61
|
+
async function withRetry(fn) {
|
|
62
|
+
try {
|
|
63
|
+
return await fn();
|
|
64
|
+
}
|
|
65
|
+
catch (err) {
|
|
66
|
+
if (err instanceof VivaApiError && err.httpStatus !== undefined && err.httpStatus >= 500) {
|
|
67
|
+
await new Promise((resolve) => setTimeout(resolve, 2000));
|
|
68
|
+
return await fn();
|
|
69
|
+
}
|
|
70
|
+
throw err;
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
// ---------------------------------------------------------------------------
|
|
74
|
+
// Main entry
|
|
75
|
+
// ---------------------------------------------------------------------------
|
|
76
|
+
/**
|
|
77
|
+
* Programmatic entry — also called by bin.ts for the CLI.
|
|
78
|
+
* Reads VIVA_* env from the provided env object (defaults to process.env).
|
|
79
|
+
*
|
|
80
|
+
* @param opts - CLI run options.
|
|
81
|
+
* @param env - Optional env override (defaults to process.env). Used in tests.
|
|
82
|
+
* @param dispatcher - Optional undici Dispatcher override (MockAgent in tests).
|
|
83
|
+
*/
|
|
84
|
+
export async function run(opts, env, dispatcher) {
|
|
85
|
+
const effectiveEnv = env ?? process.env;
|
|
86
|
+
const mode = detectMode(effectiveEnv);
|
|
87
|
+
// -------------------------------------------------------------------------
|
|
88
|
+
// 1. Resolve webhook URL (mode-agnostic).
|
|
89
|
+
// -------------------------------------------------------------------------
|
|
90
|
+
const webhookUrl = opts.webhookUrl ?? effectiveEnv['VIVA_WEBHOOK_URL'];
|
|
91
|
+
if (!webhookUrl) {
|
|
92
|
+
console.error('[vendure-viva-register-webhooks] VIVA_WEBHOOK_URL is required (or pass --webhook-url).');
|
|
93
|
+
return 3;
|
|
94
|
+
}
|
|
95
|
+
// -------------------------------------------------------------------------
|
|
96
|
+
// 2. Branch on mode.
|
|
97
|
+
// -------------------------------------------------------------------------
|
|
98
|
+
if (mode === 'merchant') {
|
|
99
|
+
return runMerchant({
|
|
100
|
+
opts,
|
|
101
|
+
webhookUrl,
|
|
102
|
+
env: effectiveEnv,
|
|
103
|
+
...(dispatcher !== undefined ? { dispatcher } : {}),
|
|
104
|
+
});
|
|
105
|
+
}
|
|
106
|
+
return runIsv({
|
|
107
|
+
opts,
|
|
108
|
+
webhookUrl,
|
|
109
|
+
env: effectiveEnv,
|
|
110
|
+
...(dispatcher !== undefined ? { dispatcher } : {}),
|
|
111
|
+
});
|
|
112
|
+
}
|
|
113
|
+
async function runMerchant(input) {
|
|
114
|
+
const { opts, webhookUrl, env, dispatcher } = input;
|
|
115
|
+
// --reconcile-drift is non-applicable in merchant mode (no list/deactivate API).
|
|
116
|
+
if (opts.reconcileDrift) {
|
|
117
|
+
if (opts.output === 'json') {
|
|
118
|
+
console.log(JSON.stringify({
|
|
119
|
+
mode: 'merchant',
|
|
120
|
+
error: 'reconcile-drift-not-supported',
|
|
121
|
+
message: '--reconcile-drift is not supported in merchant mode (manual setup only). ' +
|
|
122
|
+
'ISV mode uses this flag against POST /isv/v1/webhooks.',
|
|
123
|
+
}, null, 2));
|
|
124
|
+
}
|
|
125
|
+
else {
|
|
126
|
+
console.log('--reconcile-drift is not supported in merchant mode (manual setup only).');
|
|
127
|
+
console.log('ISV mode uses this flag against POST /isv/v1/webhooks.');
|
|
128
|
+
}
|
|
129
|
+
return 0;
|
|
130
|
+
}
|
|
131
|
+
// --dry-run: print expected URLs without fetching the key.
|
|
132
|
+
if (opts.dryRun) {
|
|
133
|
+
printMerchantInstructions({
|
|
134
|
+
webhookUrl,
|
|
135
|
+
verificationKey: undefined,
|
|
136
|
+
output: opts.output,
|
|
137
|
+
});
|
|
138
|
+
return 0;
|
|
139
|
+
}
|
|
140
|
+
if (!opts.apply) {
|
|
141
|
+
console.error('[vendure-viva-register-webhooks] Specify --dry-run or --apply.');
|
|
142
|
+
return 3;
|
|
143
|
+
}
|
|
144
|
+
// --apply: fetch verification key from Viva legacy host, then print instructions.
|
|
145
|
+
const merchantId = env['VIVA_MERCHANT_ID'];
|
|
146
|
+
const apiKey = env['VIVA_API_KEY'];
|
|
147
|
+
const environment = (env['VIVA_ENVIRONMENT'] ?? 'demo');
|
|
148
|
+
if (!merchantId || !apiKey) {
|
|
149
|
+
console.error('[vendure-viva-register-webhooks] Merchant-mode --apply requires VIVA_MERCHANT_ID and VIVA_API_KEY.');
|
|
150
|
+
return 3;
|
|
151
|
+
}
|
|
152
|
+
const basicAuth = new BasicAuthClient({
|
|
153
|
+
authVariant: 'merchant',
|
|
154
|
+
environment,
|
|
155
|
+
merchantId,
|
|
156
|
+
apiKey,
|
|
157
|
+
...(dispatcher !== undefined ? { dispatcher } : {}),
|
|
158
|
+
});
|
|
159
|
+
let verificationKey;
|
|
160
|
+
try {
|
|
161
|
+
verificationKey = await basicAuth.fetchWebhookVerificationKey();
|
|
162
|
+
}
|
|
163
|
+
catch (err) {
|
|
164
|
+
const msg = err instanceof VivaApiError ? err.message : String(err);
|
|
165
|
+
console.error(`[vendure-viva-register-webhooks] Failed to fetch verification key: ${msg}`);
|
|
166
|
+
return 2;
|
|
167
|
+
}
|
|
168
|
+
printMerchantInstructions({
|
|
169
|
+
webhookUrl,
|
|
170
|
+
verificationKey,
|
|
171
|
+
output: opts.output,
|
|
172
|
+
});
|
|
173
|
+
return 0;
|
|
174
|
+
}
|
|
175
|
+
function printMerchantInstructions(input) {
|
|
176
|
+
const { webhookUrl, verificationKey, output } = input;
|
|
177
|
+
if (output === 'json') {
|
|
178
|
+
console.log(JSON.stringify({
|
|
179
|
+
mode: 'merchant',
|
|
180
|
+
verificationKey: verificationKey ?? '<dry-run — verification key not fetched>',
|
|
181
|
+
events: MERCHANT_EVENTS.map((e) => ({
|
|
182
|
+
id: e.id,
|
|
183
|
+
name: e.name,
|
|
184
|
+
url: webhookUrl,
|
|
185
|
+
})),
|
|
186
|
+
}, null, 2));
|
|
187
|
+
return;
|
|
188
|
+
}
|
|
189
|
+
// Human-readable.
|
|
190
|
+
console.log('');
|
|
191
|
+
console.log('Manual webhook setup required (merchant mode).');
|
|
192
|
+
console.log('');
|
|
193
|
+
console.log('1. Go to Viva Self Care → Sales → API Access → Webhooks.');
|
|
194
|
+
console.log('2. For each event below, register the URL with your storefront base URL:');
|
|
195
|
+
console.log('');
|
|
196
|
+
for (const e of MERCHANT_EVENTS) {
|
|
197
|
+
console.log(` ${e.name} (${e.id}): ${webhookUrl}`);
|
|
198
|
+
}
|
|
199
|
+
console.log('');
|
|
200
|
+
console.log('3. Paste this verification key into VIVA_WEBHOOK_VERIFICATION_KEY in .env:');
|
|
201
|
+
console.log(` ${verificationKey ?? '<dry-run — verification key not fetched>'}`);
|
|
202
|
+
console.log('');
|
|
203
|
+
console.log('4. Restart your Vendure server.');
|
|
204
|
+
console.log('');
|
|
205
|
+
}
|
|
206
|
+
async function runIsv(input) {
|
|
207
|
+
const { opts, webhookUrl, env, dispatcher } = input;
|
|
208
|
+
// -------------------------------------------------------------------------
|
|
209
|
+
// Load ISV OAuth config.
|
|
210
|
+
//
|
|
211
|
+
// Preferred names: VIVA_CLIENT_ID / VIVA_CLIENT_SECRET (0.2.0+).
|
|
212
|
+
// Deprecated aliases: VIVA_ISV_CLIENT_ID / VIVA_ISV_CLIENT_SECRET (removal 0.3.0).
|
|
213
|
+
// -------------------------------------------------------------------------
|
|
214
|
+
let clientId = env['VIVA_CLIENT_ID'];
|
|
215
|
+
if (!clientId && env['VIVA_ISV_CLIENT_ID']) {
|
|
216
|
+
clientId = env['VIVA_ISV_CLIENT_ID'];
|
|
217
|
+
console.warn('[vendure-viva-register-webhooks] VIVA_ISV_CLIENT_ID is deprecated, rename to VIVA_CLIENT_ID. Removal in 0.3.0.');
|
|
218
|
+
}
|
|
219
|
+
let clientSecret = env['VIVA_CLIENT_SECRET'];
|
|
220
|
+
if (!clientSecret && env['VIVA_ISV_CLIENT_SECRET']) {
|
|
221
|
+
clientSecret = env['VIVA_ISV_CLIENT_SECRET'];
|
|
222
|
+
console.warn('[vendure-viva-register-webhooks] VIVA_ISV_CLIENT_SECRET is deprecated, rename to VIVA_CLIENT_SECRET. Removal in 0.3.0.');
|
|
223
|
+
}
|
|
224
|
+
const environment = (env['VIVA_ENVIRONMENT'] ?? 'demo');
|
|
225
|
+
if (!clientId || !clientSecret) {
|
|
226
|
+
console.error('[vendure-viva-register-webhooks] VIVA_CLIENT_ID and VIVA_CLIENT_SECRET are required.');
|
|
227
|
+
return 3;
|
|
228
|
+
}
|
|
229
|
+
// -------------------------------------------------------------------------
|
|
230
|
+
// Resolve verification key.
|
|
231
|
+
// -------------------------------------------------------------------------
|
|
232
|
+
const envKey = env['VIVA_WEBHOOK_VERIFICATION_KEY'];
|
|
233
|
+
let generatedVerificationKey;
|
|
234
|
+
if (!envKey) {
|
|
235
|
+
generatedVerificationKey = randomUUID();
|
|
236
|
+
console.warn(`[vendure-viva-register-webhooks] VIVA_WEBHOOK_VERIFICATION_KEY not set.\n` +
|
|
237
|
+
` Generated verification key: ${generatedVerificationKey}\n` +
|
|
238
|
+
` Set VIVA_WEBHOOK_VERIFICATION_KEY=${generatedVerificationKey} in your plugin options and .env.\n` +
|
|
239
|
+
` This key is returned by GET /viva/webhook to prove URL ownership to Viva.\n` +
|
|
240
|
+
` It is NOT posted to Viva — Viva fetches it from your endpoint during registration.`);
|
|
241
|
+
}
|
|
242
|
+
// -------------------------------------------------------------------------
|
|
243
|
+
// Build IsvWebhooks client.
|
|
244
|
+
// -------------------------------------------------------------------------
|
|
245
|
+
const cache = new InMemoryTokenCache();
|
|
246
|
+
const mutex = new AsyncMutex();
|
|
247
|
+
const primary = new OAuth2ClientCredentialsStrategy({
|
|
248
|
+
environment,
|
|
249
|
+
clientId,
|
|
250
|
+
clientSecret,
|
|
251
|
+
cache,
|
|
252
|
+
mutex,
|
|
253
|
+
...(dispatcher !== undefined ? { dispatcher } : {}),
|
|
254
|
+
});
|
|
255
|
+
const httpClient = new IsvHttpClient({
|
|
256
|
+
environment,
|
|
257
|
+
authStrategy: primary,
|
|
258
|
+
...(dispatcher !== undefined ? { dispatcher } : {}),
|
|
259
|
+
});
|
|
260
|
+
const isvWebhooks = new IsvWebhooks(httpClient);
|
|
261
|
+
// -------------------------------------------------------------------------
|
|
262
|
+
// Build desired state from V1_EVENT_TYPE_IDS.
|
|
263
|
+
// One URL per event type, all pointing to the same webhook endpoint.
|
|
264
|
+
// -------------------------------------------------------------------------
|
|
265
|
+
const desired = V1_EVENT_TYPE_IDS.map((eventTypeId) => ({
|
|
266
|
+
eventTypeId,
|
|
267
|
+
url: webhookUrl,
|
|
268
|
+
description: `vendure-viva-register-webhooks v1 (eventTypeId=${eventTypeId})`,
|
|
269
|
+
}));
|
|
270
|
+
// -------------------------------------------------------------------------
|
|
271
|
+
// Fetch current registrations.
|
|
272
|
+
//
|
|
273
|
+
// The ISV API has no list endpoint (probe-verified 2026-05-11). computePlan
|
|
274
|
+
// still expects a `current` slice, so we feed it `[]` — the plan reduces
|
|
275
|
+
// to REGISTER actions only.
|
|
276
|
+
// -------------------------------------------------------------------------
|
|
277
|
+
const current = [];
|
|
278
|
+
if (opts.reconcileDrift) {
|
|
279
|
+
console.warn('[vendure-viva-register-webhooks] --reconcile-drift is a no-op: the ISV API does not expose list/deactivate endpoints. ' +
|
|
280
|
+
'Clean up existing webhook drift via the Viva self-care UI.');
|
|
281
|
+
}
|
|
282
|
+
// -------------------------------------------------------------------------
|
|
283
|
+
// Compute plan.
|
|
284
|
+
// -------------------------------------------------------------------------
|
|
285
|
+
const planInput = {
|
|
286
|
+
desired,
|
|
287
|
+
current,
|
|
288
|
+
reconcileDrift: opts.reconcileDrift ?? false,
|
|
289
|
+
generatedVerificationKey,
|
|
290
|
+
};
|
|
291
|
+
if (opts.reconcileDrift) {
|
|
292
|
+
planInput.ownedHostnamePattern = buildOwnedPattern(webhookUrl);
|
|
293
|
+
}
|
|
294
|
+
const plan = computePlan(planInput);
|
|
295
|
+
// -------------------------------------------------------------------------
|
|
296
|
+
// Dry-run: print plan and exit.
|
|
297
|
+
// -------------------------------------------------------------------------
|
|
298
|
+
if (opts.dryRun) {
|
|
299
|
+
printPlan(plan, opts.output);
|
|
300
|
+
if (plan.hasFatalError)
|
|
301
|
+
return 3;
|
|
302
|
+
const hasActions = plan.actions.some((a) => a.kind === 'REGISTER' || a.kind === 'DEACTIVATE_DRIFT');
|
|
303
|
+
return hasActions ? 1 : 0;
|
|
304
|
+
}
|
|
305
|
+
// -------------------------------------------------------------------------
|
|
306
|
+
// Apply.
|
|
307
|
+
// -------------------------------------------------------------------------
|
|
308
|
+
if (opts.apply) {
|
|
309
|
+
if (plan.hasFatalError) {
|
|
310
|
+
printPlan(plan, opts.output);
|
|
311
|
+
console.error('[vendure-viva-register-webhooks] Aborting: ABORT_LIMIT_HIT in plan. ' +
|
|
312
|
+
'Deregister unused webhooks before retrying.');
|
|
313
|
+
return 3;
|
|
314
|
+
}
|
|
315
|
+
printPlan(plan, opts.output);
|
|
316
|
+
const actionsToApply = plan.actions.filter((a) => a.kind === 'REGISTER' || a.kind === 'DEACTIVATE_DRIFT');
|
|
317
|
+
for (const action of actionsToApply) {
|
|
318
|
+
if (action.kind === 'REGISTER') {
|
|
319
|
+
try {
|
|
320
|
+
await withRetry(() => isvWebhooks.registerWebhook({
|
|
321
|
+
eventTypeId: action.desired.eventTypeId,
|
|
322
|
+
url: action.desired.url,
|
|
323
|
+
}));
|
|
324
|
+
logLine(opts.output, 'applied', `REGISTER eventTypeId=${action.desired.eventTypeId} url=${action.desired.url}`);
|
|
325
|
+
}
|
|
326
|
+
catch (err) {
|
|
327
|
+
const msg = err instanceof VivaApiError ? err.message : String(err);
|
|
328
|
+
// 409 Conflict → already registered, treat as no-change
|
|
329
|
+
if (err instanceof VivaApiError && err.httpStatus === 409) {
|
|
330
|
+
logLine(opts.output, 'skip', `REGISTER eventTypeId=${action.desired.eventTypeId} already exists (409) — no change`);
|
|
331
|
+
continue;
|
|
332
|
+
}
|
|
333
|
+
console.error(`[vendure-viva-register-webhooks] REGISTER failed for eventTypeId=${action.desired.eventTypeId}: ${msg}`);
|
|
334
|
+
return 2;
|
|
335
|
+
}
|
|
336
|
+
}
|
|
337
|
+
// DEACTIVATE_DRIFT is unreachable: current=[] means computePlan never emits it.
|
|
338
|
+
}
|
|
339
|
+
logLine(opts.output, 'done', `Applied ${actionsToApply.length} action(s).`);
|
|
340
|
+
return 0;
|
|
341
|
+
}
|
|
342
|
+
console.error('[vendure-viva-register-webhooks] Specify --dry-run or --apply.');
|
|
343
|
+
return 3;
|
|
344
|
+
}
|
|
345
|
+
// ---------------------------------------------------------------------------
|
|
346
|
+
// Output helpers (mirror Medusa CLI format)
|
|
347
|
+
// ---------------------------------------------------------------------------
|
|
348
|
+
function printPlan(plan, output) {
|
|
349
|
+
if (output === 'json') {
|
|
350
|
+
console.log(JSON.stringify({
|
|
351
|
+
plan: plan.actions,
|
|
352
|
+
hasFatalError: plan.hasFatalError,
|
|
353
|
+
generatedVerificationKey: plan.generatedVerificationKey,
|
|
354
|
+
}, null, 2));
|
|
355
|
+
return;
|
|
356
|
+
}
|
|
357
|
+
// Human-readable text
|
|
358
|
+
console.log('');
|
|
359
|
+
console.log('vendure-viva-register-webhooks — Plan');
|
|
360
|
+
console.log('─'.repeat(72));
|
|
361
|
+
if (plan.generatedVerificationKey) {
|
|
362
|
+
console.log(` ⚠ Generated VIVA_WEBHOOK_VERIFICATION_KEY: ${plan.generatedVerificationKey}`);
|
|
363
|
+
console.log(' Set this value in your env and plugin config before running --apply.');
|
|
364
|
+
console.log('');
|
|
365
|
+
}
|
|
366
|
+
if (plan.actions.length === 0) {
|
|
367
|
+
console.log(' (no actions — all webhooks already registered)');
|
|
368
|
+
console.log('');
|
|
369
|
+
return;
|
|
370
|
+
}
|
|
371
|
+
for (const action of plan.actions) {
|
|
372
|
+
console.log(` ${formatAction(action)}`);
|
|
373
|
+
}
|
|
374
|
+
console.log('─'.repeat(72));
|
|
375
|
+
console.log(` ${plan.actions.length} action(s) | fatal=${plan.hasFatalError}`);
|
|
376
|
+
console.log('');
|
|
377
|
+
}
|
|
378
|
+
function formatAction(action) {
|
|
379
|
+
switch (action.kind) {
|
|
380
|
+
case 'REGISTER':
|
|
381
|
+
return `[REGISTER] eventTypeId=${action.desired.eventTypeId} url=${action.desired.url}`;
|
|
382
|
+
case 'SKIP_ALREADY_REGISTERED':
|
|
383
|
+
return `[SKIP] eventTypeId=${action.existing.eventTypeId} url=${action.existing.url}`;
|
|
384
|
+
case 'DEACTIVATE_DRIFT':
|
|
385
|
+
return `[DEACTIVATE_DRIFT] eventTypeId=${action.existing.eventTypeId} url=${action.existing.url} reason=${action.reason}`;
|
|
386
|
+
case 'WARN_LIMIT_NEAR':
|
|
387
|
+
return `[WARN_LIMIT_NEAR] eventTypeId=${action.eventTypeId} current=${action.current}/${action.limit}`;
|
|
388
|
+
case 'ABORT_LIMIT_HIT':
|
|
389
|
+
return `[ABORT_LIMIT_HIT] eventTypeId=${action.eventTypeId} current=${action.current}/${action.limit} (operator must deregister)`;
|
|
390
|
+
}
|
|
391
|
+
}
|
|
392
|
+
function logLine(output, level, message) {
|
|
393
|
+
if (output === 'json') {
|
|
394
|
+
console.log(JSON.stringify({ level, message, ts: new Date().toISOString() }));
|
|
395
|
+
}
|
|
396
|
+
else {
|
|
397
|
+
console.log(`[${level}] ${message}`);
|
|
398
|
+
}
|
|
399
|
+
}
|
|
400
|
+
//# sourceMappingURL=register-webhooks.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"register-webhooks.js","sourceRoot":"","sources":["../../src/cli/register-webhooks.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,75 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* cli/types.ts — TypeScript types for the vendure-viva-register-webhooks CLI.
|
|
3
|
+
*
|
|
4
|
+
* Mirrors medusa-payment-viva/src/cli/types.ts conventions.
|
|
5
|
+
*
|
|
6
|
+
* @see packages/medusa-payment-viva/src/cli/types.ts
|
|
7
|
+
* @see docs/plans/vendure-plugin-v0.md §"CLI vendure-viva-register-webhooks" (V10)
|
|
8
|
+
*/
|
|
9
|
+
import type { VivaEventTypeId } from '@sakeetech/viva-payments-core/types';
|
|
10
|
+
/**
|
|
11
|
+
* Locally-defined shape preserved for `computePlan`'s historical model.
|
|
12
|
+
* The ISV API has no list endpoint — `current` is always `[]` at runtime,
|
|
13
|
+
* so SKIP_ALREADY_REGISTERED and DEACTIVATE_DRIFT actions never fire.
|
|
14
|
+
*/
|
|
15
|
+
export interface WebhookRegistration {
|
|
16
|
+
webhookId?: string;
|
|
17
|
+
eventTypeId: number;
|
|
18
|
+
url: string;
|
|
19
|
+
isActive: boolean;
|
|
20
|
+
}
|
|
21
|
+
export type { VivaEventTypeId };
|
|
22
|
+
/**
|
|
23
|
+
* A single webhook registration we want to ensure exists at deploy time.
|
|
24
|
+
*/
|
|
25
|
+
export interface DesiredWebhook {
|
|
26
|
+
eventTypeId: VivaEventTypeId;
|
|
27
|
+
/** Full HTTPS URL that will receive the POST. */
|
|
28
|
+
url: string;
|
|
29
|
+
/** Optional friendly description registered with Viva. */
|
|
30
|
+
description?: string;
|
|
31
|
+
}
|
|
32
|
+
export type WebhookPlanAction = {
|
|
33
|
+
kind: 'REGISTER';
|
|
34
|
+
desired: DesiredWebhook;
|
|
35
|
+
} | {
|
|
36
|
+
kind: 'SKIP_ALREADY_REGISTERED';
|
|
37
|
+
existing: WebhookRegistration;
|
|
38
|
+
} | {
|
|
39
|
+
kind: 'DEACTIVATE_DRIFT';
|
|
40
|
+
existing: WebhookRegistration;
|
|
41
|
+
reason: string;
|
|
42
|
+
} | {
|
|
43
|
+
kind: 'WARN_LIMIT_NEAR';
|
|
44
|
+
eventTypeId: number;
|
|
45
|
+
current: number;
|
|
46
|
+
limit: number;
|
|
47
|
+
} | {
|
|
48
|
+
kind: 'ABORT_LIMIT_HIT';
|
|
49
|
+
eventTypeId: number;
|
|
50
|
+
current: number;
|
|
51
|
+
limit: number;
|
|
52
|
+
};
|
|
53
|
+
export interface PlanResult {
|
|
54
|
+
actions: WebhookPlanAction[];
|
|
55
|
+
/** True if any ABORT_LIMIT_HIT is in actions. */
|
|
56
|
+
hasFatalError: boolean;
|
|
57
|
+
/**
|
|
58
|
+
* Verification key (UUIDv4) surfaced for operator to set in env/Viva Self Care.
|
|
59
|
+
* Present when generated by the CLI (env didn't provide one).
|
|
60
|
+
*/
|
|
61
|
+
generatedVerificationKey?: string | undefined;
|
|
62
|
+
}
|
|
63
|
+
export interface RunOptions {
|
|
64
|
+
/** Print the plan and exit; do NOT mutate. */
|
|
65
|
+
dryRun: boolean;
|
|
66
|
+
/** Apply REGISTER + DEACTIVATE_DRIFT actions. */
|
|
67
|
+
apply: boolean;
|
|
68
|
+
/** Override target webhook URL. Falls back to VIVA_WEBHOOK_URL env var. */
|
|
69
|
+
webhookUrl?: string | undefined;
|
|
70
|
+
/** When true, run drift reconciliation. */
|
|
71
|
+
reconcileDrift?: boolean | undefined;
|
|
72
|
+
/** Output format: 'text' | 'json'. */
|
|
73
|
+
output: 'text' | 'json';
|
|
74
|
+
}
|
|
75
|
+
//# sourceMappingURL=types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/cli/types.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,qCAAqC,CAAC;AAE3E;;;;GAIG;AACH,MAAM,WAAW,mBAAmB;IAClC,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,WAAW,EAAE,MAAM,CAAC;IACpB,GAAG,EAAE,MAAM,CAAC;IACZ,QAAQ,EAAE,OAAO,CAAC;CACnB;AAED,YAAY,EAAE,eAAe,EAAE,CAAC;AAMhC;;GAEG;AACH,MAAM,WAAW,cAAc;IAC7B,WAAW,EAAE,eAAe,CAAC;IAC7B,iDAAiD;IACjD,GAAG,EAAE,MAAM,CAAC;IACZ,0DAA0D;IAC1D,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAMD,MAAM,MAAM,iBAAiB,GACzB;IAAE,IAAI,EAAE,UAAU,CAAC;IAAC,OAAO,EAAE,cAAc,CAAA;CAAE,GAC7C;IAAE,IAAI,EAAE,yBAAyB,CAAC;IAAC,QAAQ,EAAE,mBAAmB,CAAA;CAAE,GAClE;IAAE,IAAI,EAAE,kBAAkB,CAAC;IAAC,QAAQ,EAAE,mBAAmB,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,GAC3E;IAAE,IAAI,EAAE,iBAAiB,CAAC;IAAC,WAAW,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,GAChF;IAAE,IAAI,EAAE,iBAAiB,CAAC;IAAC,WAAW,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,CAAC;AAMrF,MAAM,WAAW,UAAU;IACzB,OAAO,EAAE,iBAAiB,EAAE,CAAC;IAC7B,iDAAiD;IACjD,aAAa,EAAE,OAAO,CAAC;IACvB;;;OAGG;IACH,wBAAwB,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;CAC/C;AAMD,MAAM,WAAW,UAAU;IACzB,8CAA8C;IAC9C,MAAM,EAAE,OAAO,CAAC;IAChB,iDAAiD;IACjD,KAAK,EAAE,OAAO,CAAC;IACf,2EAA2E;IAC3E,UAAU,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAChC,2CAA2C;IAC3C,cAAc,CAAC,EAAE,OAAO,GAAG,SAAS,CAAC;IACrC,sCAAsC;IACtC,MAAM,EAAE,MAAM,GAAG,MAAM,CAAC;CACzB"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* cli/types.ts — TypeScript types for the vendure-viva-register-webhooks CLI.
|
|
3
|
+
*
|
|
4
|
+
* Mirrors medusa-payment-viva/src/cli/types.ts conventions.
|
|
5
|
+
*
|
|
6
|
+
* @see packages/medusa-payment-viva/src/cli/types.ts
|
|
7
|
+
* @see docs/plans/vendure-plugin-v0.md §"CLI vendure-viva-register-webhooks" (V10)
|
|
8
|
+
*/
|
|
9
|
+
export {};
|
|
10
|
+
//# sourceMappingURL=types.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/cli/types.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG"}
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* constants.ts — Plugin-level constants and injection tokens.
|
|
3
|
+
*/
|
|
4
|
+
/** NestJS injection token for plugin options. */
|
|
5
|
+
export declare const VIVA_PLUGIN_OPTIONS = "VIVA_PLUGIN_OPTIONS";
|
|
6
|
+
/** Plugin name used for logging and NestJS module registration. */
|
|
7
|
+
export declare const VIVA_PLUGIN_NAME = "VivaPaymentPlugin";
|
|
8
|
+
/** Default Viva source code when none is configured per-channel. */
|
|
9
|
+
export declare const DEFAULT_SOURCE_CODE = "Default";
|
|
10
|
+
/** Default ISV platform fee (in minor units). 0 = no platform fee. */
|
|
11
|
+
export declare const DEFAULT_ISV_AMOUNT = 0;
|
|
12
|
+
/** Default webhook IP allowlist combining Viva's published demo + production CIDRs. */
|
|
13
|
+
export declare const DEFAULT_WEBHOOK_IP_ALLOWLIST: string[];
|
|
14
|
+
/** BullMQ queue name for webhook processing. */
|
|
15
|
+
export declare const VIVA_WEBHOOK_QUEUE = "viva-webhook";
|
|
16
|
+
/** BullMQ job name for processing a single webhook event. */
|
|
17
|
+
export declare const VIVA_WEBHOOK_JOB = "process-viva-webhook";
|
|
18
|
+
/**
|
|
19
|
+
* BullMQ job name alias used by the webhook controller (V6) and webhook
|
|
20
|
+
* worker handler (V7). Matches `VIVA_PROCESS_EVENT_JOB` in queue-names.ts.
|
|
21
|
+
*/
|
|
22
|
+
export declare const VIVA_PROCESS_EVENT_JOB = "process-viva-webhook";
|
|
23
|
+
/** Per-merchant semaphore max concurrency (matches Medusa A11). */
|
|
24
|
+
export declare const PER_MERCHANT_SEMAPHORE_PERMITS = 5;
|
|
25
|
+
/** Webhook event retention period in days. */
|
|
26
|
+
export declare const WEBHOOK_RETENTION_DAYS = 90;
|
|
27
|
+
/** OAuth token proactive-refresh margin in seconds (refresh 5 min before expiry). */
|
|
28
|
+
export declare const OAUTH_REFRESH_MARGIN_SECONDS = 300;
|
|
29
|
+
/** NestJS injection token for the singleton OAuth2 strategy. */
|
|
30
|
+
export declare const VIVA_OAUTH2_STRATEGY_TOKEN = "VIVA_OAUTH2_STRATEGY_TOKEN";
|
|
31
|
+
/** Vendure plugin name context string used in Logger calls. */
|
|
32
|
+
export declare const VIVA_LOG_CONTEXT = "VivaPaymentPlugin";
|
|
33
|
+
/** Bootstrap warmup: delay (ms) before the single retry attempt on failure. */
|
|
34
|
+
export declare const BOOTSTRAP_RETRY_DELAY_MS = 10000;
|
|
35
|
+
//# sourceMappingURL=constants.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"constants.d.ts","sourceRoot":"","sources":["../src/constants.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,iDAAiD;AACjD,eAAO,MAAM,mBAAmB,wBAAwB,CAAC;AAEzD,mEAAmE;AACnE,eAAO,MAAM,gBAAgB,sBAAsB,CAAC;AAEpD,oEAAoE;AACpE,eAAO,MAAM,mBAAmB,YAAY,CAAC;AAE7C,sEAAsE;AACtE,eAAO,MAAM,kBAAkB,IAAI,CAAC;AAEpC,uFAAuF;AACvF,eAAO,MAAM,4BAA4B,EAAE,MAAM,EAKhD,CAAC;AAEF,gDAAgD;AAChD,eAAO,MAAM,kBAAkB,iBAAiB,CAAC;AAEjD,6DAA6D;AAC7D,eAAO,MAAM,gBAAgB,yBAAyB,CAAC;AAEvD;;;GAGG;AACH,eAAO,MAAM,sBAAsB,yBAAmB,CAAC;AAEvD,mEAAmE;AACnE,eAAO,MAAM,8BAA8B,IAAI,CAAC;AAEhD,8CAA8C;AAC9C,eAAO,MAAM,sBAAsB,KAAK,CAAC;AAEzC,qFAAqF;AACrF,eAAO,MAAM,4BAA4B,MAAM,CAAC;AAEhD,gEAAgE;AAChE,eAAO,MAAM,0BAA0B,+BAA+B,CAAC;AAEvE,+DAA+D;AAC/D,eAAO,MAAM,gBAAgB,sBAAsB,CAAC;AAEpD,+EAA+E;AAC/E,eAAO,MAAM,wBAAwB,QAAS,CAAC"}
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* constants.ts — Plugin-level constants and injection tokens.
|
|
3
|
+
*/
|
|
4
|
+
/** NestJS injection token for plugin options. */
|
|
5
|
+
export const VIVA_PLUGIN_OPTIONS = 'VIVA_PLUGIN_OPTIONS';
|
|
6
|
+
/** Plugin name used for logging and NestJS module registration. */
|
|
7
|
+
export const VIVA_PLUGIN_NAME = 'VivaPaymentPlugin';
|
|
8
|
+
/** Default Viva source code when none is configured per-channel. */
|
|
9
|
+
export const DEFAULT_SOURCE_CODE = 'Default';
|
|
10
|
+
/** Default ISV platform fee (in minor units). 0 = no platform fee. */
|
|
11
|
+
export const DEFAULT_ISV_AMOUNT = 0;
|
|
12
|
+
/** Default webhook IP allowlist combining Viva's published demo + production CIDRs. */
|
|
13
|
+
export const DEFAULT_WEBHOOK_IP_ALLOWLIST = [
|
|
14
|
+
// Viva demo environment
|
|
15
|
+
'91.220.45.0/24',
|
|
16
|
+
// Viva production environment
|
|
17
|
+
'87.202.152.0/22',
|
|
18
|
+
];
|
|
19
|
+
/** BullMQ queue name for webhook processing. */
|
|
20
|
+
export const VIVA_WEBHOOK_QUEUE = 'viva-webhook';
|
|
21
|
+
/** BullMQ job name for processing a single webhook event. */
|
|
22
|
+
export const VIVA_WEBHOOK_JOB = 'process-viva-webhook';
|
|
23
|
+
/**
|
|
24
|
+
* BullMQ job name alias used by the webhook controller (V6) and webhook
|
|
25
|
+
* worker handler (V7). Matches `VIVA_PROCESS_EVENT_JOB` in queue-names.ts.
|
|
26
|
+
*/
|
|
27
|
+
export const VIVA_PROCESS_EVENT_JOB = VIVA_WEBHOOK_JOB;
|
|
28
|
+
/** Per-merchant semaphore max concurrency (matches Medusa A11). */
|
|
29
|
+
export const PER_MERCHANT_SEMAPHORE_PERMITS = 5;
|
|
30
|
+
/** Webhook event retention period in days. */
|
|
31
|
+
export const WEBHOOK_RETENTION_DAYS = 90;
|
|
32
|
+
/** OAuth token proactive-refresh margin in seconds (refresh 5 min before expiry). */
|
|
33
|
+
export const OAUTH_REFRESH_MARGIN_SECONDS = 300;
|
|
34
|
+
/** NestJS injection token for the singleton OAuth2 strategy. */
|
|
35
|
+
export const VIVA_OAUTH2_STRATEGY_TOKEN = 'VIVA_OAUTH2_STRATEGY_TOKEN';
|
|
36
|
+
/** Vendure plugin name context string used in Logger calls. */
|
|
37
|
+
export const VIVA_LOG_CONTEXT = 'VivaPaymentPlugin';
|
|
38
|
+
/** Bootstrap warmup: delay (ms) before the single retry attempt on failure. */
|
|
39
|
+
export const BOOTSTRAP_RETRY_DELAY_MS = 10_000;
|
|
40
|
+
//# sourceMappingURL=constants.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"constants.js","sourceRoot":"","sources":["../src/constants.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,iDAAiD;AACjD,MAAM,CAAC,MAAM,mBAAmB,GAAG,qBAAqB,CAAC;AAEzD,mEAAmE;AACnE,MAAM,CAAC,MAAM,gBAAgB,GAAG,mBAAmB,CAAC;AAEpD,oEAAoE;AACpE,MAAM,CAAC,MAAM,mBAAmB,GAAG,SAAS,CAAC;AAE7C,sEAAsE;AACtE,MAAM,CAAC,MAAM,kBAAkB,GAAG,CAAC,CAAC;AAEpC,uFAAuF;AACvF,MAAM,CAAC,MAAM,4BAA4B,GAAa;IACpD,wBAAwB;IACxB,gBAAgB;IAChB,8BAA8B;IAC9B,iBAAiB;CAClB,CAAC;AAEF,gDAAgD;AAChD,MAAM,CAAC,MAAM,kBAAkB,GAAG,cAAc,CAAC;AAEjD,6DAA6D;AAC7D,MAAM,CAAC,MAAM,gBAAgB,GAAG,sBAAsB,CAAC;AAEvD;;;GAGG;AACH,MAAM,CAAC,MAAM,sBAAsB,GAAG,gBAAgB,CAAC;AAEvD,mEAAmE;AACnE,MAAM,CAAC,MAAM,8BAA8B,GAAG,CAAC,CAAC;AAEhD,8CAA8C;AAC9C,MAAM,CAAC,MAAM,sBAAsB,GAAG,EAAE,CAAC;AAEzC,qFAAqF;AACrF,MAAM,CAAC,MAAM,4BAA4B,GAAG,GAAG,CAAC;AAEhD,gEAAgE;AAChE,MAAM,CAAC,MAAM,0BAA0B,GAAG,4BAA4B,CAAC;AAEvE,+DAA+D;AAC/D,MAAM,CAAC,MAAM,gBAAgB,GAAG,mBAAmB,CAAC;AAEpD,+EAA+E;AAC/E,MAAM,CAAC,MAAM,wBAAwB,GAAG,MAAM,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/entities/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,MAAM,8BAA8B,CAAC;AAC/D,YAAY,EAAE,qBAAqB,EAAE,MAAM,8BAA8B,CAAC;AAC1E,OAAO,EAAE,gBAAgB,EAAE,MAAM,gCAAgC,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/entities/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,MAAM,8BAA8B,CAAC;AAE/D,OAAO,EAAE,gBAAgB,EAAE,MAAM,gCAAgC,CAAC"}
|