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.
Files changed (42) hide show
  1. package/README.md +33 -0
  2. package/dist/cjs/cli-arguments.d.ts +28 -0
  3. package/dist/cjs/cli-arguments.d.ts.map +1 -0
  4. package/dist/cjs/cli-arguments.js +101 -0
  5. package/dist/cjs/cli-arguments.js.map +1 -0
  6. package/dist/cjs/cli.d.ts +9 -0
  7. package/dist/cjs/cli.d.ts.map +1 -0
  8. package/dist/cjs/cli.js +56 -0
  9. package/dist/cjs/cli.js.map +1 -0
  10. package/dist/cjs/index.d.ts +9 -1
  11. package/dist/cjs/index.d.ts.map +1 -1
  12. package/dist/cjs/index.js +10 -1
  13. package/dist/cjs/index.js.map +1 -1
  14. package/dist/cjs/relais.d.ts +88 -0
  15. package/dist/cjs/relais.d.ts.map +1 -0
  16. package/dist/cjs/relais.js +156 -0
  17. package/dist/cjs/relais.js.map +1 -0
  18. package/dist/cjs/webhooks.d.ts +20 -0
  19. package/dist/cjs/webhooks.d.ts.map +1 -1
  20. package/dist/cjs/webhooks.js +20 -0
  21. package/dist/cjs/webhooks.js.map +1 -1
  22. package/dist/esm/cli-arguments.d.ts +28 -0
  23. package/dist/esm/cli-arguments.d.ts.map +1 -0
  24. package/dist/esm/cli-arguments.js +96 -0
  25. package/dist/esm/cli-arguments.js.map +1 -0
  26. package/dist/esm/cli.d.ts +9 -0
  27. package/dist/esm/cli.d.ts.map +1 -0
  28. package/dist/esm/cli.js +54 -0
  29. package/dist/esm/cli.js.map +1 -0
  30. package/dist/esm/index.d.ts +9 -1
  31. package/dist/esm/index.d.ts.map +1 -1
  32. package/dist/esm/index.js +7 -2
  33. package/dist/esm/index.js.map +1 -1
  34. package/dist/esm/relais.d.ts +88 -0
  35. package/dist/esm/relais.d.ts.map +1 -0
  36. package/dist/esm/relais.js +150 -0
  37. package/dist/esm/relais.js.map +1 -0
  38. package/dist/esm/webhooks.d.ts +20 -0
  39. package/dist/esm/webhooks.d.ts.map +1 -1
  40. package/dist/esm/webhooks.js +19 -0
  41. package/dist/esm/webhooks.js.map +1 -1
  42. package/package.json +4 -1
