tupay 0.17.0 → 0.18.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +33 -0
- package/dist/cjs/cli-arguments.d.ts +28 -0
- package/dist/cjs/cli-arguments.d.ts.map +1 -0
- package/dist/cjs/cli-arguments.js +101 -0
- package/dist/cjs/cli-arguments.js.map +1 -0
- package/dist/cjs/cli.d.ts +9 -0
- package/dist/cjs/cli.d.ts.map +1 -0
- package/dist/cjs/cli.js +56 -0
- package/dist/cjs/cli.js.map +1 -0
- package/dist/cjs/index.d.ts +9 -1
- package/dist/cjs/index.d.ts.map +1 -1
- package/dist/cjs/index.js +10 -1
- package/dist/cjs/index.js.map +1 -1
- package/dist/cjs/relais.d.ts +88 -0
- package/dist/cjs/relais.d.ts.map +1 -0
- package/dist/cjs/relais.js +156 -0
- package/dist/cjs/relais.js.map +1 -0
- package/dist/cjs/webhooks.d.ts +20 -0
- package/dist/cjs/webhooks.d.ts.map +1 -1
- package/dist/cjs/webhooks.js +20 -0
- package/dist/cjs/webhooks.js.map +1 -1
- package/dist/esm/cli-arguments.d.ts +28 -0
- package/dist/esm/cli-arguments.d.ts.map +1 -0
- package/dist/esm/cli-arguments.js +96 -0
- package/dist/esm/cli-arguments.js.map +1 -0
- package/dist/esm/cli.d.ts +9 -0
- package/dist/esm/cli.d.ts.map +1 -0
- package/dist/esm/cli.js +54 -0
- package/dist/esm/cli.js.map +1 -0
- package/dist/esm/index.d.ts +9 -1
- package/dist/esm/index.d.ts.map +1 -1
- package/dist/esm/index.js +7 -2
- package/dist/esm/index.js.map +1 -1
- package/dist/esm/relais.d.ts +88 -0
- package/dist/esm/relais.d.ts.map +1 -0
- package/dist/esm/relais.js +150 -0
- package/dist/esm/relais.js.map +1 -0
- package/dist/esm/webhooks.d.ts +20 -0
- package/dist/esm/webhooks.d.ts.map +1 -1
- package/dist/esm/webhooks.js +19 -0
- package/dist/esm/webhooks.js.map +1 -1
- package/package.json +4 -1
package/dist/cjs/webhooks.d.ts
CHANGED
|
@@ -28,4 +28,24 @@ export interface ConstructEventOptions {
|
|
|
28
28
|
* est invalide — répondez alors 400 sans traiter l'événement.
|
|
29
29
|
*/
|
|
30
30
|
export declare function constructEvent(payload: string | Buffer, header: string | null | undefined, secret: string, options?: ConstructEventOptions): WebhookEvent;
|
|
31
|
+
/**
|
|
32
|
+
* Fabrique un en-tête `Tupay-Signature` valide — pour vos TESTS.
|
|
33
|
+
*
|
|
34
|
+
* Votre gestionnaire de webhooks se teste sans réseau : signez un corps
|
|
35
|
+
* avec le secret de test, passez-le à votre route, vérifiez qu'elle
|
|
36
|
+
* l'accepte — et qu'elle refuse un corps modifié.
|
|
37
|
+
*
|
|
38
|
+
* C'est aussi ce que fait `tupay listen` pour relayer vers votre poste.
|
|
39
|
+
*
|
|
40
|
+
* @example
|
|
41
|
+
* const corps = JSON.stringify(evenement)
|
|
42
|
+
* const entete = generateTestHeader({ payload: corps, secret: 'whsec_test' })
|
|
43
|
+
* await request(app).post('/hook').set('tupay-signature', entete).send(corps)
|
|
44
|
+
*/
|
|
45
|
+
export declare function generateTestHeader(params: {
|
|
46
|
+
payload: string;
|
|
47
|
+
secret: string;
|
|
48
|
+
/** Secondes Unix. Défaut : maintenant. */
|
|
49
|
+
timestamp?: number;
|
|
50
|
+
}): string;
|
|
31
51
|
//# sourceMappingURL=webhooks.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"webhooks.d.ts","sourceRoot":"","sources":["../../src/webhooks.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAIH,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,YAAY,CAAA;AAE9C,uEAAuE;AACvE,eAAO,MAAM,yBAAyB,MAAM,CAAA;AAE5C,MAAM,WAAW,qBAAqB;IACpC,kEAAkE;IAClE,gBAAgB,CAAC,EAAE,MAAM,CAAA;IACzB,iCAAiC;IACjC,UAAU,CAAC,EAAE,MAAM,CAAA;CACpB;AAgCD;;;;;;;;GAQG;AACH,wBAAgB,cAAc,CAC5B,OAAO,EAAE,MAAM,GAAG,MAAM,EACxB,MAAM,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,EACjC,MAAM,EAAE,MAAM,EACd,OAAO,GAAE,qBAA0B,GAClC,YAAY,CAsDd"}
|
|
1
|
+
{"version":3,"file":"webhooks.d.ts","sourceRoot":"","sources":["../../src/webhooks.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAIH,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,YAAY,CAAA;AAE9C,uEAAuE;AACvE,eAAO,MAAM,yBAAyB,MAAM,CAAA;AAE5C,MAAM,WAAW,qBAAqB;IACpC,kEAAkE;IAClE,gBAAgB,CAAC,EAAE,MAAM,CAAA;IACzB,iCAAiC;IACjC,UAAU,CAAC,EAAE,MAAM,CAAA;CACpB;AAgCD;;;;;;;;GAQG;AACH,wBAAgB,cAAc,CAC5B,OAAO,EAAE,MAAM,GAAG,MAAM,EACxB,MAAM,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,EACjC,MAAM,EAAE,MAAM,EACd,OAAO,GAAE,qBAA0B,GAClC,YAAY,CAsDd;AAED;;;;;;;;;;;;;GAaG;AACH,wBAAgB,kBAAkB,CAAC,MAAM,EAAE;IACzC,OAAO,EAAE,MAAM,CAAA;IACf,MAAM,EAAE,MAAM,CAAA;IACd,0CAA0C;IAC1C,SAAS,CAAC,EAAE,MAAM,CAAA;CACnB,GAAG,MAAM,CAIT"}
|
package/dist/cjs/webhooks.js
CHANGED
|
@@ -13,6 +13,7 @@
|
|
|
13
13
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
14
14
|
exports.DEFAULT_TOLERANCE_SECONDS = void 0;
|
|
15
15
|
exports.constructEvent = constructEvent;
|
|
16
|
+
exports.generateTestHeader = generateTestHeader;
|
|
16
17
|
const node_crypto_1 = require("node:crypto");
|
|
17
18
|
const errors_js_1 = require("./errors.js");
|
|
18
19
|
/** Écart maximum toléré entre l'horodatage signé et l'heure locale. */
|
|
@@ -83,4 +84,23 @@ function constructEvent(payload, header, secret, options = {}) {
|
|
|
83
84
|
throw new errors_js_1.TupaySignatureVerificationError('Signature valide mais corps illisible : le JSON est malformé.');
|
|
84
85
|
}
|
|
85
86
|
}
|
|
87
|
+
/**
|
|
88
|
+
* Fabrique un en-tête `Tupay-Signature` valide — pour vos TESTS.
|
|
89
|
+
*
|
|
90
|
+
* Votre gestionnaire de webhooks se teste sans réseau : signez un corps
|
|
91
|
+
* avec le secret de test, passez-le à votre route, vérifiez qu'elle
|
|
92
|
+
* l'accepte — et qu'elle refuse un corps modifié.
|
|
93
|
+
*
|
|
94
|
+
* C'est aussi ce que fait `tupay listen` pour relayer vers votre poste.
|
|
95
|
+
*
|
|
96
|
+
* @example
|
|
97
|
+
* const corps = JSON.stringify(evenement)
|
|
98
|
+
* const entete = generateTestHeader({ payload: corps, secret: 'whsec_test' })
|
|
99
|
+
* await request(app).post('/hook').set('tupay-signature', entete).send(corps)
|
|
100
|
+
*/
|
|
101
|
+
function generateTestHeader(params) {
|
|
102
|
+
const t = params.timestamp ?? Math.floor(Date.now() / 1000);
|
|
103
|
+
const v1 = (0, node_crypto_1.createHmac)('sha256', params.secret).update(`${t}.${params.payload}`, 'utf8').digest('hex');
|
|
104
|
+
return `t=${t},v1=${v1}`;
|
|
105
|
+
}
|
|
86
106
|
//# sourceMappingURL=webhooks.js.map
|
package/dist/cjs/webhooks.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"webhooks.js","sourceRoot":"","sources":["../../src/webhooks.ts"],"names":[],"mappings":";AAAA;;;;;;;;;;GAUG;;;AAuDH,wCA2DC;
|
|
1
|
+
{"version":3,"file":"webhooks.js","sourceRoot":"","sources":["../../src/webhooks.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Les arguments de `tupay listen`, lus sans dépendance.
|
|
3
|
+
*
|
|
4
|
+
* Séparé de `cli.ts` pour être testé sans lancer de processus.
|
|
5
|
+
*/
|
|
6
|
+
export interface CommandeEcoute {
|
|
7
|
+
readonly commande: 'listen';
|
|
8
|
+
readonly forwardTo: string;
|
|
9
|
+
readonly types: readonly string[];
|
|
10
|
+
readonly apiUrl: string | undefined;
|
|
11
|
+
readonly secret: string | undefined;
|
|
12
|
+
readonly intervalleMs: number;
|
|
13
|
+
}
|
|
14
|
+
export type Analyse = {
|
|
15
|
+
readonly ok: true;
|
|
16
|
+
readonly valeur: CommandeEcoute;
|
|
17
|
+
} | {
|
|
18
|
+
readonly ok: true;
|
|
19
|
+
readonly aide: true;
|
|
20
|
+
} | {
|
|
21
|
+
readonly ok: false;
|
|
22
|
+
readonly erreur: string;
|
|
23
|
+
};
|
|
24
|
+
export declare const AIDE = "Relaie vos \u00E9v\u00E9nements de TEST Tupay vers votre poste \u2014 sans tunnel.\n\nUsage :\n TUPAY_SECRET_KEY=tpk_test_\u2026 npx tupay listen --forward-to http://localhost:3000/webhook\n\nOptions :\n -f, --forward-to <url> l'adresse de votre serveur local (obligatoire)\n -e, --events <types> seulement ces types, s\u00E9par\u00E9s par des virgules\n (ex. payment.succeeded,invoice.paid)\n --secret <whsec_\u2026> signer avec ce secret plut\u00F4t qu'un secret neuf\n (pratique pour ne pas le recoller \u00E0 chaque fois)\n --api-url <url> l'API \u00E0 interroger (d\u00E9faut : Tupay en production)\n --interval <s> d\u00E9lai entre deux lectures, en secondes (d\u00E9faut 2)\n -h, --help cette aide\n\nSeule une cl\u00E9 de TEST est accept\u00E9e : on ne relaie pas de vrais paiements\nvers un poste de d\u00E9veloppement.";
|
|
25
|
+
export declare function analyserArguments(argv: readonly string[]): Analyse;
|
|
26
|
+
/** La clé doit être une clé de TEST. Rend le message de refus, ou `null`. */
|
|
27
|
+
export declare function refusCle(cle: string | undefined): string | null;
|
|
28
|
+
//# sourceMappingURL=cli-arguments.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cli-arguments.d.ts","sourceRoot":"","sources":["../../src/cli-arguments.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,MAAM,WAAW,cAAc;IAC7B,QAAQ,CAAC,QAAQ,EAAE,QAAQ,CAAA;IAC3B,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAA;IAC1B,QAAQ,CAAC,KAAK,EAAE,SAAS,MAAM,EAAE,CAAA;IACjC,QAAQ,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,CAAA;IACnC,QAAQ,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,CAAA;IACnC,QAAQ,CAAC,YAAY,EAAE,MAAM,CAAA;CAC9B;AAED,MAAM,MAAM,OAAO,GACf;IAAE,QAAQ,CAAC,EAAE,EAAE,IAAI,CAAC;IAAC,QAAQ,CAAC,MAAM,EAAE,cAAc,CAAA;CAAE,GACtD;IAAE,QAAQ,CAAC,EAAE,EAAE,IAAI,CAAC;IAAC,QAAQ,CAAC,IAAI,EAAE,IAAI,CAAA;CAAE,GAC1C;IAAE,QAAQ,CAAC,EAAE,EAAE,KAAK,CAAC;IAAC,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAA;CAAE,CAAA;AAEnD,eAAO,MAAM,IAAI,y6BAgBe,CAAA;AAEhC,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,SAAS,MAAM,EAAE,GAAG,OAAO,CA6DlE;AAED,6EAA6E;AAC7E,wBAAgB,QAAQ,CAAC,GAAG,EAAE,MAAM,GAAG,SAAS,GAAG,MAAM,GAAG,IAAI,CAO/D"}
|
|
@@ -0,0 +1,96 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Les arguments de `tupay listen`, lus sans dépendance.
|
|
3
|
+
*
|
|
4
|
+
* Séparé de `cli.ts` pour être testé sans lancer de processus.
|
|
5
|
+
*/
|
|
6
|
+
export const AIDE = `Relaie vos événements de TEST Tupay vers votre poste — sans tunnel.
|
|
7
|
+
|
|
8
|
+
Usage :
|
|
9
|
+
TUPAY_SECRET_KEY=tpk_test_… npx tupay listen --forward-to http://localhost:3000/webhook
|
|
10
|
+
|
|
11
|
+
Options :
|
|
12
|
+
-f, --forward-to <url> l'adresse de votre serveur local (obligatoire)
|
|
13
|
+
-e, --events <types> seulement ces types, séparés par des virgules
|
|
14
|
+
(ex. payment.succeeded,invoice.paid)
|
|
15
|
+
--secret <whsec_…> signer avec ce secret plutôt qu'un secret neuf
|
|
16
|
+
(pratique pour ne pas le recoller à chaque fois)
|
|
17
|
+
--api-url <url> l'API à interroger (défaut : Tupay en production)
|
|
18
|
+
--interval <s> délai entre deux lectures, en secondes (défaut 2)
|
|
19
|
+
-h, --help cette aide
|
|
20
|
+
|
|
21
|
+
Seule une clé de TEST est acceptée : on ne relaie pas de vrais paiements
|
|
22
|
+
vers un poste de développement.`;
|
|
23
|
+
export function analyserArguments(argv) {
|
|
24
|
+
const [commande, ...reste] = argv;
|
|
25
|
+
if (commande === undefined || commande === '-h' || commande === '--help' || commande === 'help') {
|
|
26
|
+
return { ok: true, aide: true };
|
|
27
|
+
}
|
|
28
|
+
if (commande !== 'listen')
|
|
29
|
+
return { ok: false, erreur: `Commande inconnue : « ${commande} ». Essayez « tupay listen --help ».` };
|
|
30
|
+
let forwardTo;
|
|
31
|
+
let types = [];
|
|
32
|
+
let apiUrl;
|
|
33
|
+
let secret;
|
|
34
|
+
let intervalleMs = 2000;
|
|
35
|
+
for (let i = 0; i < reste.length; i++) {
|
|
36
|
+
const brut = reste[i] ?? '';
|
|
37
|
+
// `--option=valeur` comme `--option valeur`.
|
|
38
|
+
const egal = brut.indexOf('=');
|
|
39
|
+
const nom = brut.startsWith('--') && egal > 0 ? brut.slice(0, egal) : brut;
|
|
40
|
+
const valeur = () => (brut.startsWith('--') && egal > 0 ? brut.slice(egal + 1) : reste[++i]);
|
|
41
|
+
switch (nom) {
|
|
42
|
+
case '-h':
|
|
43
|
+
case '--help':
|
|
44
|
+
return { ok: true, aide: true };
|
|
45
|
+
case '-f':
|
|
46
|
+
case '--forward-to':
|
|
47
|
+
forwardTo = valeur();
|
|
48
|
+
break;
|
|
49
|
+
case '-e':
|
|
50
|
+
case '--events':
|
|
51
|
+
types = (valeur() ?? '').split(',').map((t) => t.trim()).filter(Boolean);
|
|
52
|
+
break;
|
|
53
|
+
case '--secret':
|
|
54
|
+
secret = valeur();
|
|
55
|
+
break;
|
|
56
|
+
case '--api-url':
|
|
57
|
+
apiUrl = valeur();
|
|
58
|
+
break;
|
|
59
|
+
case '--interval': {
|
|
60
|
+
const s = Number(valeur());
|
|
61
|
+
if (!Number.isFinite(s) || s < 1 || s > 60)
|
|
62
|
+
return { ok: false, erreur: '--interval : un nombre de secondes entre 1 et 60.' };
|
|
63
|
+
intervalleMs = Math.round(s * 1000);
|
|
64
|
+
break;
|
|
65
|
+
}
|
|
66
|
+
default:
|
|
67
|
+
return { ok: false, erreur: `Option inconnue : « ${brut} ». Essayez « tupay listen --help ».` };
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
if (!forwardTo)
|
|
71
|
+
return { ok: false, erreur: '--forward-to est obligatoire : l’adresse de votre serveur local.' };
|
|
72
|
+
try {
|
|
73
|
+
const u = new URL(forwardTo);
|
|
74
|
+
if (u.protocol !== 'http:' && u.protocol !== 'https:')
|
|
75
|
+
throw new Error();
|
|
76
|
+
}
|
|
77
|
+
catch {
|
|
78
|
+
return { ok: false, erreur: `--forward-to : « ${forwardTo} » n’est pas une adresse http(s).` };
|
|
79
|
+
}
|
|
80
|
+
if (secret !== undefined && !/^whsec_[A-Za-z0-9_]{8,}$/.test(secret)) {
|
|
81
|
+
return { ok: false, erreur: '--secret : attendu un secret de la forme whsec_…' };
|
|
82
|
+
}
|
|
83
|
+
return { ok: true, valeur: { commande: 'listen', forwardTo, types, apiUrl, secret, intervalleMs } };
|
|
84
|
+
}
|
|
85
|
+
/** La clé doit être une clé de TEST. Rend le message de refus, ou `null`. */
|
|
86
|
+
export function refusCle(cle) {
|
|
87
|
+
if (!cle)
|
|
88
|
+
return 'TUPAY_SECRET_KEY est vide : exportez votre clé de test (tpk_test_…), créée dans Clés API.';
|
|
89
|
+
if (cle.startsWith('tpk_live_')) {
|
|
90
|
+
return 'Clé LIVE refusée : tupay listen ne relaie que le mode test. Utilisez une clé tpk_test_…';
|
|
91
|
+
}
|
|
92
|
+
if (!cle.startsWith('tpk_test_'))
|
|
93
|
+
return 'TUPAY_SECRET_KEY ne ressemble pas à une clé Tupay (tpk_test_…).';
|
|
94
|
+
return null;
|
|
95
|
+
}
|
|
96
|
+
//# sourceMappingURL=cli-arguments.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cli-arguments.js","sourceRoot":"","sources":["../../src/cli-arguments.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cli.d.ts","sourceRoot":"","sources":["../../src/cli.ts"],"names":[],"mappings":";AACA;;;;;GAKG"}
|
package/dist/esm/cli.js
ADDED
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
/**
|
|
3
|
+
* `tupay` — l'outil en ligne de commande du SDK.
|
|
4
|
+
*
|
|
5
|
+
* Une commande aujourd'hui : `tupay listen`, qui relaie les événements de
|
|
6
|
+
* test vers votre poste (cf. `relais.ts`).
|
|
7
|
+
*/
|
|
8
|
+
import { Tupay } from './index.js';
|
|
9
|
+
import { AIDE, analyserArguments, refusCle } from './cli-arguments.js';
|
|
10
|
+
import { Relais, ecouter, genererSecretLocal } from './relais.js';
|
|
11
|
+
async function principal() {
|
|
12
|
+
const analyse = analyserArguments(process.argv.slice(2));
|
|
13
|
+
if (!analyse.ok) {
|
|
14
|
+
console.error(analyse.erreur);
|
|
15
|
+
return 2;
|
|
16
|
+
}
|
|
17
|
+
if ('aide' in analyse) {
|
|
18
|
+
console.log(AIDE);
|
|
19
|
+
return 0;
|
|
20
|
+
}
|
|
21
|
+
const o = analyse.valeur;
|
|
22
|
+
const cle = process.env.TUPAY_SECRET_KEY;
|
|
23
|
+
const refus = refusCle(cle);
|
|
24
|
+
if (refus || !cle) {
|
|
25
|
+
console.error(refus);
|
|
26
|
+
return 2;
|
|
27
|
+
}
|
|
28
|
+
const tupay = new Tupay(cle, o.apiUrl ? { baseUrl: o.apiUrl } : {});
|
|
29
|
+
const secret = o.secret ?? genererSecretLocal();
|
|
30
|
+
const relais = new Relais({ source: tupay.events, forwardTo: o.forwardTo, secret, types: o.types });
|
|
31
|
+
const arret = new AbortController();
|
|
32
|
+
process.once('SIGINT', () => arret.abort());
|
|
33
|
+
process.once('SIGTERM', () => arret.abort());
|
|
34
|
+
try {
|
|
35
|
+
await relais.demarrer();
|
|
36
|
+
}
|
|
37
|
+
catch (err) {
|
|
38
|
+
console.error(`Impossible de lire vos événements : ${err instanceof Error ? err.message : String(err)}`);
|
|
39
|
+
return 1;
|
|
40
|
+
}
|
|
41
|
+
console.log(`Prêt. Les événements de test sont relayés vers ${o.forwardTo}`);
|
|
42
|
+
console.log(`Secret de signature de cette session : ${secret}`);
|
|
43
|
+
console.log(' → à utiliser dans constructEvent() à la place du secret de l’endpoint.');
|
|
44
|
+
if (o.types.length > 0)
|
|
45
|
+
console.log(`Seulement : ${o.types.join(', ')}`);
|
|
46
|
+
console.log('Ctrl+C pour arrêter.\n');
|
|
47
|
+
await ecouter(relais, { intervalleMs: o.intervalleMs, signal: arret.signal });
|
|
48
|
+
return 0;
|
|
49
|
+
}
|
|
50
|
+
principal().then((code) => process.exit(code), (err) => {
|
|
51
|
+
console.error(err instanceof Error ? err.message : String(err));
|
|
52
|
+
process.exit(1);
|
|
53
|
+
});
|
|
54
|
+
//# sourceMappingURL=cli.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cli.js","sourceRoot":"","sources":["../../src/cli.ts"],"names":[],"mappings":"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"}
|
package/dist/esm/index.d.ts
CHANGED
|
@@ -117,6 +117,12 @@ export declare class Tupay {
|
|
|
117
117
|
*/
|
|
118
118
|
readonly webhooks: {
|
|
119
119
|
constructEvent(payload: string | Buffer, header: string | null | undefined, secret: string, options?: ConstructEventOptions): WebhookEvent;
|
|
120
|
+
/** Un en-tête `Tupay-Signature` valide, pour tester votre gestionnaire sans réseau. */
|
|
121
|
+
generateTestHeader(params: {
|
|
122
|
+
payload: string;
|
|
123
|
+
secret: string;
|
|
124
|
+
timestamp?: number;
|
|
125
|
+
}): string;
|
|
120
126
|
};
|
|
121
127
|
/** Génère une clé d'idempotence (UUID v4). */
|
|
122
128
|
static idempotencyKey(): string;
|
|
@@ -124,7 +130,9 @@ export declare class Tupay {
|
|
|
124
130
|
export default Tupay;
|
|
125
131
|
export { TupayClient } from './client.js';
|
|
126
132
|
export type { TupayOptions, RequestOptions } from './client.js';
|
|
127
|
-
export { constructEvent, DEFAULT_TOLERANCE_SECONDS } from './webhooks.js';
|
|
133
|
+
export { constructEvent, generateTestHeader, DEFAULT_TOLERANCE_SECONDS } from './webhooks.js';
|
|
134
|
+
export { Relais, ecouter, genererSecretLocal } from './relais.js';
|
|
135
|
+
export type { OptionsRelais, SourceEvenements } from './relais.js';
|
|
128
136
|
export type { ConstructEventOptions } from './webhooks.js';
|
|
129
137
|
export { TupayError, TupayAuthenticationError, TupayPermissionError, TupayNotFoundError, TupayValidationError, TupayConflictError, TupayIdempotencyError, TupayRateLimitError, TupayApiError, TupayBaasError, TupayPaymentDeclinedError, TupayConnectionError, TupaySignatureVerificationError, } from './errors.js';
|
|
130
138
|
export type * from './types.js';
|
package/dist/esm/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAEH,OAAO,EAAe,KAAK,YAAY,EAAE,MAAM,aAAa,CAAA;AAC5D,OAAO,EAAE,cAAc,EAAE,MAAM,gCAAgC,CAAA;AAC/D,OAAO,EAAE,YAAY,EAAE,MAAM,8BAA8B,CAAA;AAC3D,OAAO,EAAE,SAAS,EAAE,MAAM,0BAA0B,CAAA;AACpD,OAAO,EAAE,cAAc,EAAE,MAAM,gCAAgC,CAAA;AAC/D,OAAO,EAAE,YAAY,EAAE,MAAM,8BAA8B,CAAA;AAC3D,OAAO,EAAE,QAAQ,EAAE,MAAM,yBAAyB,CAAA;AAClD,OAAO,EAAE,gBAAgB,EAAE,MAAM,kCAAkC,CAAA;AACnE,OAAO,EAAE,QAAQ,EAAE,MAAM,yBAAyB,CAAA;AAClD,OAAO,EAAE,MAAM,EAAE,MAAM,uBAAuB,CAAA;AAC9C,OAAO,EAAE,aAAa,EAAE,MAAM,8BAA8B,CAAA;AAC5D,OAAO,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAA;AACxD,OAAO,EAAE,mBAAmB,EAAE,MAAM,qCAAqC,CAAA;AACzE,OAAO,EAAE,OAAO,EAAE,MAAM,wBAAwB,CAAA;AAChD,OAAO,EAAE,QAAQ,EAAE,MAAM,yBAAyB,CAAA;AAClD,OAAO,EAAE,QAAQ,EAAE,MAAM,yBAAyB,CAAA;AAClD,OAAO,EAAE,QAAQ,EAAE,MAAM,yBAAyB,CAAA;AAClD,OAAO,EAAE,YAAY,EAAE,MAAM,6BAA6B,CAAA;AAC1D,OAAO,EAAE,OAAO,EAAE,MAAM,wBAAwB,CAAA;AAChD,OAAO,EAAE,gBAAgB,EAAE,MAAM,kCAAkC,CAAA;AACnE,OAAO,EAAE,SAAS,EAAE,MAAM,0BAA0B,CAAA;AACpD,OAAO,EAAE,MAAM,EAAE,MAAM,uBAAuB,CAAA;AAC9C,OAAO,EAAE,WAAW,EAAE,MAAM,6BAA6B,CAAA;AACzD,OAAO,
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAEH,OAAO,EAAe,KAAK,YAAY,EAAE,MAAM,aAAa,CAAA;AAC5D,OAAO,EAAE,cAAc,EAAE,MAAM,gCAAgC,CAAA;AAC/D,OAAO,EAAE,YAAY,EAAE,MAAM,8BAA8B,CAAA;AAC3D,OAAO,EAAE,SAAS,EAAE,MAAM,0BAA0B,CAAA;AACpD,OAAO,EAAE,cAAc,EAAE,MAAM,gCAAgC,CAAA;AAC/D,OAAO,EAAE,YAAY,EAAE,MAAM,8BAA8B,CAAA;AAC3D,OAAO,EAAE,QAAQ,EAAE,MAAM,yBAAyB,CAAA;AAClD,OAAO,EAAE,gBAAgB,EAAE,MAAM,kCAAkC,CAAA;AACnE,OAAO,EAAE,QAAQ,EAAE,MAAM,yBAAyB,CAAA;AAClD,OAAO,EAAE,MAAM,EAAE,MAAM,uBAAuB,CAAA;AAC9C,OAAO,EAAE,aAAa,EAAE,MAAM,8BAA8B,CAAA;AAC5D,OAAO,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAA;AACxD,OAAO,EAAE,mBAAmB,EAAE,MAAM,qCAAqC,CAAA;AACzE,OAAO,EAAE,OAAO,EAAE,MAAM,wBAAwB,CAAA;AAChD,OAAO,EAAE,QAAQ,EAAE,MAAM,yBAAyB,CAAA;AAClD,OAAO,EAAE,QAAQ,EAAE,MAAM,yBAAyB,CAAA;AAClD,OAAO,EAAE,QAAQ,EAAE,MAAM,yBAAyB,CAAA;AAClD,OAAO,EAAE,YAAY,EAAE,MAAM,6BAA6B,CAAA;AAC1D,OAAO,EAAE,OAAO,EAAE,MAAM,wBAAwB,CAAA;AAChD,OAAO,EAAE,gBAAgB,EAAE,MAAM,kCAAkC,CAAA;AACnE,OAAO,EAAE,SAAS,EAAE,MAAM,0BAA0B,CAAA;AACpD,OAAO,EAAE,MAAM,EAAE,MAAM,uBAAuB,CAAA;AAC9C,OAAO,EAAE,WAAW,EAAE,MAAM,6BAA6B,CAAA;AACzD,OAAO,EAAsC,KAAK,qBAAqB,EAAE,MAAM,eAAe,CAAA;AAC9F,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,YAAY,CAAA;AAE9C,qBAAa,KAAK;;IAChB,QAAQ,CAAC,cAAc,EAAE,cAAc,CAAA;IACvC,QAAQ,CAAC,YAAY,EAAE,YAAY,CAAA;IACnC,QAAQ,CAAC,YAAY,EAAE,YAAY,CAAA;IACnC,+EAA+E;IAC/E,QAAQ,CAAC,SAAS,EAAE,SAAS,CAAA;IAC7B,0EAA0E;IAC1E,QAAQ,CAAC,cAAc,EAAE,cAAc,CAAA;IACvC,mEAAmE;IACnE,QAAQ,CAAC,YAAY,EAAE,YAAY,CAAA;IACnC,yCAAyC;IACzC,QAAQ,CAAC,QAAQ,EAAE,QAAQ,CAAA;IAC3B,gEAAgE;IAChE,QAAQ,CAAC,gBAAgB,EAAE,gBAAgB,CAAA;IAC3C,QAAQ,CAAC,QAAQ,EAAE,QAAQ,CAAA;IAC3B,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAA;IACvB,QAAQ,CAAC,aAAa,EAAE,aAAa,CAAA;IACrC,QAAQ,CAAC,OAAO,EAAE,eAAe,CAAA;IACjC,QAAQ,CAAC,mBAAmB,EAAE,mBAAmB,CAAA;IACjD,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAA;IACzB,QAAQ,CAAC,QAAQ,EAAE,QAAQ,CAAA;IAC3B,8BAA8B;IAC9B,QAAQ,CAAC,QAAQ,EAAE,QAAQ,CAAA;IAC3B,QAAQ,CAAC,QAAQ,EAAE,QAAQ,CAAA;IAC3B,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAA;IACzB,QAAQ,CAAC,gBAAgB,EAAE,gBAAgB,CAAA;IAC3C,QAAQ,CAAC,SAAS,EAAE,SAAS,CAAA;IAC7B,8DAA8D;IAC9D,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAA;IACvB,sEAAsE;IACtE,QAAQ,CAAC,WAAW,EAAE,WAAW,CAAA;IAEjC,uEAAuE;IACvE,QAAQ,CAAC,QAAQ,EAAE,OAAO,CAAA;gBAOd,MAAM,EAAE,MAAM,EAAE,OAAO,GAAE,YAAiB;IA8BtD;;;;;;;;;;;;;;;;;;OAkBG;IACH,UAAU,CAAC,SAAS,EAAE,MAAM,GAAG,KAAK;IAIpC;;;;;;;;;;;;;;;;;;;;;OAqBG;IACH,QAAQ,CAAC,QAAQ;gCAEJ,MAAM,GAAG,MAAM,UAChB,MAAM,GAAG,IAAI,GAAG,SAAS,UACzB,MAAM,YACJ,qBAAqB,GAC9B,YAAY;QAGf,uFAAuF;mCAC5D;YAAE,OAAO,EAAE,MAAM,CAAC;YAAC,MAAM,EAAE,MAAM,CAAC;YAAC,SAAS,CAAC,EAAE,MAAM,CAAA;SAAE,GAAG,MAAM;MAG5F;IAED,8CAA8C;IAC9C,MAAM,CAAC,cAAc,IAAI,MAAM;CAGhC;AAED,eAAe,KAAK,CAAA;AAEpB,OAAO,EAAE,WAAW,EAAE,MAAM,aAAa,CAAA;AACzC,YAAY,EAAE,YAAY,EAAE,cAAc,EAAE,MAAM,aAAa,CAAA;AAC/D,OAAO,EAAE,cAAc,EAAE,kBAAkB,EAAE,yBAAyB,EAAE,MAAM,eAAe,CAAA;AAC7F,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,kBAAkB,EAAE,MAAM,aAAa,CAAA;AACjE,YAAY,EAAE,aAAa,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAA;AAClE,YAAY,EAAE,qBAAqB,EAAE,MAAM,eAAe,CAAA;AAE1D,OAAO,EACL,UAAU,EACV,wBAAwB,EACxB,oBAAoB,EACpB,kBAAkB,EAClB,oBAAoB,EACpB,kBAAkB,EAClB,qBAAqB,EACrB,mBAAmB,EACnB,aAAa,EACb,cAAc,EACd,yBAAyB,EACzB,oBAAoB,EACpB,+BAA+B,GAChC,MAAM,aAAa,CAAA;AAEpB,mBAAmB,YAAY,CAAA;AAE/B,YAAY,EAAE,yBAAyB,EAAE,MAAM,gCAAgC,CAAA;AAC/E,YAAY,EAAE,uBAAuB,EAAE,MAAM,8BAA8B,CAAA;AAC3E,YAAY,EAAE,sBAAsB,EAAE,MAAM,6BAA6B,CAAA;AACzE,YAAY,EACV,oBAAoB,EACpB,oBAAoB,EACpB,mBAAmB,GACpB,MAAM,0BAA0B,CAAA;AACjC,OAAO,EAAE,SAAS,EAAE,MAAM,0BAA0B,CAAA;AACpD,YAAY,EACV,yBAAyB,EACzB,yBAAyB,EACzB,wBAAwB,GACzB,MAAM,gCAAgC,CAAA;AACvC,OAAO,EAAE,cAAc,EAAE,MAAM,gCAAgC,CAAA;AAC/D,YAAY,EACV,uBAAuB,EACvB,sBAAsB,GACvB,MAAM,8BAA8B,CAAA;AACrC,OAAO,EAAE,YAAY,EAAE,MAAM,8BAA8B,CAAA;AAC3D,YAAY,EACV,mBAAmB,EACnB,mBAAmB,EACnB,kBAAkB,GACnB,MAAM,yBAAyB,CAAA;AAChC,OAAO,EAAE,QAAQ,EAAE,MAAM,yBAAyB,CAAA;AAClD,YAAY,EACV,iBAAiB,EACjB,iBAAiB,EACjB,gBAAgB,GACjB,MAAM,uBAAuB,CAAA;AAC9B,OAAO,EAAE,MAAM,EAAE,MAAM,uBAAuB,CAAA;AAC9C,YAAY,EACV,wBAAwB,EACxB,uBAAuB,GACxB,MAAM,8BAA8B,CAAA;AACrC,OAAO,EAAE,aAAa,EAAE,MAAM,8BAA8B,CAAA;AAC5D,YAAY,EAAE,kBAAkB,EAAE,MAAM,yBAAyB,CAAA;AACjE,OAAO,EAAE,QAAQ,EAAE,MAAM,yBAAyB,CAAA;AAClD,OAAO,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAA;AACxD,OAAO,EAAE,mBAAmB,EAAE,MAAM,qCAAqC,CAAA;AACzE,OAAO,EAAE,OAAO,EAAE,MAAM,wBAAwB,CAAA;AAChD,YAAY,EAAE,iBAAiB,EAAE,MAAM,wBAAwB,CAAA;AAC/D,OAAO,EAAE,QAAQ,EAAE,MAAM,yBAAyB,CAAA;AAClD,OAAO,EAAE,QAAQ,EAAE,MAAM,yBAAyB,CAAA;AAClD,YAAY,EAAE,mBAAmB,EAAE,MAAM,yBAAyB,CAAA;AAClE,YAAY,EACV,kBAAkB,EAClB,2BAA2B,GAC5B,MAAM,yBAAyB,CAAA;AAChC,YAAY,EAAE,6BAA6B,EAAE,MAAM,qCAAqC,CAAA;AACxF,YAAY,EACV,gBAAgB,EAChB,2BAA2B,EAC3B,0BAA0B,GAC3B,MAAM,kCAAkC,CAAA;AACzC,OAAO,EAAE,gBAAgB,EAAE,MAAM,kCAAkC,CAAA;AACnE,YAAY,EAAE,kBAAkB,EAAE,MAAM,yBAAyB,CAAA;AACjE,OAAO,EAAE,QAAQ,EAAE,MAAM,yBAAyB,CAAA;AAClD,YAAY,EAAE,kBAAkB,EAAE,iBAAiB,EAAE,MAAM,wBAAwB,CAAA;AACnF,YAAY,EACV,2BAA2B,EAC3B,2BAA2B,EAC3B,oBAAoB,GACrB,MAAM,kCAAkC,CAAA;AACzC,YAAY,EAAE,gBAAgB,EAAE,MAAM,uBAAuB,CAAA;AAC7D,OAAO,EAAE,MAAM,EAAE,MAAM,uBAAuB,CAAA;AAC9C,YAAY,EAAE,eAAe,EAAE,cAAc,EAAE,MAAM,6BAA6B,CAAA;AAClF,OAAO,EAAE,WAAW,EAAE,MAAM,6BAA6B,CAAA"}
|
package/dist/esm/index.js
CHANGED
|
@@ -36,7 +36,7 @@ import { WebhookEndpoints } from './resources/webhook-endpoints.js';
|
|
|
36
36
|
import { Merchants } from './resources/merchants.js';
|
|
37
37
|
import { Events } from './resources/events.js';
|
|
38
38
|
import { TestHelpers } from './resources/test-helpers.js';
|
|
39
|
-
import { constructEvent } from './webhooks.js';
|
|
39
|
+
import { constructEvent, generateTestHeader } from './webhooks.js';
|
|
40
40
|
export class Tupay {
|
|
41
41
|
paymentIntents;
|
|
42
42
|
paymentLinks;
|
|
@@ -149,6 +149,10 @@ export class Tupay {
|
|
|
149
149
|
constructEvent(payload, header, secret, options) {
|
|
150
150
|
return constructEvent(payload, header, secret, options);
|
|
151
151
|
},
|
|
152
|
+
/** Un en-tête `Tupay-Signature` valide, pour tester votre gestionnaire sans réseau. */
|
|
153
|
+
generateTestHeader(params) {
|
|
154
|
+
return generateTestHeader(params);
|
|
155
|
+
},
|
|
152
156
|
};
|
|
153
157
|
/** Génère une clé d'idempotence (UUID v4). */
|
|
154
158
|
static idempotencyKey() {
|
|
@@ -157,7 +161,8 @@ export class Tupay {
|
|
|
157
161
|
}
|
|
158
162
|
export default Tupay;
|
|
159
163
|
export { TupayClient } from './client.js';
|
|
160
|
-
export { constructEvent, DEFAULT_TOLERANCE_SECONDS } from './webhooks.js';
|
|
164
|
+
export { constructEvent, generateTestHeader, DEFAULT_TOLERANCE_SECONDS } from './webhooks.js';
|
|
165
|
+
export { Relais, ecouter, genererSecretLocal } from './relais.js';
|
|
161
166
|
export { TupayError, TupayAuthenticationError, TupayPermissionError, TupayNotFoundError, TupayValidationError, TupayConflictError, TupayIdempotencyError, TupayRateLimitError, TupayApiError, TupayBaasError, TupayPaymentDeclinedError, TupayConnectionError, TupaySignatureVerificationError, } from './errors.js';
|
|
162
167
|
export { Customers } from './resources/customers.js';
|
|
163
168
|
export { PaymentMethods } from './resources/payment-methods.js';
|
package/dist/esm/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAEH,OAAO,EAAE,WAAW,EAAqB,MAAM,aAAa,CAAA;AAC5D,OAAO,EAAE,cAAc,EAAE,MAAM,gCAAgC,CAAA;AAC/D,OAAO,EAAE,YAAY,EAAE,MAAM,8BAA8B,CAAA;AAC3D,OAAO,EAAE,SAAS,EAAE,MAAM,0BAA0B,CAAA;AACpD,OAAO,EAAE,cAAc,EAAE,MAAM,gCAAgC,CAAA;AAC/D,OAAO,EAAE,YAAY,EAAE,MAAM,8BAA8B,CAAA;AAC3D,OAAO,EAAE,QAAQ,EAAE,MAAM,yBAAyB,CAAA;AAClD,OAAO,EAAE,gBAAgB,EAAE,MAAM,kCAAkC,CAAA;AACnE,OAAO,EAAE,QAAQ,EAAE,MAAM,yBAAyB,CAAA;AAClD,OAAO,EAAE,MAAM,EAAE,MAAM,uBAAuB,CAAA;AAC9C,OAAO,EAAE,aAAa,EAAE,MAAM,8BAA8B,CAAA;AAC5D,OAAO,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAA;AACxD,OAAO,EAAE,mBAAmB,EAAE,MAAM,qCAAqC,CAAA;AACzE,OAAO,EAAE,OAAO,EAAE,MAAM,wBAAwB,CAAA;AAChD,OAAO,EAAE,QAAQ,EAAE,MAAM,yBAAyB,CAAA;AAClD,OAAO,EAAE,QAAQ,EAAE,MAAM,yBAAyB,CAAA;AAClD,OAAO,EAAE,QAAQ,EAAE,MAAM,yBAAyB,CAAA;AAClD,OAAO,EAAE,YAAY,EAAE,MAAM,6BAA6B,CAAA;AAC1D,OAAO,EAAE,OAAO,EAAE,MAAM,wBAAwB,CAAA;AAChD,OAAO,EAAE,gBAAgB,EAAE,MAAM,kCAAkC,CAAA;AACnE,OAAO,EAAE,SAAS,EAAE,MAAM,0BAA0B,CAAA;AACpD,OAAO,EAAE,MAAM,EAAE,MAAM,uBAAuB,CAAA;AAC9C,OAAO,EAAE,WAAW,EAAE,MAAM,6BAA6B,CAAA;AACzD,OAAO,EAAE,cAAc,EAA8B,MAAM,eAAe,CAAA;
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,88 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Relayer les événements de TEST vers votre poste — `tupay listen`.
|
|
3
|
+
*
|
|
4
|
+
* ── Le problème ────────────────────────────────────────────────────
|
|
5
|
+
* Tupay ne joint pas `localhost` : pour recevoir un webhook pendant que
|
|
6
|
+
* vous développez, il fallait un tunnel (Cloudflare Tunnel, ngrok) et
|
|
7
|
+
* déclarer son URL publique comme endpoint. C'est l'équivalent de
|
|
8
|
+
* `stripe listen` qui manquait.
|
|
9
|
+
*
|
|
10
|
+
* ── Comment, sans rien ouvrir ──────────────────────────────────────
|
|
11
|
+
* Le relais INTERROGE l'API (`GET /events`, avec votre clé de test) et
|
|
12
|
+
* POSTE chaque événement nouveau à votre serveur local. Aucun port à
|
|
13
|
+
* ouvrir, aucun compte de tunnel, aucun endpoint à déclarer : seule une
|
|
14
|
+
* connexion sortante vers Tupay, comme n'importe quel appel du SDK.
|
|
15
|
+
*
|
|
16
|
+
* La signature est faite avec un secret LOCAL (`whsec_…`, affiché au
|
|
17
|
+
* démarrage), et non celui d'un endpoint : le relais ne connaît pas vos
|
|
18
|
+
* secrets d'endpoint, et n'a pas à les connaître. Votre code de
|
|
19
|
+
* vérification est le même — seul le secret change.
|
|
20
|
+
*
|
|
21
|
+
* ── Ce qu'il ne fait pas ───────────────────────────────────────────
|
|
22
|
+
* Il ne relaie que ce qui naît APRÈS son démarrage (les anciens se
|
|
23
|
+
* rejouent depuis l'écran Événements), et n'enregistre aucune livraison
|
|
24
|
+
* chez Tupay : votre écran Webhooks ne le voit pas.
|
|
25
|
+
*/
|
|
26
|
+
/** Ce que le relais lit d'un événement. `tupay.events` le fournit. */
|
|
27
|
+
export interface EvenementRelaye {
|
|
28
|
+
id: string;
|
|
29
|
+
type: string;
|
|
30
|
+
created: number;
|
|
31
|
+
livemode: boolean;
|
|
32
|
+
data: {
|
|
33
|
+
object: unknown;
|
|
34
|
+
};
|
|
35
|
+
}
|
|
36
|
+
/** La source : `tupay.events` convient tel quel. */
|
|
37
|
+
export interface SourceEvenements {
|
|
38
|
+
list(params: {
|
|
39
|
+
limit?: number;
|
|
40
|
+
endingBefore?: string;
|
|
41
|
+
}): Promise<{
|
|
42
|
+
data: readonly EvenementRelaye[];
|
|
43
|
+
has_more: boolean;
|
|
44
|
+
}>;
|
|
45
|
+
}
|
|
46
|
+
export interface OptionsRelais {
|
|
47
|
+
source: SourceEvenements;
|
|
48
|
+
/** L'URL de VOTRE serveur, ex. `http://localhost:3000/webhook`. */
|
|
49
|
+
forwardTo: string;
|
|
50
|
+
/** Le secret avec lequel signer. `genererSecretLocal()` en fabrique un. */
|
|
51
|
+
secret: string;
|
|
52
|
+
/** Ne relayer que ces types (`payment.succeeded`, …). Tous par défaut. */
|
|
53
|
+
types?: readonly string[];
|
|
54
|
+
/** Version portée par l'enveloppe. Défaut `2026-01-01`. */
|
|
55
|
+
apiVersion?: string;
|
|
56
|
+
/** Une ligne par événement. Défaut : `console.log`. */
|
|
57
|
+
journal?: (ligne: string) => void;
|
|
58
|
+
/** Injectable pour les tests. */
|
|
59
|
+
fetch?: typeof globalThis.fetch;
|
|
60
|
+
}
|
|
61
|
+
export declare function genererSecretLocal(): string;
|
|
62
|
+
export declare class Relais {
|
|
63
|
+
#private;
|
|
64
|
+
constructor(options: OptionsRelais);
|
|
65
|
+
/**
|
|
66
|
+
* Retient le plus récent événement existant : seuls ceux qui naîtront
|
|
67
|
+
* ENSUITE seront relayés. Relayer l'historique au démarrage ferait
|
|
68
|
+
* recevoir à votre serveur des paiements d'hier comme s'ils arrivaient.
|
|
69
|
+
*/
|
|
70
|
+
demarrer(): Promise<void>;
|
|
71
|
+
/**
|
|
72
|
+
* Un passage : lit ce qui est né depuis le dernier, le relaie du plus
|
|
73
|
+
* ANCIEN au plus récent — l'ordre où les faits sont arrivés. Rend le
|
|
74
|
+
* nombre d'événements relayés.
|
|
75
|
+
*/
|
|
76
|
+
tour(): Promise<number>;
|
|
77
|
+
}
|
|
78
|
+
/**
|
|
79
|
+
* Tourne jusqu'à `signal`. Une erreur de l'API (réseau coupé, clé
|
|
80
|
+
* révoquée) est dite et le passage suivant réessaie : un relais qui
|
|
81
|
+
* s'arrête au premier hoquet obligerait à surveiller le relais.
|
|
82
|
+
*/
|
|
83
|
+
export declare function ecouter(relais: Relais, options?: {
|
|
84
|
+
intervalleMs?: number;
|
|
85
|
+
signal?: AbortSignal;
|
|
86
|
+
journal?: (ligne: string) => void;
|
|
87
|
+
}): Promise<void>;
|
|
88
|
+
//# sourceMappingURL=relais.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"relais.d.ts","sourceRoot":"","sources":["../../src/relais.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;GAwBG;AAKH,sEAAsE;AACtE,MAAM,WAAW,eAAe;IAC9B,EAAE,EAAE,MAAM,CAAA;IACV,IAAI,EAAE,MAAM,CAAA;IACZ,OAAO,EAAE,MAAM,CAAA;IACf,QAAQ,EAAE,OAAO,CAAA;IACjB,IAAI,EAAE;QAAE,MAAM,EAAE,OAAO,CAAA;KAAE,CAAA;CAC1B;AAED,oDAAoD;AACpD,MAAM,WAAW,gBAAgB;IAC/B,IAAI,CAAC,MAAM,EAAE;QAAE,KAAK,CAAC,EAAE,MAAM,CAAC;QAAC,YAAY,CAAC,EAAE,MAAM,CAAA;KAAE,GAAG,OAAO,CAAC;QAC/D,IAAI,EAAE,SAAS,eAAe,EAAE,CAAA;QAChC,QAAQ,EAAE,OAAO,CAAA;KAClB,CAAC,CAAA;CACH;AAED,MAAM,WAAW,aAAa;IAC5B,MAAM,EAAE,gBAAgB,CAAA;IACxB,mEAAmE;IACnE,SAAS,EAAE,MAAM,CAAA;IACjB,2EAA2E;IAC3E,MAAM,EAAE,MAAM,CAAA;IACd,0EAA0E;IAC1E,KAAK,CAAC,EAAE,SAAS,MAAM,EAAE,CAAA;IACzB,2DAA2D;IAC3D,UAAU,CAAC,EAAE,MAAM,CAAA;IACnB,uDAAuD;IACvD,OAAO,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAA;IACjC,iCAAiC;IACjC,KAAK,CAAC,EAAE,OAAO,UAAU,CAAC,KAAK,CAAA;CAChC;AAOD,wBAAgB,kBAAkB,IAAI,MAAM,CAE3C;AAED,qBAAa,MAAM;;gBAML,OAAO,EAAE,aAAa;IAYlC;;;;OAIG;IACG,QAAQ,IAAI,OAAO,CAAC,IAAI,CAAC;IAM/B;;;;OAIG;IACG,IAAI,IAAI,OAAO,CAAC,MAAM,CAAC;CAyD9B;AAED;;;;GAIG;AACH,wBAAsB,OAAO,CAC3B,MAAM,EAAE,MAAM,EACd,OAAO,GAAE;IAAE,YAAY,CAAC,EAAE,MAAM,CAAC;IAAC,MAAM,CAAC,EAAE,WAAW,CAAC;IAAC,OAAO,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAA;CAAO,GAC/F,OAAO,CAAC,IAAI,CAAC,CAkBf"}
|