@protocol-offair/gateway-sdk 0.1.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 +151 -0
- package/dist/client.d.ts +32 -0
- package/dist/client.d.ts.map +1 -0
- package/dist/client.js +293 -0
- package/dist/client.js.map +1 -0
- package/dist/errors.d.ts +14 -0
- package/dist/errors.d.ts.map +1 -0
- package/dist/errors.js +19 -0
- package/dist/errors.js.map +1 -0
- package/dist/index.d.ts +6 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +6 -0
- package/dist/index.js.map +1 -0
- package/dist/payment-code.d.ts +5 -0
- package/dist/payment-code.d.ts.map +1 -0
- package/dist/payment-code.js +225 -0
- package/dist/payment-code.js.map +1 -0
- package/dist/types.d.ts +259 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +2 -0
- package/dist/types.js.map +1 -0
- package/dist/webhooks.d.ts +27 -0
- package/dist/webhooks.d.ts.map +1 -0
- package/dist/webhooks.js +105 -0
- package/dist/webhooks.js.map +1 -0
- package/package.json +35 -0
package/README.md
ADDED
|
@@ -0,0 +1,151 @@
|
|
|
1
|
+
# AirPay Gateway SDK
|
|
2
|
+
|
|
3
|
+
SDK TypeScript para integrar aplicações externas ao AirPay Gateway.
|
|
4
|
+
|
|
5
|
+
O pacote cobre o fluxo online do gateway:
|
|
6
|
+
|
|
7
|
+
- criação de payment intents em SOL;
|
|
8
|
+
- consulta de intent;
|
|
9
|
+
- registro de webhooks;
|
|
10
|
+
- parsing de QR/link/copia-e-cola compatível com Solana Pay e AirPay;
|
|
11
|
+
- verificação de assinatura HMAC dos webhooks;
|
|
12
|
+
- cliente administrativo opcional para painéis internos.
|
|
13
|
+
|
|
14
|
+
O SDK não implementa swap, stablecoins, custódia de saldo ou promessa de liquidação fiat.
|
|
15
|
+
|
|
16
|
+
## Instalação local
|
|
17
|
+
|
|
18
|
+
```bash
|
|
19
|
+
npm install @protocol-offair/gateway-sdk
|
|
20
|
+
```
|
|
21
|
+
|
|
22
|
+
No monorepo AirPay, use o workspace:
|
|
23
|
+
|
|
24
|
+
```bash
|
|
25
|
+
npm --workspace @protocol-offair/gateway-sdk run build
|
|
26
|
+
npm --workspace @protocol-offair/gateway-sdk run test
|
|
27
|
+
```
|
|
28
|
+
|
|
29
|
+
## Criar uma fatura SOL
|
|
30
|
+
|
|
31
|
+
Use o cliente merchant apenas em backend ou ambiente server-side. Não exponha a `apiKey` no frontend público.
|
|
32
|
+
|
|
33
|
+
```ts
|
|
34
|
+
import { createAirPayGatewayClient } from "@protocol-offair/gateway-sdk";
|
|
35
|
+
|
|
36
|
+
const airpay = createAirPayGatewayClient({
|
|
37
|
+
apiBaseUrl: process.env.AIRPAY_GATEWAY_API_BASE_URL!,
|
|
38
|
+
apiKey: process.env.AIRPAY_GATEWAY_API_KEY!,
|
|
39
|
+
});
|
|
40
|
+
|
|
41
|
+
const intent = await airpay.createPaymentIntent(
|
|
42
|
+
{
|
|
43
|
+
amount: "1.5",
|
|
44
|
+
currency: "SOL",
|
|
45
|
+
expiresInSeconds: 3600,
|
|
46
|
+
metadata: {
|
|
47
|
+
orderId: "order-123",
|
|
48
|
+
customerEmail: "cliente@example.com",
|
|
49
|
+
},
|
|
50
|
+
},
|
|
51
|
+
{
|
|
52
|
+
idempotencyKey: "order-123",
|
|
53
|
+
},
|
|
54
|
+
);
|
|
55
|
+
|
|
56
|
+
console.log(intent.intentId);
|
|
57
|
+
console.log(intent.solanaPayUrl);
|
|
58
|
+
console.log(intent.airpayUrl);
|
|
59
|
+
```
|
|
60
|
+
|
|
61
|
+
## Consultar status
|
|
62
|
+
|
|
63
|
+
```ts
|
|
64
|
+
const intent = await airpay.getPaymentIntent("pay_123");
|
|
65
|
+
|
|
66
|
+
if (intent.status === "confirmed") {
|
|
67
|
+
// liberar pedido, atualizar checkout ou aguardar webhook settlement.completed
|
|
68
|
+
}
|
|
69
|
+
```
|
|
70
|
+
|
|
71
|
+
## Registrar webhook
|
|
72
|
+
|
|
73
|
+
```ts
|
|
74
|
+
const webhook = await airpay.registerWebhook({
|
|
75
|
+
endpointUrl: "https://merchant.example/webhooks/airpay",
|
|
76
|
+
events: ["payment.confirmed", "payment.expired", "settlement.completed"],
|
|
77
|
+
secret: process.env.AIRPAY_GATEWAY_WEBHOOK_SECRET,
|
|
78
|
+
});
|
|
79
|
+
|
|
80
|
+
console.log(webhook.webhookId);
|
|
81
|
+
```
|
|
82
|
+
|
|
83
|
+
## Verificar assinatura de webhook
|
|
84
|
+
|
|
85
|
+
O Gateway assina o corpo canônico com:
|
|
86
|
+
|
|
87
|
+
```txt
|
|
88
|
+
sha256 HMAC(secret, `${timestamp}.${body}`)
|
|
89
|
+
```
|
|
90
|
+
|
|
91
|
+
Headers:
|
|
92
|
+
|
|
93
|
+
- `x-signature`
|
|
94
|
+
- `x-timestamp`
|
|
95
|
+
- `x-event-id`
|
|
96
|
+
|
|
97
|
+
Exemplo com Express:
|
|
98
|
+
|
|
99
|
+
```ts
|
|
100
|
+
import { assertGatewayWebhookSignature } from "@protocol-offair/gateway-sdk";
|
|
101
|
+
|
|
102
|
+
app.post("/webhooks/airpay", express.raw({ type: "application/json" }), async (req, res) => {
|
|
103
|
+
const event = await assertGatewayWebhookSignature({
|
|
104
|
+
payload: req.body.toString("utf8"),
|
|
105
|
+
headers: req.headers,
|
|
106
|
+
secret: process.env.AIRPAY_GATEWAY_WEBHOOK_SECRET!,
|
|
107
|
+
});
|
|
108
|
+
|
|
109
|
+
if (event.type === "payment.confirmed") {
|
|
110
|
+
await markOrderAsPaid(event.metadata.orderId, event.txHash);
|
|
111
|
+
}
|
|
112
|
+
|
|
113
|
+
res.status(204).send();
|
|
114
|
+
});
|
|
115
|
+
```
|
|
116
|
+
|
|
117
|
+
## Ler QR Code ou copia-e-cola
|
|
118
|
+
|
|
119
|
+
```ts
|
|
120
|
+
import { parseAirPayGatewayPaymentCode } from "@protocol-offair/gateway-sdk";
|
|
121
|
+
|
|
122
|
+
const request = parseAirPayGatewayPaymentCode(copiedOrScannedText);
|
|
123
|
+
|
|
124
|
+
console.log(request.wallet);
|
|
125
|
+
console.log(request.amount);
|
|
126
|
+
console.log(request.reference);
|
|
127
|
+
console.log(request.intentId);
|
|
128
|
+
```
|
|
129
|
+
|
|
130
|
+
## Cliente administrativo
|
|
131
|
+
|
|
132
|
+
Use apenas em painéis internos ou workers controlados.
|
|
133
|
+
|
|
134
|
+
```ts
|
|
135
|
+
import { createAirPayGatewayAdminClient } from "@protocol-offair/gateway-sdk";
|
|
136
|
+
|
|
137
|
+
const admin = createAirPayGatewayAdminClient({
|
|
138
|
+
apiBaseUrl: process.env.AIRPAY_GATEWAY_API_BASE_URL!,
|
|
139
|
+
adminKey: process.env.AIRPAY_GATEWAY_ADMIN_KEY!,
|
|
140
|
+
});
|
|
141
|
+
|
|
142
|
+
const overview = await admin.getOverview();
|
|
143
|
+
const pending = await admin.listPaymentIntents({ status: "pending", limit: 50 });
|
|
144
|
+
```
|
|
145
|
+
|
|
146
|
+
## Limites intencionais
|
|
147
|
+
|
|
148
|
+
- Ativo suportado: `SOL`.
|
|
149
|
+
- O SDK não cria carteiras nem assina transações pelo usuário.
|
|
150
|
+
- O SDK não promete liquidação offline.
|
|
151
|
+
- Chaves merchant/admin devem ficar no servidor do integrador.
|
package/dist/client.d.ts
ADDED
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
import type { AirPayGatewayAdminClientOptions, AirPayGatewayAuthClientOptions, AirPayGatewayClientOptions, GatewayAdminOverview, GatewayConfirmationRequest, GatewayConfirmationResponse, GatewayListOptions, GatewayMerchant, GatewaySettlement, GatewayWalletAuthChallengeRequest, GatewayWalletAuthChallengeResponse, GatewayWalletSessionRequest, GatewayWalletSessionResponse, SupportCampaignPaymentRequest, GatewayWebhookDelivery, GatewayWebhookRegistration, GatewayWebhookRegistrationRequest, GatewayWorkerRun, PaymentIntent, PaymentIntentCreateRequest, RequestOptions } from "./types";
|
|
2
|
+
export declare class AirPayGatewayAuthClient {
|
|
3
|
+
private readonly http;
|
|
4
|
+
constructor(options: AirPayGatewayAuthClientOptions);
|
|
5
|
+
createWalletAuthChallenge(request: GatewayWalletAuthChallengeRequest, options?: Pick<RequestOptions, "signal">): Promise<GatewayWalletAuthChallengeResponse>;
|
|
6
|
+
createWalletSession(request: GatewayWalletSessionRequest, options?: Pick<RequestOptions, "signal">): Promise<GatewayWalletSessionResponse>;
|
|
7
|
+
}
|
|
8
|
+
export declare class AirPayGatewayClient {
|
|
9
|
+
private readonly http;
|
|
10
|
+
constructor(options: AirPayGatewayClientOptions);
|
|
11
|
+
getMerchant(options?: Pick<RequestOptions, "signal">): Promise<GatewayMerchant>;
|
|
12
|
+
createPaymentIntent(request: PaymentIntentCreateRequest, options?: RequestOptions): Promise<PaymentIntent>;
|
|
13
|
+
getPaymentIntent(intentId: string, options?: Pick<RequestOptions, "signal">): Promise<PaymentIntent>;
|
|
14
|
+
registerWebhook(request: GatewayWebhookRegistrationRequest, options?: Pick<RequestOptions, "signal">): Promise<GatewayWebhookRegistration>;
|
|
15
|
+
createWalletAuthChallenge(request: GatewayWalletAuthChallengeRequest, options?: Pick<RequestOptions, "signal">): Promise<GatewayWalletAuthChallengeResponse>;
|
|
16
|
+
createWalletSession(request: GatewayWalletSessionRequest, options?: Pick<RequestOptions, "signal">): Promise<GatewayWalletSessionResponse>;
|
|
17
|
+
}
|
|
18
|
+
export declare class AirPayGatewayAdminClient {
|
|
19
|
+
private readonly http;
|
|
20
|
+
constructor(options: AirPayGatewayAdminClientOptions);
|
|
21
|
+
getOverview(options?: Pick<RequestOptions, "signal">): Promise<GatewayAdminOverview>;
|
|
22
|
+
listPaymentIntents(options?: GatewayListOptions): Promise<PaymentIntent[]>;
|
|
23
|
+
listSettlements(options?: GatewayListOptions): Promise<GatewaySettlement[]>;
|
|
24
|
+
listWebhookDeliveries(options?: GatewayListOptions): Promise<GatewayWebhookDelivery[]>;
|
|
25
|
+
runWorkerOnce(options?: Pick<RequestOptions, "signal">): Promise<GatewayWorkerRun>;
|
|
26
|
+
recordConfirmation(request: GatewayConfirmationRequest, options?: Pick<RequestOptions, "signal">): Promise<GatewayConfirmationResponse>;
|
|
27
|
+
}
|
|
28
|
+
export declare function createAirPayGatewayClient(options: AirPayGatewayClientOptions): AirPayGatewayClient;
|
|
29
|
+
export declare function createAirPayGatewayAuthClient(options: AirPayGatewayAuthClientOptions): AirPayGatewayAuthClient;
|
|
30
|
+
export declare function createAirPayGatewayAdminClient(options: AirPayGatewayAdminClientOptions): AirPayGatewayAdminClient;
|
|
31
|
+
export declare function createSupportCampaignPaymentIntent(client: AirPayGatewayClient, request: SupportCampaignPaymentRequest, options?: RequestOptions): Promise<PaymentIntent>;
|
|
32
|
+
//# sourceMappingURL=client.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../src/client.ts"],"names":[],"mappings":"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"}
|
package/dist/client.js
ADDED
|
@@ -0,0 +1,293 @@
|
|
|
1
|
+
import { AirPayGatewayError, AirPayGatewayValidationError } from "./errors";
|
|
2
|
+
function normalizeApiBaseUrl(value) {
|
|
3
|
+
const trimmed = value.trim().replace(/\/+$/, "");
|
|
4
|
+
if (!trimmed) {
|
|
5
|
+
throw new AirPayGatewayValidationError("apiBaseUrl is required.");
|
|
6
|
+
}
|
|
7
|
+
return trimmed;
|
|
8
|
+
}
|
|
9
|
+
function normalizeGatewayAmount(value) {
|
|
10
|
+
const normalized = String(value).trim().replace(",", ".");
|
|
11
|
+
if (!/^\d+(\.\d{1,9})?$/.test(normalized) || Number(normalized) <= 0) {
|
|
12
|
+
throw new AirPayGatewayValidationError("amount must be a positive decimal with up to 9 decimals.");
|
|
13
|
+
}
|
|
14
|
+
return normalized.replace(/^0+(?=\d)/, "") || "0";
|
|
15
|
+
}
|
|
16
|
+
function withQuery(path, params) {
|
|
17
|
+
const search = new URLSearchParams();
|
|
18
|
+
for (const [key, value] of Object.entries(params)) {
|
|
19
|
+
if (value !== undefined) {
|
|
20
|
+
search.set(key, String(value));
|
|
21
|
+
}
|
|
22
|
+
}
|
|
23
|
+
const query = search.toString();
|
|
24
|
+
return query ? `${path}?${query}` : path;
|
|
25
|
+
}
|
|
26
|
+
class GatewayHttpClient {
|
|
27
|
+
apiBaseUrl;
|
|
28
|
+
fetchImpl;
|
|
29
|
+
merchantKey;
|
|
30
|
+
adminKey;
|
|
31
|
+
defaultHeaders;
|
|
32
|
+
constructor(options) {
|
|
33
|
+
this.apiBaseUrl = normalizeApiBaseUrl(options.apiBaseUrl);
|
|
34
|
+
this.fetchImpl = options.fetch ?? globalThis.fetch;
|
|
35
|
+
this.defaultHeaders = options.headers ?? {};
|
|
36
|
+
if (!this.fetchImpl) {
|
|
37
|
+
throw new AirPayGatewayValidationError("A fetch implementation is required in this runtime.");
|
|
38
|
+
}
|
|
39
|
+
if (options.authHeader === "merchant") {
|
|
40
|
+
this.merchantKey = options.apiKey;
|
|
41
|
+
if (!this.merchantKey?.trim()) {
|
|
42
|
+
throw new AirPayGatewayValidationError("apiKey is required.");
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
else if (options.authHeader === "admin") {
|
|
46
|
+
this.adminKey = options.adminKey;
|
|
47
|
+
if (!this.adminKey?.trim()) {
|
|
48
|
+
throw new AirPayGatewayValidationError("adminKey is required.");
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
async request(path, options) {
|
|
53
|
+
const headers = {
|
|
54
|
+
...this.defaultHeaders,
|
|
55
|
+
...options.headers,
|
|
56
|
+
};
|
|
57
|
+
if (options.auth === "merchant") {
|
|
58
|
+
if (!this.merchantKey) {
|
|
59
|
+
throw new AirPayGatewayValidationError("Merchant API key is not configured.");
|
|
60
|
+
}
|
|
61
|
+
headers["x-airpay-api-key"] = this.merchantKey;
|
|
62
|
+
}
|
|
63
|
+
else if (options.auth === "admin") {
|
|
64
|
+
if (!this.adminKey) {
|
|
65
|
+
throw new AirPayGatewayValidationError("Admin key is not configured.");
|
|
66
|
+
}
|
|
67
|
+
headers["x-airpay-admin-key"] = this.adminKey;
|
|
68
|
+
}
|
|
69
|
+
let body;
|
|
70
|
+
if (options.body !== undefined) {
|
|
71
|
+
headers["content-type"] = headers["content-type"] ?? "application/json";
|
|
72
|
+
body = JSON.stringify(options.body);
|
|
73
|
+
}
|
|
74
|
+
if (options.idempotencyKey) {
|
|
75
|
+
headers["idempotency-key"] = options.idempotencyKey;
|
|
76
|
+
}
|
|
77
|
+
const response = await this.fetchImpl(`${this.apiBaseUrl}${path}`, {
|
|
78
|
+
method: options.method ?? (body ? "POST" : "GET"),
|
|
79
|
+
headers,
|
|
80
|
+
body,
|
|
81
|
+
signal: options.signal,
|
|
82
|
+
});
|
|
83
|
+
const text = await response.text();
|
|
84
|
+
const payload = text ? safeJsonParse(text) : null;
|
|
85
|
+
if (!response.ok) {
|
|
86
|
+
const message = typeof payload === "object" && payload && "detail" in payload
|
|
87
|
+
? String(payload.detail)
|
|
88
|
+
: `AirPay Gateway request failed with HTTP ${response.status}.`;
|
|
89
|
+
throw new AirPayGatewayError(message, {
|
|
90
|
+
status: response.status,
|
|
91
|
+
statusText: response.statusText,
|
|
92
|
+
details: payload,
|
|
93
|
+
});
|
|
94
|
+
}
|
|
95
|
+
return payload;
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
function safeJsonParse(text) {
|
|
99
|
+
try {
|
|
100
|
+
return JSON.parse(text);
|
|
101
|
+
}
|
|
102
|
+
catch {
|
|
103
|
+
return text;
|
|
104
|
+
}
|
|
105
|
+
}
|
|
106
|
+
async function createWalletAuthChallengeWithHttp(http, request, options = {}) {
|
|
107
|
+
if (!request.walletPublicKey.trim()) {
|
|
108
|
+
throw new AirPayGatewayValidationError("walletPublicKey is required.");
|
|
109
|
+
}
|
|
110
|
+
return http.request("/v1/auth/wallet/challenge", {
|
|
111
|
+
auth: "none",
|
|
112
|
+
method: "POST",
|
|
113
|
+
signal: options.signal,
|
|
114
|
+
body: {
|
|
115
|
+
walletPublicKey: request.walletPublicKey,
|
|
116
|
+
walletAddress: request.walletAddress,
|
|
117
|
+
walletId: request.walletId,
|
|
118
|
+
audience: request.audience,
|
|
119
|
+
},
|
|
120
|
+
});
|
|
121
|
+
}
|
|
122
|
+
async function createWalletSessionWithHttp(http, request, options = {}) {
|
|
123
|
+
if (!request.message.trim()) {
|
|
124
|
+
throw new AirPayGatewayValidationError("message is required.");
|
|
125
|
+
}
|
|
126
|
+
if (!request.signature.trim()) {
|
|
127
|
+
throw new AirPayGatewayValidationError("signature is required.");
|
|
128
|
+
}
|
|
129
|
+
if (!request.walletPublicKey.trim()) {
|
|
130
|
+
throw new AirPayGatewayValidationError("walletPublicKey is required.");
|
|
131
|
+
}
|
|
132
|
+
return http.request("/v1/auth/wallet/session", {
|
|
133
|
+
auth: "none",
|
|
134
|
+
method: "POST",
|
|
135
|
+
signal: options.signal,
|
|
136
|
+
body: {
|
|
137
|
+
message: request.message,
|
|
138
|
+
signature: request.signature,
|
|
139
|
+
walletPublicKey: request.walletPublicKey,
|
|
140
|
+
walletAddress: request.walletAddress,
|
|
141
|
+
walletId: request.walletId,
|
|
142
|
+
},
|
|
143
|
+
});
|
|
144
|
+
}
|
|
145
|
+
export class AirPayGatewayAuthClient {
|
|
146
|
+
http;
|
|
147
|
+
constructor(options) {
|
|
148
|
+
this.http = new GatewayHttpClient({ ...options, authHeader: "none" });
|
|
149
|
+
}
|
|
150
|
+
async createWalletAuthChallenge(request, options = {}) {
|
|
151
|
+
return createWalletAuthChallengeWithHttp(this.http, request, options);
|
|
152
|
+
}
|
|
153
|
+
async createWalletSession(request, options = {}) {
|
|
154
|
+
return createWalletSessionWithHttp(this.http, request, options);
|
|
155
|
+
}
|
|
156
|
+
}
|
|
157
|
+
export class AirPayGatewayClient {
|
|
158
|
+
http;
|
|
159
|
+
constructor(options) {
|
|
160
|
+
this.http = new GatewayHttpClient({ ...options, authHeader: "merchant" });
|
|
161
|
+
}
|
|
162
|
+
async getMerchant(options = {}) {
|
|
163
|
+
return this.http.request("/v1/merchants/me", {
|
|
164
|
+
auth: "merchant",
|
|
165
|
+
signal: options.signal,
|
|
166
|
+
});
|
|
167
|
+
}
|
|
168
|
+
async createPaymentIntent(request, options = {}) {
|
|
169
|
+
const response = await this.http.request("/v1/payment-intents", {
|
|
170
|
+
auth: "merchant",
|
|
171
|
+
method: "POST",
|
|
172
|
+
idempotencyKey: options.idempotencyKey,
|
|
173
|
+
signal: options.signal,
|
|
174
|
+
body: {
|
|
175
|
+
amount: normalizeGatewayAmount(request.amount),
|
|
176
|
+
currency: request.currency ?? "SOL",
|
|
177
|
+
receiveCurrency: request.receiveCurrency,
|
|
178
|
+
payCurrency: request.payCurrency,
|
|
179
|
+
acceptedPayCurrencies: request.acceptedPayCurrencies,
|
|
180
|
+
conversionFeeBps: request.conversionFeeBps,
|
|
181
|
+
metadata: request.metadata ?? {},
|
|
182
|
+
expiresInSeconds: request.expiresInSeconds,
|
|
183
|
+
settlementWallet: request.settlementWallet,
|
|
184
|
+
},
|
|
185
|
+
});
|
|
186
|
+
return response.intent;
|
|
187
|
+
}
|
|
188
|
+
async getPaymentIntent(intentId, options = {}) {
|
|
189
|
+
if (!intentId.trim()) {
|
|
190
|
+
throw new AirPayGatewayValidationError("intentId is required.");
|
|
191
|
+
}
|
|
192
|
+
const response = await this.http.request(`/v1/payment-intents/${encodeURIComponent(intentId.trim())}`, {
|
|
193
|
+
auth: "merchant",
|
|
194
|
+
signal: options.signal,
|
|
195
|
+
});
|
|
196
|
+
return response.intent;
|
|
197
|
+
}
|
|
198
|
+
async registerWebhook(request, options = {}) {
|
|
199
|
+
if (!request.endpointUrl.trim()) {
|
|
200
|
+
throw new AirPayGatewayValidationError("endpointUrl is required.");
|
|
201
|
+
}
|
|
202
|
+
return this.http.request("/v1/webhooks", {
|
|
203
|
+
auth: "merchant",
|
|
204
|
+
method: "POST",
|
|
205
|
+
signal: options.signal,
|
|
206
|
+
body: {
|
|
207
|
+
endpointUrl: request.endpointUrl,
|
|
208
|
+
events: request.events,
|
|
209
|
+
secret: request.secret,
|
|
210
|
+
},
|
|
211
|
+
});
|
|
212
|
+
}
|
|
213
|
+
async createWalletAuthChallenge(request, options = {}) {
|
|
214
|
+
return createWalletAuthChallengeWithHttp(this.http, request, options);
|
|
215
|
+
}
|
|
216
|
+
async createWalletSession(request, options = {}) {
|
|
217
|
+
return createWalletSessionWithHttp(this.http, request, options);
|
|
218
|
+
}
|
|
219
|
+
}
|
|
220
|
+
export class AirPayGatewayAdminClient {
|
|
221
|
+
http;
|
|
222
|
+
constructor(options) {
|
|
223
|
+
this.http = new GatewayHttpClient({ ...options, authHeader: "admin" });
|
|
224
|
+
}
|
|
225
|
+
async getOverview(options = {}) {
|
|
226
|
+
return this.http.request("/v1/admin/gateway/overview", {
|
|
227
|
+
auth: "admin",
|
|
228
|
+
signal: options.signal,
|
|
229
|
+
});
|
|
230
|
+
}
|
|
231
|
+
async listPaymentIntents(options = {}) {
|
|
232
|
+
const response = await this.http.request(withQuery("/v1/admin/gateway/payment-intents", { limit: options.limit, status: options.status }), { auth: "admin", signal: options.signal });
|
|
233
|
+
return response.intents;
|
|
234
|
+
}
|
|
235
|
+
async listSettlements(options = {}) {
|
|
236
|
+
const response = await this.http.request(withQuery("/v1/admin/gateway/settlements", { limit: options.limit, status: options.status }), { auth: "admin", signal: options.signal });
|
|
237
|
+
return response.settlements;
|
|
238
|
+
}
|
|
239
|
+
async listWebhookDeliveries(options = {}) {
|
|
240
|
+
const response = await this.http.request(withQuery("/v1/admin/gateway/webhook-deliveries", { limit: options.limit, status: options.status }), { auth: "admin", signal: options.signal });
|
|
241
|
+
return response.deliveries;
|
|
242
|
+
}
|
|
243
|
+
async runWorkerOnce(options = {}) {
|
|
244
|
+
return this.http.request("/v1/admin/gateway/worker/run-once", {
|
|
245
|
+
auth: "admin",
|
|
246
|
+
method: "POST",
|
|
247
|
+
signal: options.signal,
|
|
248
|
+
});
|
|
249
|
+
}
|
|
250
|
+
async recordConfirmation(request, options = {}) {
|
|
251
|
+
return this.http.request("/v1/internal/solana/confirmations", {
|
|
252
|
+
auth: "admin",
|
|
253
|
+
method: "POST",
|
|
254
|
+
signal: options.signal,
|
|
255
|
+
body: request,
|
|
256
|
+
});
|
|
257
|
+
}
|
|
258
|
+
}
|
|
259
|
+
export function createAirPayGatewayClient(options) {
|
|
260
|
+
return new AirPayGatewayClient(options);
|
|
261
|
+
}
|
|
262
|
+
export function createAirPayGatewayAuthClient(options) {
|
|
263
|
+
return new AirPayGatewayAuthClient(options);
|
|
264
|
+
}
|
|
265
|
+
export function createAirPayGatewayAdminClient(options) {
|
|
266
|
+
return new AirPayGatewayAdminClient(options);
|
|
267
|
+
}
|
|
268
|
+
export async function createSupportCampaignPaymentIntent(client, request, options = {}) {
|
|
269
|
+
const metadata = {
|
|
270
|
+
product: "airpay_support",
|
|
271
|
+
paymentMode: "online_only",
|
|
272
|
+
campaignId: request.campaignId,
|
|
273
|
+
campaignSlug: request.campaignSlug,
|
|
274
|
+
campaignTitle: request.campaignTitle,
|
|
275
|
+
contributionId: request.contributionId,
|
|
276
|
+
creatorWallet: request.creatorWallet,
|
|
277
|
+
receiverWallet: request.receiverWallet,
|
|
278
|
+
senderWallet: request.senderWallet,
|
|
279
|
+
displayName: request.displayName,
|
|
280
|
+
message: request.message,
|
|
281
|
+
};
|
|
282
|
+
return client.createPaymentIntent({
|
|
283
|
+
amount: request.amount,
|
|
284
|
+
currency: "SOL",
|
|
285
|
+
metadata,
|
|
286
|
+
settlementWallet: request.receiverWallet,
|
|
287
|
+
expiresInSeconds: request.expiresInSeconds,
|
|
288
|
+
}, {
|
|
289
|
+
...options,
|
|
290
|
+
idempotencyKey: options.idempotencyKey ?? request.contributionId,
|
|
291
|
+
});
|
|
292
|
+
}
|
|
293
|
+
//# sourceMappingURL=client.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"client.js","sourceRoot":"","sources":["../src/client.ts"],"names":[],"mappings":"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"}
|
package/dist/errors.d.ts
ADDED
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
export declare class AirPayGatewayError extends Error {
|
|
2
|
+
readonly status: number;
|
|
3
|
+
readonly statusText: string;
|
|
4
|
+
readonly details: unknown;
|
|
5
|
+
constructor(message: string, options: {
|
|
6
|
+
status: number;
|
|
7
|
+
statusText: string;
|
|
8
|
+
details?: unknown;
|
|
9
|
+
});
|
|
10
|
+
}
|
|
11
|
+
export declare class AirPayGatewayValidationError extends Error {
|
|
12
|
+
constructor(message: string);
|
|
13
|
+
}
|
|
14
|
+
//# sourceMappingURL=errors.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"errors.d.ts","sourceRoot":"","sources":["../src/errors.ts"],"names":[],"mappings":"AAAA,qBAAa,kBAAmB,SAAQ,KAAK;IAC3C,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAC;gBAEd,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE;QAAE,MAAM,EAAE,MAAM,CAAC;QAAC,UAAU,EAAE,MAAM,CAAC;QAAC,OAAO,CAAC,EAAE,OAAO,CAAA;KAAE;CAOhG;AAED,qBAAa,4BAA6B,SAAQ,KAAK;gBACzC,OAAO,EAAE,MAAM;CAI5B"}
|
package/dist/errors.js
ADDED
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
export class AirPayGatewayError extends Error {
|
|
2
|
+
status;
|
|
3
|
+
statusText;
|
|
4
|
+
details;
|
|
5
|
+
constructor(message, options) {
|
|
6
|
+
super(message);
|
|
7
|
+
this.name = "AirPayGatewayError";
|
|
8
|
+
this.status = options.status;
|
|
9
|
+
this.statusText = options.statusText;
|
|
10
|
+
this.details = options.details;
|
|
11
|
+
}
|
|
12
|
+
}
|
|
13
|
+
export class AirPayGatewayValidationError extends Error {
|
|
14
|
+
constructor(message) {
|
|
15
|
+
super(message);
|
|
16
|
+
this.name = "AirPayGatewayValidationError";
|
|
17
|
+
}
|
|
18
|
+
}
|
|
19
|
+
//# sourceMappingURL=errors.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"errors.js","sourceRoot":"","sources":["../src/errors.ts"],"names":[],"mappings":"AAAA,MAAM,OAAO,kBAAmB,SAAQ,KAAK;IAClC,MAAM,CAAS;IACf,UAAU,CAAS;IACnB,OAAO,CAAU;IAE1B,YAAY,OAAe,EAAE,OAAkE;QAC7F,KAAK,CAAC,OAAO,CAAC,CAAC;QACf,IAAI,CAAC,IAAI,GAAG,oBAAoB,CAAC;QACjC,IAAI,CAAC,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;QAC7B,IAAI,CAAC,UAAU,GAAG,OAAO,CAAC,UAAU,CAAC;QACrC,IAAI,CAAC,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC;IACjC,CAAC;CACF;AAED,MAAM,OAAO,4BAA6B,SAAQ,KAAK;IACrD,YAAY,OAAe;QACzB,KAAK,CAAC,OAAO,CAAC,CAAC;QACf,IAAI,CAAC,IAAI,GAAG,8BAA8B,CAAC;IAC7C,CAAC;CACF"}
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,UAAU,CAAC;AACzB,cAAc,UAAU,CAAC;AACzB,cAAc,gBAAgB,CAAC;AAC/B,cAAc,SAAS,CAAC;AACxB,cAAc,YAAY,CAAC"}
|
package/dist/index.js
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,UAAU,CAAC;AACzB,cAAc,UAAU,CAAC;AACzB,cAAc,gBAAgB,CAAC;AAC/B,cAAc,SAAS,CAAC;AACxB,cAAc,YAAY,CAAC"}
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
import type { OnlinePaymentRequest, PaymentIntent } from "./types";
|
|
2
|
+
export declare function parseAirPayGatewayPaymentCode(raw: string): OnlinePaymentRequest;
|
|
3
|
+
export declare function paymentRequestMemo(request: OnlinePaymentRequest): string | undefined;
|
|
4
|
+
export declare function buildAirPayPaymentRequestJson(intent: PaymentIntent): string;
|
|
5
|
+
//# sourceMappingURL=payment-code.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"payment-code.d.ts","sourceRoot":"","sources":["../src/payment-code.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAyB,oBAAoB,EAAE,aAAa,EAAE,MAAM,SAAS,CAAC;AAyM1F,wBAAgB,6BAA6B,CAAC,GAAG,EAAE,MAAM,GAAG,oBAAoB,CAY/E;AAED,wBAAgB,kBAAkB,CAAC,OAAO,EAAE,oBAAoB,GAAG,MAAM,GAAG,SAAS,CAEpF;AAED,wBAAgB,6BAA6B,CAAC,MAAM,EAAE,aAAa,GAAG,MAAM,CAyB3E"}
|
|
@@ -0,0 +1,225 @@
|
|
|
1
|
+
import { AirPayGatewayValidationError } from "./errors";
|
|
2
|
+
const SOLANA_ADDRESS_RE = /^[1-9A-HJ-NP-Za-km-z]{32,44}$/;
|
|
3
|
+
const SUPPORTED_GATEWAY_CURRENCIES = ["SOL", "USDC", "USDT", "BRZ", "OFFAIR"];
|
|
4
|
+
function assertSolanaAddress(value, field) {
|
|
5
|
+
if (typeof value !== "string" || !value.trim()) {
|
|
6
|
+
throw new AirPayGatewayValidationError(`${field} is required.`);
|
|
7
|
+
}
|
|
8
|
+
const normalized = value.trim();
|
|
9
|
+
if (!SOLANA_ADDRESS_RE.test(normalized)) {
|
|
10
|
+
throw new AirPayGatewayValidationError(`${field} must look like a Solana address.`);
|
|
11
|
+
}
|
|
12
|
+
return normalized;
|
|
13
|
+
}
|
|
14
|
+
function optionalSolanaAddress(value, field) {
|
|
15
|
+
if (typeof value !== "string" || !value.trim()) {
|
|
16
|
+
return undefined;
|
|
17
|
+
}
|
|
18
|
+
return assertSolanaAddress(value, field);
|
|
19
|
+
}
|
|
20
|
+
function normalizeAmount(value) {
|
|
21
|
+
if (typeof value !== "string" && typeof value !== "number") {
|
|
22
|
+
throw new AirPayGatewayValidationError("Amount is required.");
|
|
23
|
+
}
|
|
24
|
+
const normalized = String(value).trim().replace(",", ".");
|
|
25
|
+
if (!/^\d+(\.\d{1,9})?$/.test(normalized) || Number(normalized) <= 0) {
|
|
26
|
+
throw new AirPayGatewayValidationError("Amount must be a positive decimal with up to 9 decimals.");
|
|
27
|
+
}
|
|
28
|
+
return normalized.replace(/^0+(?=\d)/, "") || "0";
|
|
29
|
+
}
|
|
30
|
+
function normalizeCurrency(value) {
|
|
31
|
+
const normalized = typeof value === "string" ? value.trim().toUpperCase() : "SOL";
|
|
32
|
+
if (!SUPPORTED_GATEWAY_CURRENCIES.includes(normalized)) {
|
|
33
|
+
throw new AirPayGatewayValidationError(`Unsupported payment currency: ${normalized || "empty"}.`);
|
|
34
|
+
}
|
|
35
|
+
return normalized;
|
|
36
|
+
}
|
|
37
|
+
function optionalCurrency(value) {
|
|
38
|
+
if (typeof value !== "string" || !value.trim()) {
|
|
39
|
+
return undefined;
|
|
40
|
+
}
|
|
41
|
+
return normalizeCurrency(value);
|
|
42
|
+
}
|
|
43
|
+
function optionalNumber(value) {
|
|
44
|
+
if (value === null || value === undefined || value === "") {
|
|
45
|
+
return undefined;
|
|
46
|
+
}
|
|
47
|
+
const numeric = Number(value);
|
|
48
|
+
return Number.isFinite(numeric) ? numeric : undefined;
|
|
49
|
+
}
|
|
50
|
+
function parseAllowedPayCurrencies(value) {
|
|
51
|
+
if (typeof value !== "string" || !value.trim()) {
|
|
52
|
+
return undefined;
|
|
53
|
+
}
|
|
54
|
+
const assets = value
|
|
55
|
+
.split(",")
|
|
56
|
+
.map((item) => normalizeCurrency(item))
|
|
57
|
+
.filter((asset, index, all) => all.indexOf(asset) === index);
|
|
58
|
+
return assets.length ? assets : undefined;
|
|
59
|
+
}
|
|
60
|
+
function textValue(value) {
|
|
61
|
+
return typeof value === "string" && value.trim() ? value.trim() : undefined;
|
|
62
|
+
}
|
|
63
|
+
function inferIntentId(params) {
|
|
64
|
+
if (params.intentId)
|
|
65
|
+
return params.intentId;
|
|
66
|
+
if (params.memo?.startsWith("pay_"))
|
|
67
|
+
return params.memo;
|
|
68
|
+
return params.message?.match(/\bpay_[A-Za-z0-9]+\b/)?.[0];
|
|
69
|
+
}
|
|
70
|
+
function parseSolanaPayUrl(raw) {
|
|
71
|
+
const payload = raw.trim().slice("solana:".length);
|
|
72
|
+
const [recipientPart, queryPart = ""] = payload.split("?");
|
|
73
|
+
const params = new URLSearchParams(queryPart);
|
|
74
|
+
const wallet = assertSolanaAddress(decodeURIComponent(recipientPart.replace(/^\/+/, "")), "Wallet");
|
|
75
|
+
const amount = normalizeAmount(params.get("amount"));
|
|
76
|
+
const reference = optionalSolanaAddress(params.get("reference"), "Reference");
|
|
77
|
+
const memo = textValue(params.get("memo"));
|
|
78
|
+
const message = textValue(params.get("message"));
|
|
79
|
+
const label = textValue(params.get("label"));
|
|
80
|
+
const intentId = inferIntentId({ memo, message });
|
|
81
|
+
return {
|
|
82
|
+
source: "solana-pay",
|
|
83
|
+
raw,
|
|
84
|
+
wallet,
|
|
85
|
+
amount,
|
|
86
|
+
currency: "SOL",
|
|
87
|
+
reference,
|
|
88
|
+
label,
|
|
89
|
+
message,
|
|
90
|
+
memo,
|
|
91
|
+
intentId,
|
|
92
|
+
};
|
|
93
|
+
}
|
|
94
|
+
function parseAirPayUrl(raw) {
|
|
95
|
+
let url;
|
|
96
|
+
try {
|
|
97
|
+
url = new URL(raw.trim());
|
|
98
|
+
}
|
|
99
|
+
catch {
|
|
100
|
+
throw new AirPayGatewayValidationError("AirPay payment link is invalid.");
|
|
101
|
+
}
|
|
102
|
+
const params = url.searchParams;
|
|
103
|
+
const currency = normalizeCurrency(params.get("currency") ?? "SOL");
|
|
104
|
+
const memo = textValue(params.get("memo")) ?? textValue(params.get("intentId"));
|
|
105
|
+
const message = textValue(params.get("message"));
|
|
106
|
+
const intentId = inferIntentId({ memo, message, intentId: textValue(params.get("intentId")) });
|
|
107
|
+
return {
|
|
108
|
+
source: "airpay-gateway",
|
|
109
|
+
raw,
|
|
110
|
+
wallet: assertSolanaAddress(params.get("wallet") ?? params.get("recipient"), "Wallet"),
|
|
111
|
+
vaultAddress: optionalSolanaAddress(params.get("vaultAddress") ?? params.get("vault"), "Vault"),
|
|
112
|
+
vaultMode: textValue(params.get("vaultMode")) === "pda_vault" ? "pda_vault" : undefined,
|
|
113
|
+
amount: normalizeAmount(params.get("amount")),
|
|
114
|
+
currency,
|
|
115
|
+
solAmount: textValue(params.get("solAmount")),
|
|
116
|
+
receiveAmount: textValue(params.get("receiveAmount")),
|
|
117
|
+
receiveCurrency: optionalCurrency(params.get("receiveCurrency")),
|
|
118
|
+
payCurrency: optionalCurrency(params.get("payCurrency")),
|
|
119
|
+
conversionFeeBps: optionalNumber(params.get("conversionFeeBps")),
|
|
120
|
+
totalFeeBps: optionalNumber(params.get("totalFeeBps")),
|
|
121
|
+
allowedPayCurrencies: parseAllowedPayCurrencies(params.get("allowedPayCurrencies")),
|
|
122
|
+
reference: optionalSolanaAddress(params.get("reference"), "Reference"),
|
|
123
|
+
label: textValue(params.get("label")),
|
|
124
|
+
message,
|
|
125
|
+
memo,
|
|
126
|
+
intentId,
|
|
127
|
+
};
|
|
128
|
+
}
|
|
129
|
+
function parseJsonPayload(raw) {
|
|
130
|
+
let parsed;
|
|
131
|
+
try {
|
|
132
|
+
parsed = JSON.parse(raw);
|
|
133
|
+
}
|
|
134
|
+
catch {
|
|
135
|
+
throw new AirPayGatewayValidationError("Payment request is not a supported QR or copied code.");
|
|
136
|
+
}
|
|
137
|
+
const record = parsed && typeof parsed === "object" ? parsed : null;
|
|
138
|
+
const intent = record?.intent && typeof record.intent === "object" ? record.intent : record;
|
|
139
|
+
if (!intent) {
|
|
140
|
+
throw new AirPayGatewayValidationError("Payment request JSON is empty.");
|
|
141
|
+
}
|
|
142
|
+
const solanaPayUrl = textValue(intent.solanaPayUrl) ?? textValue(intent.solana_pay_url) ?? textValue(intent.qrCode) ?? textValue(intent.qr_code);
|
|
143
|
+
if (solanaPayUrl?.startsWith("solana:")) {
|
|
144
|
+
const request = parseSolanaPayUrl(solanaPayUrl);
|
|
145
|
+
const intentId = textValue(intent.intentId) ?? textValue(intent.intent_id) ?? request.intentId;
|
|
146
|
+
return {
|
|
147
|
+
...request,
|
|
148
|
+
source: "json",
|
|
149
|
+
raw,
|
|
150
|
+
intentId,
|
|
151
|
+
memo: request.memo ?? intentId,
|
|
152
|
+
label: request.label ?? textValue(intent.label),
|
|
153
|
+
};
|
|
154
|
+
}
|
|
155
|
+
const currency = normalizeCurrency(intent.currency ?? "SOL");
|
|
156
|
+
const intentId = textValue(intent.intentId) ?? textValue(intent.intent_id);
|
|
157
|
+
const memo = textValue(intent.memo) ?? intentId;
|
|
158
|
+
const message = textValue(intent.message);
|
|
159
|
+
return {
|
|
160
|
+
source: "json",
|
|
161
|
+
raw,
|
|
162
|
+
wallet: assertSolanaAddress(intent.wallet ?? intent.recipient ?? intent.toAddress ?? intent.to_address, "Wallet"),
|
|
163
|
+
vaultAddress: optionalSolanaAddress(intent.vaultAddress ?? intent.vault_address, "Vault"),
|
|
164
|
+
vaultMode: textValue(intent.vaultMode ?? intent.vault_mode) === "pda_vault" ? "pda_vault" : undefined,
|
|
165
|
+
amount: normalizeAmount(intent.amount),
|
|
166
|
+
currency,
|
|
167
|
+
solAmount: textValue(intent.solAmount) ?? textValue(intent.sol_amount),
|
|
168
|
+
receiveAmount: textValue(intent.receiveAmount) ?? textValue(intent.receive_amount),
|
|
169
|
+
receiveCurrency: optionalCurrency(intent.receiveCurrency ?? intent.receive_currency),
|
|
170
|
+
payCurrency: optionalCurrency(intent.payCurrency ?? intent.pay_currency),
|
|
171
|
+
conversionFeeBps: optionalNumber(intent.conversionFeeBps ?? intent.conversion_fee_bps),
|
|
172
|
+
totalFeeBps: optionalNumber(intent.totalFeeBps ?? intent.total_fee_bps),
|
|
173
|
+
allowedPayCurrencies: Array.isArray(intent.allowedPayCurrencies)
|
|
174
|
+
? intent.allowedPayCurrencies.map((asset) => normalizeCurrency(asset)).filter((asset, index, all) => all.indexOf(asset) === index)
|
|
175
|
+
: parseAllowedPayCurrencies(intent.allowedPayCurrencies ?? intent.allowed_pay_currencies),
|
|
176
|
+
reference: optionalSolanaAddress(intent.reference, "Reference"),
|
|
177
|
+
label: textValue(intent.label),
|
|
178
|
+
message,
|
|
179
|
+
memo,
|
|
180
|
+
intentId: inferIntentId({ memo, message, intentId }),
|
|
181
|
+
};
|
|
182
|
+
}
|
|
183
|
+
export function parseAirPayGatewayPaymentCode(raw) {
|
|
184
|
+
const normalized = raw.trim();
|
|
185
|
+
if (!normalized) {
|
|
186
|
+
throw new AirPayGatewayValidationError("Paste or scan a payment request first.");
|
|
187
|
+
}
|
|
188
|
+
if (normalized.startsWith("solana:")) {
|
|
189
|
+
return parseSolanaPayUrl(normalized);
|
|
190
|
+
}
|
|
191
|
+
if (normalized.startsWith("airpay://pay")) {
|
|
192
|
+
return parseAirPayUrl(normalized);
|
|
193
|
+
}
|
|
194
|
+
return parseJsonPayload(normalized);
|
|
195
|
+
}
|
|
196
|
+
export function paymentRequestMemo(request) {
|
|
197
|
+
return request.memo ?? request.intentId ?? request.reference;
|
|
198
|
+
}
|
|
199
|
+
export function buildAirPayPaymentRequestJson(intent) {
|
|
200
|
+
return JSON.stringify({
|
|
201
|
+
intent: {
|
|
202
|
+
intentId: intent.intentId,
|
|
203
|
+
amount: intent.amount,
|
|
204
|
+
currency: intent.currency,
|
|
205
|
+
solAmount: intent.solAmount,
|
|
206
|
+
receiveAmount: intent.receiveAmount,
|
|
207
|
+
receiveCurrency: intent.receiveCurrency,
|
|
208
|
+
payAmount: intent.payAmount,
|
|
209
|
+
payCurrency: intent.payCurrency,
|
|
210
|
+
conversionFeeBps: intent.conversionFeeBps,
|
|
211
|
+
totalFeeBps: intent.totalFeeBps,
|
|
212
|
+
allowedPayCurrencies: intent.acceptedPayCurrencies,
|
|
213
|
+
wallet: intent.wallet,
|
|
214
|
+
vaultAddress: intent.vaultAddress,
|
|
215
|
+
vaultMode: intent.vaultMode,
|
|
216
|
+
reference: intent.reference,
|
|
217
|
+
solanaPayUrl: intent.solanaPayUrl,
|
|
218
|
+
airpayUrl: intent.airpayUrl,
|
|
219
|
+
settlementWallet: intent.settlementWallet,
|
|
220
|
+
expiresAt: intent.expiresAt,
|
|
221
|
+
metadata: intent.metadata,
|
|
222
|
+
},
|
|
223
|
+
});
|
|
224
|
+
}
|
|
225
|
+
//# sourceMappingURL=payment-code.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"payment-code.js","sourceRoot":"","sources":["../src/payment-code.ts"],"names":[],"mappings":"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"}
|
package/dist/types.d.ts
ADDED
|
@@ -0,0 +1,259 @@
|
|
|
1
|
+
export type AirPayGatewayCurrency = "SOL" | "USDC" | "USDT" | "BRZ" | "OFFAIR";
|
|
2
|
+
export type PaymentIntentStatus = "pending" | "processing" | "confirmed" | "failed" | "expired";
|
|
3
|
+
export type GatewayWebhookEventType = "payment.confirmed" | "payment.failed" | "payment.expired" | "settlement.completed";
|
|
4
|
+
export type GatewaySettlementStatus = "pending" | "completed" | "failed" | string;
|
|
5
|
+
export type GatewayWebhookDeliveryStatus = "queued" | "delivered" | "failed" | string;
|
|
6
|
+
export type GatewayMetadata = Record<string, unknown>;
|
|
7
|
+
export interface AirPayGatewayClientOptions {
|
|
8
|
+
apiBaseUrl: string;
|
|
9
|
+
apiKey: string;
|
|
10
|
+
fetch?: typeof fetch;
|
|
11
|
+
headers?: Record<string, string>;
|
|
12
|
+
}
|
|
13
|
+
export interface AirPayGatewayAuthClientOptions {
|
|
14
|
+
apiBaseUrl: string;
|
|
15
|
+
fetch?: typeof fetch;
|
|
16
|
+
headers?: Record<string, string>;
|
|
17
|
+
}
|
|
18
|
+
export interface AirPayGatewayAdminClientOptions {
|
|
19
|
+
apiBaseUrl: string;
|
|
20
|
+
adminKey: string;
|
|
21
|
+
fetch?: typeof fetch;
|
|
22
|
+
headers?: Record<string, string>;
|
|
23
|
+
}
|
|
24
|
+
export interface RequestOptions {
|
|
25
|
+
idempotencyKey?: string;
|
|
26
|
+
signal?: AbortSignal;
|
|
27
|
+
}
|
|
28
|
+
export interface PaymentIntentCreateRequest {
|
|
29
|
+
amount: string | number;
|
|
30
|
+
currency?: AirPayGatewayCurrency;
|
|
31
|
+
receiveCurrency?: AirPayGatewayCurrency;
|
|
32
|
+
payCurrency?: AirPayGatewayCurrency;
|
|
33
|
+
acceptedPayCurrencies?: AirPayGatewayCurrency[];
|
|
34
|
+
conversionFeeBps?: number;
|
|
35
|
+
metadata?: GatewayMetadata;
|
|
36
|
+
expiresInSeconds?: number;
|
|
37
|
+
settlementWallet?: string;
|
|
38
|
+
}
|
|
39
|
+
export interface PaymentIntent {
|
|
40
|
+
intentId: string;
|
|
41
|
+
amount: string;
|
|
42
|
+
currency: AirPayGatewayCurrency;
|
|
43
|
+
vaultAddress?: string | null;
|
|
44
|
+
vaultBump?: number | null;
|
|
45
|
+
vaultMode?: "pda_vault" | "legacy_temporary_wallet";
|
|
46
|
+
checkoutUrl?: string | null;
|
|
47
|
+
solAmount?: string | null;
|
|
48
|
+
receiveAmount?: string | null;
|
|
49
|
+
receiveCurrency?: AirPayGatewayCurrency | null;
|
|
50
|
+
payAmount?: string | null;
|
|
51
|
+
payCurrency?: AirPayGatewayCurrency | null;
|
|
52
|
+
conversionFee?: string | null;
|
|
53
|
+
conversionFeeBps?: number | null;
|
|
54
|
+
totalFeeBps?: number | null;
|
|
55
|
+
acceptedPayCurrencies?: AirPayGatewayCurrency[];
|
|
56
|
+
status: PaymentIntentStatus;
|
|
57
|
+
wallet: string;
|
|
58
|
+
reference: string;
|
|
59
|
+
qrCode: string;
|
|
60
|
+
solanaPayUrl: string;
|
|
61
|
+
airpayUrl: string;
|
|
62
|
+
settlementWallet?: string | null;
|
|
63
|
+
expiresAt: string;
|
|
64
|
+
createdAt: string;
|
|
65
|
+
metadata: GatewayMetadata;
|
|
66
|
+
txHash?: string | null;
|
|
67
|
+
amountGross?: string | null;
|
|
68
|
+
gatewayFee?: string | null;
|
|
69
|
+
amountNet?: string | null;
|
|
70
|
+
}
|
|
71
|
+
export interface PaymentIntentStatusResponse {
|
|
72
|
+
intent: PaymentIntent;
|
|
73
|
+
}
|
|
74
|
+
export interface GatewayWalletAuthChallengeRequest {
|
|
75
|
+
walletPublicKey: string;
|
|
76
|
+
walletAddress?: string | null;
|
|
77
|
+
walletId?: string | null;
|
|
78
|
+
audience?: string | null;
|
|
79
|
+
}
|
|
80
|
+
export interface GatewayWalletAuthChallengeResponse {
|
|
81
|
+
message: string;
|
|
82
|
+
nonce: string;
|
|
83
|
+
expiresAt: string;
|
|
84
|
+
walletPublicKey: string;
|
|
85
|
+
}
|
|
86
|
+
export interface GatewayWalletSessionRequest {
|
|
87
|
+
message: string;
|
|
88
|
+
signature: string;
|
|
89
|
+
walletPublicKey: string;
|
|
90
|
+
walletAddress?: string | null;
|
|
91
|
+
walletId?: string | null;
|
|
92
|
+
}
|
|
93
|
+
export interface GatewayWalletSessionResponse {
|
|
94
|
+
accessToken: string;
|
|
95
|
+
tokenType: "airpay-wallet-signature";
|
|
96
|
+
expiresAt: string;
|
|
97
|
+
walletPublicKey: string;
|
|
98
|
+
walletAddress?: string | null;
|
|
99
|
+
walletId?: string | null;
|
|
100
|
+
}
|
|
101
|
+
export interface GatewayMerchant {
|
|
102
|
+
merchantId: string;
|
|
103
|
+
name: string;
|
|
104
|
+
settlementWallet: string;
|
|
105
|
+
feeBps: number;
|
|
106
|
+
status: string;
|
|
107
|
+
}
|
|
108
|
+
export interface GatewayWebhookRegistrationRequest {
|
|
109
|
+
endpointUrl: string;
|
|
110
|
+
events?: GatewayWebhookEventType[];
|
|
111
|
+
secret?: string;
|
|
112
|
+
}
|
|
113
|
+
export interface GatewayWebhookRegistration {
|
|
114
|
+
webhookId: string;
|
|
115
|
+
endpointUrl: string;
|
|
116
|
+
events: GatewayWebhookEventType[];
|
|
117
|
+
status: "active";
|
|
118
|
+
signingSecret?: string | null;
|
|
119
|
+
createdAt: string;
|
|
120
|
+
}
|
|
121
|
+
export interface GatewayWebhookEvent {
|
|
122
|
+
type: GatewayWebhookEventType;
|
|
123
|
+
intentId: string;
|
|
124
|
+
amountGross: string;
|
|
125
|
+
gatewayFee: string;
|
|
126
|
+
amountNet: string;
|
|
127
|
+
currency?: AirPayGatewayCurrency;
|
|
128
|
+
solAmount?: string | null;
|
|
129
|
+
receiveAmount?: string | null;
|
|
130
|
+
receiveCurrency?: AirPayGatewayCurrency | null;
|
|
131
|
+
payCurrency?: AirPayGatewayCurrency | null;
|
|
132
|
+
txHash?: string | null;
|
|
133
|
+
settlementId?: string | null;
|
|
134
|
+
createdAt: string;
|
|
135
|
+
metadata: GatewayMetadata;
|
|
136
|
+
}
|
|
137
|
+
export interface GatewayAdminConfigStatus {
|
|
138
|
+
solanaCluster: string;
|
|
139
|
+
solanaRpcUrl: string;
|
|
140
|
+
settlementDryRun: boolean;
|
|
141
|
+
feeBps: number;
|
|
142
|
+
demoMerchantConfigured: boolean;
|
|
143
|
+
settlementWallet: string;
|
|
144
|
+
feeWallet?: string | null;
|
|
145
|
+
feePayerConfigured: boolean;
|
|
146
|
+
walletSecretConfigured: boolean;
|
|
147
|
+
}
|
|
148
|
+
export interface GatewayAdminCounts {
|
|
149
|
+
merchants: number;
|
|
150
|
+
pendingIntents: number;
|
|
151
|
+
processingIntents: number;
|
|
152
|
+
confirmedIntents: number;
|
|
153
|
+
expiredIntents: number;
|
|
154
|
+
failedIntents: number;
|
|
155
|
+
pendingSettlements: number;
|
|
156
|
+
completedSettlements: number;
|
|
157
|
+
failedSettlements: number;
|
|
158
|
+
queuedWebhooks: number;
|
|
159
|
+
deliveredWebhooks: number;
|
|
160
|
+
failedWebhooks: number;
|
|
161
|
+
}
|
|
162
|
+
export interface GatewayAdminOverview {
|
|
163
|
+
config: GatewayAdminConfigStatus;
|
|
164
|
+
counts: GatewayAdminCounts;
|
|
165
|
+
recentIntents: PaymentIntent[];
|
|
166
|
+
}
|
|
167
|
+
export interface GatewaySettlement {
|
|
168
|
+
settlementId: string;
|
|
169
|
+
intentId: string;
|
|
170
|
+
merchantId: string;
|
|
171
|
+
gross: string;
|
|
172
|
+
gatewayFee: string;
|
|
173
|
+
net: string;
|
|
174
|
+
settlementWallet: string;
|
|
175
|
+
status: GatewaySettlementStatus;
|
|
176
|
+
txHash?: string | null;
|
|
177
|
+
details: GatewayMetadata;
|
|
178
|
+
createdAt: string;
|
|
179
|
+
completedAt?: string | null;
|
|
180
|
+
}
|
|
181
|
+
export interface GatewayWebhookDelivery {
|
|
182
|
+
deliveryId: string;
|
|
183
|
+
webhookId: string;
|
|
184
|
+
merchantId: string;
|
|
185
|
+
intentId: string;
|
|
186
|
+
eventType: string;
|
|
187
|
+
status: GatewayWebhookDeliveryStatus;
|
|
188
|
+
attempts: number;
|
|
189
|
+
lastError?: string | null;
|
|
190
|
+
payload: GatewayMetadata;
|
|
191
|
+
headers: GatewayMetadata;
|
|
192
|
+
createdAt: string;
|
|
193
|
+
deliveredAt?: string | null;
|
|
194
|
+
}
|
|
195
|
+
export interface GatewayListOptions {
|
|
196
|
+
limit?: number;
|
|
197
|
+
status?: string;
|
|
198
|
+
signal?: AbortSignal;
|
|
199
|
+
}
|
|
200
|
+
export interface GatewayWorkerRun {
|
|
201
|
+
expiredIntents: number;
|
|
202
|
+
confirmedIntents: number;
|
|
203
|
+
completedSettlements: number;
|
|
204
|
+
failedSettlements: number;
|
|
205
|
+
deliveredWebhooks: number;
|
|
206
|
+
failedWebhooks: number;
|
|
207
|
+
}
|
|
208
|
+
export interface GatewayConfirmationRequest {
|
|
209
|
+
intentId: string;
|
|
210
|
+
txHash: string;
|
|
211
|
+
amount: string | number;
|
|
212
|
+
wallet: string;
|
|
213
|
+
reference?: string;
|
|
214
|
+
payerWallet?: string;
|
|
215
|
+
slot?: number;
|
|
216
|
+
confirmedAt?: string;
|
|
217
|
+
raw?: GatewayMetadata;
|
|
218
|
+
}
|
|
219
|
+
export interface GatewayConfirmationResponse {
|
|
220
|
+
intent: PaymentIntent;
|
|
221
|
+
settlementId: string;
|
|
222
|
+
webhookDeliveries: number;
|
|
223
|
+
}
|
|
224
|
+
export interface SupportCampaignPaymentRequest {
|
|
225
|
+
campaignId: string;
|
|
226
|
+
campaignSlug: string;
|
|
227
|
+
campaignTitle: string;
|
|
228
|
+
contributionId?: string;
|
|
229
|
+
amount: string | number;
|
|
230
|
+
receiverWallet: string;
|
|
231
|
+
creatorWallet?: string;
|
|
232
|
+
senderWallet?: string;
|
|
233
|
+
displayName?: string;
|
|
234
|
+
message?: string;
|
|
235
|
+
expiresInSeconds?: number;
|
|
236
|
+
}
|
|
237
|
+
export type OnlinePaymentRequestSource = "solana-pay" | "airpay-gateway" | "json";
|
|
238
|
+
export interface OnlinePaymentRequest {
|
|
239
|
+
source: OnlinePaymentRequestSource;
|
|
240
|
+
raw: string;
|
|
241
|
+
wallet: string;
|
|
242
|
+
vaultAddress?: string;
|
|
243
|
+
vaultMode?: "pda_vault" | "legacy_temporary_wallet";
|
|
244
|
+
amount: string;
|
|
245
|
+
currency: AirPayGatewayCurrency;
|
|
246
|
+
solAmount?: string;
|
|
247
|
+
receiveAmount?: string;
|
|
248
|
+
receiveCurrency?: AirPayGatewayCurrency;
|
|
249
|
+
payCurrency?: AirPayGatewayCurrency;
|
|
250
|
+
conversionFeeBps?: number;
|
|
251
|
+
totalFeeBps?: number;
|
|
252
|
+
allowedPayCurrencies?: AirPayGatewayCurrency[];
|
|
253
|
+
reference?: string;
|
|
254
|
+
label?: string;
|
|
255
|
+
message?: string;
|
|
256
|
+
memo?: string;
|
|
257
|
+
intentId?: string;
|
|
258
|
+
}
|
|
259
|
+
//# sourceMappingURL=types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"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"}
|
package/dist/types.js
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
import type { GatewayWebhookEvent } from "./types";
|
|
2
|
+
export type GatewayWebhookHeaders = Headers | Record<string, string | number | string[] | null | undefined>;
|
|
3
|
+
export interface VerifyGatewayWebhookOptions {
|
|
4
|
+
payload: string | GatewayWebhookEvent | Record<string, unknown>;
|
|
5
|
+
headers: GatewayWebhookHeaders;
|
|
6
|
+
secret: string;
|
|
7
|
+
toleranceSeconds?: number;
|
|
8
|
+
now?: Date;
|
|
9
|
+
}
|
|
10
|
+
export interface SignGatewayWebhookOptions {
|
|
11
|
+
payload: string | GatewayWebhookEvent | Record<string, unknown>;
|
|
12
|
+
secret: string;
|
|
13
|
+
timestamp?: number;
|
|
14
|
+
}
|
|
15
|
+
export interface GatewayWebhookVerification {
|
|
16
|
+
ok: boolean;
|
|
17
|
+
event?: GatewayWebhookEvent;
|
|
18
|
+
reason?: string;
|
|
19
|
+
}
|
|
20
|
+
export declare function canonicalGatewayJson(payload: GatewayWebhookEvent | Record<string, unknown>): string;
|
|
21
|
+
export declare function signGatewayWebhookPayload(options: SignGatewayWebhookOptions): Promise<{
|
|
22
|
+
timestamp: string;
|
|
23
|
+
signature: string;
|
|
24
|
+
}>;
|
|
25
|
+
export declare function verifyGatewayWebhookSignature(options: VerifyGatewayWebhookOptions): Promise<GatewayWebhookVerification>;
|
|
26
|
+
export declare function assertGatewayWebhookSignature(options: VerifyGatewayWebhookOptions): Promise<GatewayWebhookEvent>;
|
|
27
|
+
//# sourceMappingURL=webhooks.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"webhooks.d.ts","sourceRoot":"","sources":["../src/webhooks.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,SAAS,CAAC;AAEnD,MAAM,MAAM,qBAAqB,GAC7B,OAAO,GACP,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,GAAG,MAAM,EAAE,GAAG,IAAI,GAAG,SAAS,CAAC,CAAC;AAElE,MAAM,WAAW,2BAA2B;IAC1C,OAAO,EAAE,MAAM,GAAG,mBAAmB,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAChE,OAAO,EAAE,qBAAqB,CAAC;IAC/B,MAAM,EAAE,MAAM,CAAC;IACf,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,GAAG,CAAC,EAAE,IAAI,CAAC;CACZ;AAED,MAAM,WAAW,yBAAyB;IACxC,OAAO,EAAE,MAAM,GAAG,mBAAmB,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAChE,MAAM,EAAE,MAAM,CAAC;IACf,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,0BAA0B;IACzC,EAAE,EAAE,OAAO,CAAC;IACZ,KAAK,CAAC,EAAE,mBAAmB,CAAC;IAC5B,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AA+BD,wBAAgB,oBAAoB,CAAC,OAAO,EAAE,mBAAmB,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,MAAM,CAEnG;AA2CD,wBAAsB,yBAAyB,CAAC,OAAO,EAAE,yBAAyB,GAAG,OAAO,CAAC;IAAE,SAAS,EAAE,MAAM,CAAC;IAAC,SAAS,EAAE,MAAM,CAAA;CAAE,CAAC,CAWrI;AAED,wBAAsB,6BAA6B,CAAC,OAAO,EAAE,2BAA2B,GAAG,OAAO,CAAC,0BAA0B,CAAC,CA8B7H;AAED,wBAAsB,6BAA6B,CAAC,OAAO,EAAE,2BAA2B,GAAG,OAAO,CAAC,mBAAmB,CAAC,CAMtH"}
|
package/dist/webhooks.js
ADDED
|
@@ -0,0 +1,105 @@
|
|
|
1
|
+
import { AirPayGatewayValidationError } from "./errors";
|
|
2
|
+
function headerValue(headers, name) {
|
|
3
|
+
if ("get" in headers && typeof headers.get === "function") {
|
|
4
|
+
return headers.get(name) ?? undefined;
|
|
5
|
+
}
|
|
6
|
+
const lowerName = name.toLowerCase();
|
|
7
|
+
for (const [key, value] of Object.entries(headers)) {
|
|
8
|
+
if (key.toLowerCase() !== lowerName || value === undefined || value === null) {
|
|
9
|
+
continue;
|
|
10
|
+
}
|
|
11
|
+
return Array.isArray(value) ? value[0] : String(value);
|
|
12
|
+
}
|
|
13
|
+
return undefined;
|
|
14
|
+
}
|
|
15
|
+
function sortValue(value) {
|
|
16
|
+
if (Array.isArray(value)) {
|
|
17
|
+
return value.map(sortValue);
|
|
18
|
+
}
|
|
19
|
+
if (value && typeof value === "object") {
|
|
20
|
+
return Object.fromEntries(Object.entries(value)
|
|
21
|
+
.sort(([left], [right]) => (left < right ? -1 : left > right ? 1 : 0))
|
|
22
|
+
.map(([key, child]) => [key, sortValue(child)]));
|
|
23
|
+
}
|
|
24
|
+
return value;
|
|
25
|
+
}
|
|
26
|
+
export function canonicalGatewayJson(payload) {
|
|
27
|
+
return JSON.stringify(sortValue(payload));
|
|
28
|
+
}
|
|
29
|
+
function payloadBody(payload) {
|
|
30
|
+
return typeof payload === "string" ? payload : canonicalGatewayJson(payload);
|
|
31
|
+
}
|
|
32
|
+
function normalizeSignature(value) {
|
|
33
|
+
if (!value)
|
|
34
|
+
return undefined;
|
|
35
|
+
return value.startsWith("sha256=") ? value.slice("sha256=".length) : value;
|
|
36
|
+
}
|
|
37
|
+
async function hmacSha256Hex(secret, message) {
|
|
38
|
+
if (!globalThis.crypto?.subtle) {
|
|
39
|
+
const { createHmac } = await import("node:crypto");
|
|
40
|
+
return createHmac("sha256", secret).update(message).digest("hex");
|
|
41
|
+
}
|
|
42
|
+
const encoder = new TextEncoder();
|
|
43
|
+
const key = await globalThis.crypto.subtle.importKey("raw", encoder.encode(secret), { name: "HMAC", hash: "SHA-256" }, false, ["sign"]);
|
|
44
|
+
const signature = await globalThis.crypto.subtle.sign("HMAC", key, encoder.encode(message));
|
|
45
|
+
return Array.from(new Uint8Array(signature))
|
|
46
|
+
.map((byte) => byte.toString(16).padStart(2, "0"))
|
|
47
|
+
.join("");
|
|
48
|
+
}
|
|
49
|
+
function timingSafeEqualHex(left, right) {
|
|
50
|
+
if (!/^[a-f0-9]+$/i.test(left) || !/^[a-f0-9]+$/i.test(right)) {
|
|
51
|
+
return false;
|
|
52
|
+
}
|
|
53
|
+
const maxLength = Math.max(left.length, right.length);
|
|
54
|
+
let diff = left.length ^ right.length;
|
|
55
|
+
for (let index = 0; index < maxLength; index += 1) {
|
|
56
|
+
diff |= (left.charCodeAt(index) || 0) ^ (right.charCodeAt(index) || 0);
|
|
57
|
+
}
|
|
58
|
+
return diff === 0;
|
|
59
|
+
}
|
|
60
|
+
export async function signGatewayWebhookPayload(options) {
|
|
61
|
+
if (!options.secret.trim()) {
|
|
62
|
+
throw new AirPayGatewayValidationError("Webhook secret is required.");
|
|
63
|
+
}
|
|
64
|
+
const timestamp = String(options.timestamp ?? Math.floor(Date.now() / 1000));
|
|
65
|
+
const body = payloadBody(options.payload);
|
|
66
|
+
const digest = await hmacSha256Hex(options.secret, `${timestamp}.${body}`);
|
|
67
|
+
return {
|
|
68
|
+
timestamp,
|
|
69
|
+
signature: `sha256=${digest}`,
|
|
70
|
+
};
|
|
71
|
+
}
|
|
72
|
+
export async function verifyGatewayWebhookSignature(options) {
|
|
73
|
+
const timestamp = headerValue(options.headers, "x-timestamp");
|
|
74
|
+
const receivedSignature = normalizeSignature(headerValue(options.headers, "x-signature"));
|
|
75
|
+
if (!timestamp || !receivedSignature) {
|
|
76
|
+
return { ok: false, reason: "Missing webhook signature headers." };
|
|
77
|
+
}
|
|
78
|
+
if (!options.secret.trim()) {
|
|
79
|
+
return { ok: false, reason: "Webhook secret is required." };
|
|
80
|
+
}
|
|
81
|
+
const timestampSeconds = Number(timestamp);
|
|
82
|
+
if (!Number.isFinite(timestampSeconds)) {
|
|
83
|
+
return { ok: false, reason: "Invalid webhook timestamp." };
|
|
84
|
+
}
|
|
85
|
+
const toleranceSeconds = options.toleranceSeconds ?? 300;
|
|
86
|
+
const nowSeconds = Math.floor((options.now ?? new Date()).getTime() / 1000);
|
|
87
|
+
if (Math.abs(nowSeconds - timestampSeconds) > toleranceSeconds) {
|
|
88
|
+
return { ok: false, reason: "Webhook timestamp is outside the allowed tolerance." };
|
|
89
|
+
}
|
|
90
|
+
const body = payloadBody(options.payload);
|
|
91
|
+
const expected = await hmacSha256Hex(options.secret, `${timestamp}.${body}`);
|
|
92
|
+
if (!timingSafeEqualHex(expected, receivedSignature)) {
|
|
93
|
+
return { ok: false, reason: "Webhook signature mismatch." };
|
|
94
|
+
}
|
|
95
|
+
const event = typeof options.payload === "string" ? JSON.parse(options.payload) : options.payload;
|
|
96
|
+
return { ok: true, event };
|
|
97
|
+
}
|
|
98
|
+
export async function assertGatewayWebhookSignature(options) {
|
|
99
|
+
const verification = await verifyGatewayWebhookSignature(options);
|
|
100
|
+
if (!verification.ok || !verification.event) {
|
|
101
|
+
throw new AirPayGatewayValidationError(verification.reason ?? "Webhook signature verification failed.");
|
|
102
|
+
}
|
|
103
|
+
return verification.event;
|
|
104
|
+
}
|
|
105
|
+
//# sourceMappingURL=webhooks.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"webhooks.js","sourceRoot":"","sources":["../src/webhooks.ts"],"names":[],"mappings":"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"}
|
package/package.json
ADDED
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@protocol-offair/gateway-sdk",
|
|
3
|
+
"version": "0.1.0",
|
|
4
|
+
"type": "module",
|
|
5
|
+
"sideEffects": false,
|
|
6
|
+
"main": "./dist/index.js",
|
|
7
|
+
"types": "./dist/index.d.ts",
|
|
8
|
+
"publishConfig": {
|
|
9
|
+
"access": "public"
|
|
10
|
+
},
|
|
11
|
+
"exports": {
|
|
12
|
+
".": {
|
|
13
|
+
"types": "./dist/index.d.ts",
|
|
14
|
+
"import": "./dist/index.js"
|
|
15
|
+
}
|
|
16
|
+
},
|
|
17
|
+
"files": [
|
|
18
|
+
"dist",
|
|
19
|
+
"README.md"
|
|
20
|
+
],
|
|
21
|
+
"scripts": {
|
|
22
|
+
"build": "tsc -p tsconfig.json",
|
|
23
|
+
"typecheck": "tsc -p tsconfig.test.json --noEmit",
|
|
24
|
+
"test": "vitest run"
|
|
25
|
+
},
|
|
26
|
+
"devDependencies": {
|
|
27
|
+
"@types/node": "^24.6.0",
|
|
28
|
+
"typescript": "^5.9.3",
|
|
29
|
+
"vitest": "^3.2.4"
|
|
30
|
+
},
|
|
31
|
+
"repository": {
|
|
32
|
+
"type": "git",
|
|
33
|
+
"url": "git+https://github.com/protocol-offair/airpay-gateway-sdk.git"
|
|
34
|
+
}
|
|
35
|
+
}
|