package/README.md CHANGED
@@ -142,6 +142,39 @@ app.post(
142
142
  3. **Ne vous fiez pas à l'ordre.** `event.data.object.updatedAt` tranche.
143
143
  4. **Filtrez sur `event.livemode`** si le même endpoint sert vos deux environnements.
144
144
 
145
+ ### Recevoir les webhooks sur votre poste — `tupay listen`
146
+
147
+ Tupay ne joint pas `localhost`. Plutôt qu'un tunnel, laissez le SDK relayer vos événements **de test** :
148
+
149
+ ```bash
150
+ TUPAY_SECRET_KEY=tpk_test_… npx tupay listen --forward-to http://localhost:3000/webhook
151
+ ```
152
+
153
+ ```
154
+ Prêt. Les événements de test sont relayés vers http://localhost:3000/webhook
155
+ Secret de signature de cette session : whsec_…
156
+ 07:12:27 payment.succeeded evt_c11a4acc… → 200
157
+ ```
158
+
159
+ - Utilisez le secret affiché dans `constructEvent()` le temps du développement. `--secret whsec_…` le fixe d'une session à l'autre.
160
+ - Seuls les événements nés **après** le démarrage sont relayés ; les anciens se rejouent depuis l'écran Événements.
161
+ - `--events payment.succeeded,invoice.paid` filtre les types ; `--api-url` pointe un autre environnement.
162
+ - Une clé live est refusée : on ne relaie pas de vrais paiements vers un poste de développement.
163
+
164
+ Le relais interroge `GET /events` toutes les 2 s avec votre clé : aucun port à ouvrir, aucun endpoint à déclarer.
165
+
166
+ ### Tester votre gestionnaire sans réseau
167
+
168
+ ```ts
169
+ const corps = JSON.stringify(evenementDeTest)
170
+ const entete = tupay.webhooks.generateTestHeader({ payload: corps, secret: 'whsec_test' })
171
+ // → passez `corps` et `entete` à votre route, et vérifiez qu'elle répond 200
172
+ ```
173
+
174
+ ### Renouvellement du secret
175
+
176
+ Pendant le renouvellement d'un secret (écran Webhooks), l'en-tête porte deux signatures : `constructEvent` accepte l'envoi si l'une d'elles correspond. Mettez le SDK à jour **avant** de coller le nouveau secret.
177
+
145
178
  ### Déboguer une intégration
146
179
 
147
180
  ```ts
@@ -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,101 @@
1
+ "use strict";
2
+ /**
3
+ * Les arguments de `tupay listen`, lus sans dépendance.
4
+ *
5
+ * Séparé de `cli.ts` pour être testé sans lancer de processus.
6
+ */
7
+ Object.defineProperty(exports, "__esModule", { value: true });
8
+ exports.AIDE = void 0;
9
+ exports.analyserArguments = analyserArguments;
10
+ exports.refusCle = refusCle;
11
+ exports.AIDE = `Relaie vos événements de TEST Tupay vers votre poste — sans tunnel.
12
+
13
+ Usage :
14
+ TUPAY_SECRET_KEY=tpk_test_… npx tupay listen --forward-to http://localhost:3000/webhook
15
+
16
+ Options :
17
+ -f, --forward-to <url> l'adresse de votre serveur local (obligatoire)
18
+ -e, --events <types> seulement ces types, séparés par des virgules
19
+ (ex. payment.succeeded,invoice.paid)
20
+ --secret <whsec_…> signer avec ce secret plutôt qu'un secret neuf
21
+ (pratique pour ne pas le recoller à chaque fois)
22
+ --api-url <url> l'API à interroger (défaut : Tupay en production)
23
+ --interval <s> délai entre deux lectures, en secondes (défaut 2)
24
+ -h, --help cette aide
25
+
26
+ Seule une clé de TEST est acceptée : on ne relaie pas de vrais paiements
27
+ vers un poste de développement.`;
28
+ function analyserArguments(argv) {
29
+ const [commande, ...reste] = argv;
30
+ if (commande === undefined || commande === '-h' || commande === '--help' || commande === 'help') {
31
+ return { ok: true, aide: true };
32
+ }
33
+ if (commande !== 'listen')
34
+ return { ok: false, erreur: `Commande inconnue : « ${commande} ». Essayez « tupay listen --help ».` };
35
+ let forwardTo;
36
+ let types = [];
37
+ let apiUrl;
38
+ let secret;
39
+ let intervalleMs = 2000;
40
+ for (let i = 0; i < reste.length; i++) {
41
+ const brut = reste[i] ?? '';
42
+ // `--option=valeur` comme `--option valeur`.
43
+ const egal = brut.indexOf('=');
44
+ const nom = brut.startsWith('--') && egal > 0 ? brut.slice(0, egal) : brut;
45
+ const valeur = () => (brut.startsWith('--') && egal > 0 ? brut.slice(egal + 1) : reste[++i]);
46
+ switch (nom) {
47
+ case '-h':
48
+ case '--help':
49
+ return { ok: true, aide: true };
50
+ case '-f':
51
+ case '--forward-to':
52
+ forwardTo = valeur();
53
+ break;
54
+ case '-e':
55
+ case '--events':
56
+ types = (valeur() ?? '').split(',').map((t) => t.trim()).filter(Boolean);
57
+ break;
58
+ case '--secret':
59
+ secret = valeur();
60
+ break;
61
+ case '--api-url':
62
+ apiUrl = valeur();
63
+ break;
64
+ case '--interval': {
65
+ const s = Number(valeur());
66
+ if (!Number.isFinite(s) || s < 1 || s > 60)
67
+ return { ok: false, erreur: '--interval : un nombre de secondes entre 1 et 60.' };
68
+ intervalleMs = Math.round(s * 1000);
69
+ break;
70
+ }
71
+ default:
72
+ return { ok: false, erreur: `Option inconnue : « ${brut} ». Essayez « tupay listen --help ».` };
73
+ }
74
+ }
75
+ if (!forwardTo)
76
+ return { ok: false, erreur: '--forward-to est obligatoire : l’adresse de votre serveur local.' };
77
+ try {
78
+ const u = new URL(forwardTo);
79
+ if (u.protocol !== 'http:' && u.protocol !== 'https:')
80
+ throw new Error();
81
+ }
82
+ catch {
83
+ return { ok: false, erreur: `--forward-to : « ${forwardTo} » n’est pas une adresse http(s).` };
84
+ }
85
+ if (secret !== undefined && !/^whsec_[A-Za-z0-9_]{8,}$/.test(secret)) {
86
+ return { ok: false, erreur: '--secret : attendu un secret de la forme whsec_…' };
87
+ }
88
+ return { ok: true, valeur: { commande: 'listen', forwardTo, types, apiUrl, secret, intervalleMs } };
89
+ }
90
+ /** La clé doit être une clé de TEST. Rend le message de refus, ou `null`. */
91
+ function refusCle(cle) {
92
+ if (!cle)
93
+ return 'TUPAY_SECRET_KEY est vide : exportez votre clé de test (tpk_test_…), créée dans Clés API.';
94
+ if (cle.startsWith('tpk_live_')) {
95
+ return 'Clé LIVE refusée : tupay listen ne relaie que le mode test. Utilisez une clé tpk_test_…';
96
+ }
97
+ if (!cle.startsWith('tpk_test_'))
98
+ return 'TUPAY_SECRET_KEY ne ressemble pas à une clé Tupay (tpk_test_…).';
99
+ return null;
100
+ }
101
+ //# 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,9 @@
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
+ export {};
9
+ //# sourceMappingURL=cli.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cli.d.ts","sourceRoot":"","sources":["../../src/cli.ts"],"names":[],"mappings":";AACA;;;;;GAKG"}
@@ -0,0 +1,56 @@
1
+ #!/usr/bin/env node
2
+ "use strict";
3
+ /**
4
+ * `tupay` — l'outil en ligne de commande du SDK.
5
+ *
6
+ * Une commande aujourd'hui : `tupay listen`, qui relaie les événements de
7
+ * test vers votre poste (cf. `relais.ts`).
8
+ */
9
+ Object.defineProperty(exports, "__esModule", { value: true });
10
+ const index_js_1 = require("./index.js");
11
+ const cli_arguments_js_1 = require("./cli-arguments.js");
12
+ const relais_js_1 = require("./relais.js");
13
+ async function principal() {
14
+ const analyse = (0, cli_arguments_js_1.analyserArguments)(process.argv.slice(2));
15
+ if (!analyse.ok) {
16
+ console.error(analyse.erreur);
17
+ return 2;
18
+ }
19
+ if ('aide' in analyse) {
20
+ console.log(cli_arguments_js_1.AIDE);
21
+ return 0;
22
+ }
23
+ const o = analyse.valeur;
24
+ const cle = process.env.TUPAY_SECRET_KEY;
25
+ const refus = (0, cli_arguments_js_1.refusCle)(cle);
26
+ if (refus || !cle) {
27
+ console.error(refus);
28
+ return 2;
29
+ }
30
+ const tupay = new index_js_1.Tupay(cle, o.apiUrl ? { baseUrl: o.apiUrl } : {});
31
+ const secret = o.secret ?? (0, relais_js_1.genererSecretLocal)();
32
+ const relais = new relais_js_1.Relais({ source: tupay.events, forwardTo: o.forwardTo, secret, types: o.types });
33
+ const arret = new AbortController();
34
+ process.once('SIGINT', () => arret.abort());
35
+ process.once('SIGTERM', () => arret.abort());
36
+ try {
37
+ await relais.demarrer();
38
+ }
39
+ catch (err) {
40
+ console.error(`Impossible de lire vos événements : ${err instanceof Error ? err.message : String(err)}`);
41
+ return 1;
42
+ }
43
+ console.log(`Prêt. Les événements de test sont relayés vers ${o.forwardTo}`);
44
+ console.log(`Secret de signature de cette session : ${secret}`);
45
+ console.log(' → à utiliser dans constructEvent() à la place du secret de l’endpoint.');
46
+ if (o.types.length > 0)
47
+ console.log(`Seulement : ${o.types.join(', ')}`);
48
+ console.log('Ctrl+C pour arrêter.\n');
49
+ await (0, relais_js_1.ecouter)(relais, { intervalleMs: o.intervalleMs, signal: arret.signal });
50
+ return 0;
51
+ }
52
+ principal().then((code) => process.exit(code), (err) => {
53
+ console.error(err instanceof Error ? err.message : String(err));
54
+ process.exit(1);
55
+ });
56
+ //# sourceMappingURL=cli.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cli.js","sourceRoot":"","sources":["../../src/cli.ts"],"names":[],"mappings":"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"}
@@ -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';
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"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"}
package/dist/cjs/index.js CHANGED
@@ -15,7 +15,7 @@
15
15
  * console.log(link.url)
16
16
  */
17
17
  Object.defineProperty(exports, "__esModule", { value: true });
18
- exports.TestHelpers = exports.Events = exports.Receipts = exports.CheckoutSessions = exports.Accounts = exports.Disputes = exports.Payouts = exports.BalanceTransactions = exports.BalanceResource = exports.Invoices = exports.Subscriptions = exports.Prices = exports.Products = exports.SetupIntents = exports.PaymentMethods = exports.Customers = exports.TupaySignatureVerificationError = exports.TupayConnectionError = exports.TupayPaymentDeclinedError = exports.TupayBaasError = exports.TupayApiError = exports.TupayRateLimitError = exports.TupayIdempotencyError = exports.TupayConflictError = exports.TupayValidationError = exports.TupayNotFoundError = exports.TupayPermissionError = exports.TupayAuthenticationError = exports.TupayError = exports.DEFAULT_TOLERANCE_SECONDS = exports.constructEvent = exports.TupayClient = exports.Tupay = void 0;
18
+ exports.TestHelpers = exports.Events = exports.Receipts = exports.CheckoutSessions = exports.Accounts = exports.Disputes = exports.Payouts = exports.BalanceTransactions = exports.BalanceResource = exports.Invoices = exports.Subscriptions = exports.Prices = exports.Products = exports.SetupIntents = exports.PaymentMethods = exports.Customers = exports.TupaySignatureVerificationError = exports.TupayConnectionError = exports.TupayPaymentDeclinedError = exports.TupayBaasError = exports.TupayApiError = exports.TupayRateLimitError = exports.TupayIdempotencyError = exports.TupayConflictError = exports.TupayValidationError = exports.TupayNotFoundError = exports.TupayPermissionError = exports.TupayAuthenticationError = exports.TupayError = exports.genererSecretLocal = exports.ecouter = exports.Relais = exports.DEFAULT_TOLERANCE_SECONDS = exports.generateTestHeader = exports.constructEvent = exports.TupayClient = exports.Tupay = void 0;
19
19
  const client_js_1 = require("./client.js");
20
20
  const payment_intents_js_1 = require("./resources/payment-intents.js");
21
21
  const payment_links_js_1 = require("./resources/payment-links.js");
@@ -152,6 +152,10 @@ class Tupay {
152
152
  constructEvent(payload, header, secret, options) {
153
153
  return (0, webhooks_js_1.constructEvent)(payload, header, secret, options);
154
154
  },
155
+ /** Un en-tête `Tupay-Signature` valide, pour tester votre gestionnaire sans réseau. */
156
+ generateTestHeader(params) {
157
+ return (0, webhooks_js_1.generateTestHeader)(params);
158
+ },
155
159
  };
156
160
  /** Génère une clé d'idempotence (UUID v4). */
157
161
  static idempotencyKey() {
@@ -164,7 +168,12 @@ var client_js_2 = require("./client.js");
164
168
  Object.defineProperty(exports, "TupayClient", { enumerable: true, get: function () { return client_js_2.TupayClient; } });
165
169
  var webhooks_js_2 = require("./webhooks.js");
166
170
  Object.defineProperty(exports, "constructEvent", { enumerable: true, get: function () { return webhooks_js_2.constructEvent; } });
171
+ Object.defineProperty(exports, "generateTestHeader", { enumerable: true, get: function () { return webhooks_js_2.generateTestHeader; } });
167
172
  Object.defineProperty(exports, "DEFAULT_TOLERANCE_SECONDS", { enumerable: true, get: function () { return webhooks_js_2.DEFAULT_TOLERANCE_SECONDS; } });
173
+ var relais_js_1 = require("./relais.js");
174
+ Object.defineProperty(exports, "Relais", { enumerable: true, get: function () { return relais_js_1.Relais; } });
175
+ Object.defineProperty(exports, "ecouter", { enumerable: true, get: function () { return relais_js_1.ecouter; } });
176
+ Object.defineProperty(exports, "genererSecretLocal", { enumerable: true, get: function () { return relais_js_1.genererSecretLocal; } });
168
177
  var errors_js_1 = require("./errors.js");
169
178
  Object.defineProperty(exports, "TupayError", { enumerable: true, get: function () { return errors_js_1.TupayError; } });
170
179
  Object.defineProperty(exports, "TupayAuthenticationError", { enumerable: true, get: function () { return errors_js_1.TupayAuthenticationError; } });
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"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"}
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"}
@@ -0,0 +1,156 @@
1
+ "use strict";
2
+ /**
3
+ * Relayer les événements de TEST vers votre poste — `tupay listen`.
4
+ *
5
+ * ── Le problème ────────────────────────────────────────────────────
6
+ * Tupay ne joint pas `localhost` : pour recevoir un webhook pendant que
7
+ * vous développez, il fallait un tunnel (Cloudflare Tunnel, ngrok) et
8
+ * déclarer son URL publique comme endpoint. C'est l'équivalent de
9
+ * `stripe listen` qui manquait.
10
+ *
11
+ * ── Comment, sans rien ouvrir ──────────────────────────────────────
12
+ * Le relais INTERROGE l'API (`GET /events`, avec votre clé de test) et
13
+ * POSTE chaque événement nouveau à votre serveur local. Aucun port à
14
+ * ouvrir, aucun compte de tunnel, aucun endpoint à déclarer : seule une
15
+ * connexion sortante vers Tupay, comme n'importe quel appel du SDK.
16
+ *
17
+ * La signature est faite avec un secret LOCAL (`whsec_…`, affiché au
18
+ * démarrage), et non celui d'un endpoint : le relais ne connaît pas vos
19
+ * secrets d'endpoint, et n'a pas à les connaître. Votre code de
20
+ * vérification est le même — seul le secret change.
21
+ *
22
+ * ── Ce qu'il ne fait pas ───────────────────────────────────────────
23
+ * Il ne relaie que ce qui naît APRÈS son démarrage (les anciens se
24
+ * rejouent depuis l'écran Événements), et n'enregistre aucune livraison
25
+ * chez Tupay : votre écran Webhooks ne le voit pas.
26
+ */
27
+ Object.defineProperty(exports, "__esModule", { value: true });
28
+ exports.Relais = void 0;
29
+ exports.genererSecretLocal = genererSecretLocal;
30
+ exports.ecouter = ecouter;
31
+ const node_crypto_1 = require("node:crypto");
32
+ const webhooks_js_1 = require("./webhooks.js");
33
+ /** Le plafond de l'API par page. */
34
+ const PAGE = 100;
35
+ /** Au-delà, votre serveur est considéré comme muet pour cet envoi. */
36
+ const DELAI_ENVOI_MS = 10_000;
37
+ function genererSecretLocal() {
38
+ return 'whsec_' + (0, node_crypto_1.randomBytes)(32).toString('hex');
39
+ }
40
+ class Relais {
41
+ /** Le plus récent événement déjà vu. `undefined` : il n'y en avait aucun. */
42
+ #curseur;
43
+ #demarre = false;
44
+ #o;
45
+ constructor(options) {
46
+ this.#o = {
47
+ source: options.source,
48
+ forwardTo: options.forwardTo,
49
+ secret: options.secret,
50
+ apiVersion: options.apiVersion ?? '2026-01-01',
51
+ journal: options.journal ?? ((l) => console.log(l)),
52
+ fetch: options.fetch ?? globalThis.fetch,
53
+ types: options.types && options.types.length > 0 ? new Set(options.types) : null,
54
+ };
55
+ }
56
+ /**
57
+ * Retient le plus récent événement existant : seuls ceux qui naîtront
58
+ * ENSUITE seront relayés. Relayer l'historique au démarrage ferait
59
+ * recevoir à votre serveur des paiements d'hier comme s'ils arrivaient.
60
+ */
61
+ async demarrer() {
62
+ const page = await this.#o.source.list({ limit: 1 });
63
+ this.#curseur = page.data[0]?.id;
64
+ this.#demarre = true;
65
+ }
66
+ /**
67
+ * Un passage : lit ce qui est né depuis le dernier, le relaie du plus
68
+ * ANCIEN au plus récent — l'ordre où les faits sont arrivés. Rend le
69
+ * nombre d'événements relayés.
70
+ */
71
+ async tour() {
72
+ if (!this.#demarre)
73
+ await this.demarrer();
74
+ let relayes = 0;
75
+ for (;;) {
76
+ // `ending_before` rend la page ADJACENTE au curseur, du plus
77
+ // récent au plus ancien ; `has_more` dit qu'il en reste de plus
78
+ // récents. Sans curseur (aucun événement au démarrage), tout ce qui
79
+ // existe est nouveau.
80
+ const page = await this.#o.source.list(this.#curseur === undefined ? { limit: PAGE } : { limit: PAGE, endingBefore: this.#curseur });
81
+ const nouveaux = [...page.data].reverse();
82
+ for (const evenement of nouveaux) {
83
+ if (this.#o.types === null || this.#o.types.has(evenement.type)) {
84
+ await this.#transmettre(evenement);
85
+ relayes++;
86
+ }
87
+ }
88
+ if (page.data[0])
89
+ this.#curseur = page.data[0].id;
90
+ if (!page.has_more || page.data.length === 0 || this.#curseur === undefined)
91
+ return relayes;
92
+ }
93
+ }
94
+ async #transmettre(evenement) {
95
+ // L'enveloppe telle que Tupay la livre à un endpoint : même forme,
96
+ // donc le même code de réception.
97
+ const corps = JSON.stringify({
98
+ id: evenement.id,
99
+ object: 'event',
100
+ type: evenement.type,
101
+ apiVersion: this.#o.apiVersion,
102
+ created: evenement.created,
103
+ livemode: evenement.livemode,
104
+ data: evenement.data,
105
+ });
106
+ const heure = new Date().toLocaleTimeString('fr-FR');
107
+ try {
108
+ const reponse = await this.#o.fetch(this.#o.forwardTo, {
109
+ method: 'POST',
110
+ headers: {
111
+ 'content-type': 'application/json',
112
+ 'user-agent': 'Tupay-Listen/1.0',
113
+ 'tupay-signature': (0, webhooks_js_1.generateTestHeader)({ payload: corps, secret: this.#o.secret }),
114
+ 'tupay-event-id': evenement.id,
115
+ 'tupay-event-type': evenement.type,
116
+ },
117
+ body: corps,
118
+ signal: AbortSignal.timeout(DELAI_ENVOI_MS),
119
+ });
120
+ this.#o.journal(`${heure} ${evenement.type} ${evenement.id} → ${reponse.status}`);
121
+ }
122
+ catch (err) {
123
+ // Votre serveur est arrêté ou a planté : on le dit, et on continue.
124
+ // Le relais ne rejoue pas — l'écran Événements le fait.
125
+ const raison = err instanceof Error ? err.message : String(err);
126
+ this.#o.journal(`${heure} ${evenement.type} ${evenement.id} → échec : ${raison}`);
127
+ }
128
+ }
129
+ }
130
+ exports.Relais = Relais;
131
+ /**
132
+ * Tourne jusqu'à `signal`. Une erreur de l'API (réseau coupé, clé
133
+ * révoquée) est dite et le passage suivant réessaie : un relais qui
134
+ * s'arrête au premier hoquet obligerait à surveiller le relais.
135
+ */
136
+ async function ecouter(relais, options = {}) {
137
+ const intervalle = options.intervalleMs ?? 2000;
138
+ const journal = options.journal ?? ((l) => console.error(l));
139
+ await relais.demarrer();
140
+ while (!options.signal?.aborted) {
141
+ try {
142
+ await relais.tour();
143
+ }
144
+ catch (err) {
145
+ journal(`Lecture des événements impossible : ${err instanceof Error ? err.message : String(err)}`);
146
+ }
147
+ await new Promise((fin) => {
148
+ const minuteur = setTimeout(fin, intervalle);
149
+ options.signal?.addEventListener('abort', () => {
150
+ clearTimeout(minuteur);
151
+ fin();
152
+ }, { once: true });
153
+ });
154
+ }
155
+ }
156
+ //# sourceMappingURL=relais.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"relais.js","sourceRoot":"","sources":["../../src/relais.ts"],"names":[],"mappings":"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"}