meridianjs 0.2.4 → 0.2.7

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 (120) hide show
  1. package/CHANGELOG.md +42 -0
  2. package/README.md +155 -530
  3. package/dist/analytics/collector.d.ts +16 -0
  4. package/dist/analytics/collector.d.ts.map +1 -1
  5. package/dist/analytics/collector.js +20 -0
  6. package/dist/analytics/collector.js.map +1 -1
  7. package/dist/capabilities/registry.d.ts.map +1 -1
  8. package/dist/capabilities/registry.js +7 -0
  9. package/dist/capabilities/registry.js.map +1 -1
  10. package/dist/core/pipeline.d.ts.map +1 -1
  11. package/dist/core/pipeline.js +18 -1
  12. package/dist/core/pipeline.js.map +1 -1
  13. package/dist/core/types.d.ts +9 -4
  14. package/dist/core/types.d.ts.map +1 -1
  15. package/dist/core/types.js +1 -1
  16. package/dist/core/types.js.map +1 -1
  17. package/dist/generator/index.d.ts +2 -0
  18. package/dist/generator/index.d.ts.map +1 -1
  19. package/dist/generator/index.js +2 -1
  20. package/dist/generator/index.js.map +1 -1
  21. package/dist/generator/openapi-export.d.ts +51 -0
  22. package/dist/generator/openapi-export.d.ts.map +1 -0
  23. package/dist/generator/openapi-export.js +95 -0
  24. package/dist/generator/openapi-export.js.map +1 -0
  25. package/dist/generator/templates.d.ts.map +1 -1
  26. package/dist/generator/templates.js +89 -18
  27. package/dist/generator/templates.js.map +1 -1
  28. package/dist/index.d.ts +7 -0
  29. package/dist/index.d.ts.map +1 -1
  30. package/dist/index.js +15 -0
  31. package/dist/index.js.map +1 -1
  32. package/dist/policies/builtin.d.ts +16 -0
  33. package/dist/policies/builtin.d.ts.map +1 -1
  34. package/dist/policies/builtin.js +92 -0
  35. package/dist/policies/builtin.js.map +1 -1
  36. package/dist/policies/index.d.ts +1 -1
  37. package/dist/policies/index.d.ts.map +1 -1
  38. package/dist/policies/index.js +1 -1
  39. package/dist/policies/index.js.map +1 -1
  40. package/dist/providers/billdesk/adapter.d.ts +36 -0
  41. package/dist/providers/billdesk/adapter.d.ts.map +1 -0
  42. package/dist/providers/billdesk/adapter.js +212 -0
  43. package/dist/providers/billdesk/adapter.js.map +1 -0
  44. package/dist/providers/billdesk/index.d.ts +3 -0
  45. package/dist/providers/billdesk/index.d.ts.map +1 -0
  46. package/dist/providers/billdesk/index.js +3 -0
  47. package/dist/providers/billdesk/index.js.map +1 -0
  48. package/dist/providers/billdesk/pagination.d.ts +15 -0
  49. package/dist/providers/billdesk/pagination.d.ts.map +1 -0
  50. package/dist/providers/billdesk/pagination.js +51 -0
  51. package/dist/providers/billdesk/pagination.js.map +1 -0
  52. package/dist/providers/ccavenue/adapter.d.ts +38 -0
  53. package/dist/providers/ccavenue/adapter.d.ts.map +1 -0
  54. package/dist/providers/ccavenue/adapter.js +181 -0
  55. package/dist/providers/ccavenue/adapter.js.map +1 -0
  56. package/dist/providers/ccavenue/index.d.ts +3 -0
  57. package/dist/providers/ccavenue/index.d.ts.map +1 -0
  58. package/dist/providers/ccavenue/index.js +3 -0
  59. package/dist/providers/ccavenue/index.js.map +1 -0
  60. package/dist/providers/ccavenue/pagination.d.ts +16 -0
  61. package/dist/providers/ccavenue/pagination.d.ts.map +1 -0
  62. package/dist/providers/ccavenue/pagination.js +20 -0
  63. package/dist/providers/ccavenue/pagination.js.map +1 -0
  64. package/dist/providers/datadog/adapter.d.ts +30 -0
  65. package/dist/providers/datadog/adapter.d.ts.map +1 -0
  66. package/dist/providers/datadog/adapter.js +163 -0
  67. package/dist/providers/datadog/adapter.js.map +1 -0
  68. package/dist/providers/datadog/index.d.ts +3 -0
  69. package/dist/providers/datadog/index.d.ts.map +1 -0
  70. package/dist/providers/datadog/index.js +3 -0
  71. package/dist/providers/datadog/index.js.map +1 -0
  72. package/dist/providers/datadog/pagination.d.ts +16 -0
  73. package/dist/providers/datadog/pagination.d.ts.map +1 -0
  74. package/dist/providers/datadog/pagination.js +41 -0
  75. package/dist/providers/datadog/pagination.js.map +1 -0
  76. package/dist/providers/s3/adapter.d.ts +37 -0
  77. package/dist/providers/s3/adapter.d.ts.map +1 -0
  78. package/dist/providers/s3/adapter.js +206 -0
  79. package/dist/providers/s3/adapter.js.map +1 -0
  80. package/dist/providers/s3/index.d.ts +4 -0
  81. package/dist/providers/s3/index.d.ts.map +1 -0
  82. package/dist/providers/s3/index.js +4 -0
  83. package/dist/providers/s3/index.js.map +1 -0
  84. package/dist/providers/s3/pagination.d.ts +18 -0
  85. package/dist/providers/s3/pagination.d.ts.map +1 -0
  86. package/dist/providers/s3/pagination.js +58 -0
  87. package/dist/providers/s3/pagination.js.map +1 -0
  88. package/dist/providers/s3/sigv4.d.ts +29 -0
  89. package/dist/providers/s3/sigv4.d.ts.map +1 -0
  90. package/dist/providers/s3/sigv4.js +101 -0
  91. package/dist/providers/s3/sigv4.js.map +1 -0
  92. package/dist/providers/sentry/adapter.d.ts +29 -0
  93. package/dist/providers/sentry/adapter.d.ts.map +1 -0
  94. package/dist/providers/sentry/adapter.js +154 -0
  95. package/dist/providers/sentry/adapter.js.map +1 -0
  96. package/dist/providers/sentry/index.d.ts +3 -0
  97. package/dist/providers/sentry/index.d.ts.map +1 -0
  98. package/dist/providers/sentry/index.js +3 -0
  99. package/dist/providers/sentry/index.js.map +1 -0
  100. package/dist/providers/sentry/pagination.d.ts +17 -0
  101. package/dist/providers/sentry/pagination.d.ts.map +1 -0
  102. package/dist/providers/sentry/pagination.js +54 -0
  103. package/dist/providers/sentry/pagination.js.map +1 -0
  104. package/dist/public.d.ts +14 -2
  105. package/dist/public.d.ts.map +1 -1
  106. package/dist/public.js +10 -2
  107. package/dist/public.js.map +1 -1
  108. package/dist/schema/monitor.d.ts +14 -1
  109. package/dist/schema/monitor.d.ts.map +1 -1
  110. package/dist/schema/monitor.js +24 -0
  111. package/dist/schema/monitor.js.map +1 -1
  112. package/dist/services/service-client.d.ts +8 -1
  113. package/dist/services/service-client.d.ts.map +1 -1
  114. package/dist/services/service-client.js +87 -0
  115. package/dist/services/service-client.js.map +1 -1
  116. package/dist/upi/index.d.ts +43 -0
  117. package/dist/upi/index.d.ts.map +1 -0
  118. package/dist/upi/index.js +57 -0
  119. package/dist/upi/index.js.map +1 -0
  120. package/package.json +9 -2
@@ -0,0 +1,212 @@
1
+ import { createHmac, randomUUID, timingSafeEqual } from "node:crypto";
2
+ import { ResponseNormalizer } from "../../core/normalizer.js";
3
+ import { MeridianError, SDK_VERSION } from "../../core/types.js";
4
+ import { BilldeskPaginationStrategy } from "./pagination.js";
5
+ const JOSE_CONTENT_TYPE = "application/jose";
6
+ function base64url(input) {
7
+ return Buffer.from(input).toString("base64url");
8
+ }
9
+ function base64urlDecode(input) {
10
+ return Buffer.from(input, "base64url");
11
+ }
12
+ /**
13
+ * BillDesk's payment APIs use JOSE (JWS-HMAC, alg HS256) instead of bearer tokens:
14
+ * the request/response bodies are wrapped in a compact JWS, and the merchant's
15
+ * `clientid` travels inside the JWS header rather than as a separate HTTP header.
16
+ * `BD-Traceid` doubles as the request's idempotency key (BillDesk rejects a repeat
17
+ * Traceid within the same day) and `BD-Timestamp` is the epoch seconds at send time.
18
+ *
19
+ * See: https://docs.billdesk.io/reference/authentications-and-endpoints
20
+ */
21
+ export class BilldeskAdapter {
22
+ baseUrl;
23
+ constructor(baseUrl = "https://api.billdesk.com/") {
24
+ this.baseUrl = baseUrl;
25
+ }
26
+ buildRequest(input) {
27
+ const { endpoint, options, authToken, baseUrl } = input;
28
+ const effectiveBaseUrl = baseUrl ?? this.baseUrl;
29
+ const url = new URL(endpoint, effectiveBaseUrl);
30
+ if (options.query) {
31
+ for (const [key, value] of Object.entries(options.query)) {
32
+ url.searchParams.set(key, String(value));
33
+ }
34
+ }
35
+ const [clientId, secretKey] = authToken.token.split("|BD|");
36
+ const method = options.method ?? "GET";
37
+ const headers = {
38
+ Accept: JOSE_CONTENT_TYPE,
39
+ "User-Agent": `Meridian-SDK/${SDK_VERSION}`,
40
+ "BD-Timestamp": String(Math.floor(Date.now() / 1000)),
41
+ "BD-Traceid": (options.idempotencyKey ?? randomUUID())
42
+ .replace(/[^a-zA-Z0-9]/g, "")
43
+ .slice(0, 35),
44
+ ...options.headers,
45
+ };
46
+ let body;
47
+ if (clientId && secretKey) {
48
+ if (options.body && method !== "GET" && method !== "HEAD") {
49
+ body = this.signJws(options.body, clientId, secretKey);
50
+ headers["Content-Type"] = JOSE_CONTENT_TYPE;
51
+ }
52
+ else if (method !== "GET" && method !== "HEAD") {
53
+ body = this.signJws({}, clientId, secretKey);
54
+ headers["Content-Type"] = JOSE_CONTENT_TYPE;
55
+ }
56
+ }
57
+ const built = { url: url.toString(), method, headers };
58
+ if (body !== undefined) {
59
+ built.body = body;
60
+ }
61
+ return built;
62
+ }
63
+ /** Builds a compact JWS (header.payload.signature, alg=HS256) per BillDesk's JOSE contract. */
64
+ signJws(payload, clientId, secretKey) {
65
+ const header = { alg: "HS256", clientid: clientId };
66
+ const encodedHeader = base64url(JSON.stringify(header));
67
+ const encodedPayload = base64url(JSON.stringify(payload ?? {}));
68
+ const signingInput = `${encodedHeader}.${encodedPayload}`;
69
+ const signature = base64url(createHmac("sha256", secretKey).update(signingInput).digest());
70
+ return `${signingInput}.${signature}`;
71
+ }
72
+ /** Decodes a compact JWS payload segment back into JSON, without verifying the signature. */
73
+ decodeJwsPayload(token) {
74
+ const parts = token.split(".");
75
+ if (parts.length !== 3 || !parts[1])
76
+ return null;
77
+ try {
78
+ return JSON.parse(base64urlDecode(parts[1]).toString("utf-8"));
79
+ }
80
+ catch {
81
+ return null;
82
+ }
83
+ }
84
+ parseResponse(raw) {
85
+ let body = raw.body;
86
+ if (typeof body === "string" && body.split(".").length === 3) {
87
+ const decoded = this.decodeJwsPayload(body);
88
+ if (decoded !== null) {
89
+ body = decoded;
90
+ }
91
+ }
92
+ const effectiveRaw = { ...raw, body };
93
+ const rateLimitInfo = this.rateLimitPolicy(raw.headers);
94
+ const paginationStrategy = this.paginationStrategy();
95
+ const paginationInfo = ResponseNormalizer.extractPaginationInfo(effectiveRaw, paginationStrategy);
96
+ return ResponseNormalizer.normalize(effectiveRaw, "billdesk", rateLimitInfo, paginationInfo, [], "1.0.0");
97
+ }
98
+ parseError(raw) {
99
+ if (raw instanceof Error) {
100
+ const msg = raw.message.toLowerCase();
101
+ if (msg.includes("fetch") ||
102
+ msg.includes("network") ||
103
+ msg.includes("econnreset") ||
104
+ msg.includes("etimedout") ||
105
+ msg.includes("enotfound") ||
106
+ msg.includes("timeout")) {
107
+ return this.createMeridianError("network", true, "Network request failed. Check your connection and try again.", { originalError: raw.message });
108
+ }
109
+ }
110
+ if (typeof raw === "object" &&
111
+ raw !== null &&
112
+ "status" in raw &&
113
+ typeof raw.status === "number") {
114
+ return this.parseHttpError(raw);
115
+ }
116
+ return this.createMeridianError("provider", false, "An unexpected error occurred", { raw });
117
+ }
118
+ parseHttpError(error) {
119
+ const { status } = error;
120
+ let body = error.body;
121
+ if (typeof body === "string" && body.split(".").length === 3) {
122
+ const decoded = this.decodeJwsPayload(body);
123
+ if (decoded !== null) {
124
+ body = decoded;
125
+ }
126
+ }
127
+ const errorBody = (typeof body === "object" ? body : undefined);
128
+ const errorMessage = errorBody?.message ?? errorBody?.transaction_error_desc ?? errorBody?.error_code;
129
+ if (status === 401 || status === 403) {
130
+ return this.createMeridianError("auth", false, errorMessage ?? "Authentication failed. Check your BillDesk client ID and secret key.", { errorCode: errorBody?.error_code }, undefined, status);
131
+ }
132
+ if (status === 404) {
133
+ return this.createMeridianError("validation", false, errorMessage ?? "Resource not found.", { errorCode: errorBody?.error_code }, undefined, 404);
134
+ }
135
+ if (status === 429) {
136
+ return this.createMeridianError("rate_limit", true, errorMessage ?? "Rate limit exceeded. Please wait before retrying.", { errorCode: errorBody?.error_code }, undefined, 429);
137
+ }
138
+ if (status === 400 || status === 409 || status === 422) {
139
+ return this.createMeridianError("validation", false, errorMessage ?? "Request validation failed.", { errorCode: errorBody?.error_code, errorType: errorBody?.error_type }, undefined, status);
140
+ }
141
+ if (status >= 500) {
142
+ return this.createMeridianError("provider", true, errorMessage ?? `BillDesk API returned error ${status}. This may be temporary.`, { status }, undefined, status);
143
+ }
144
+ if (status >= 400) {
145
+ return this.createMeridianError("validation", false, errorMessage ?? `Request failed with status ${status}.`, { status }, undefined, status);
146
+ }
147
+ return this.createMeridianError("provider", false, `Unexpected response status ${status}.`, { status }, undefined, status);
148
+ }
149
+ async authStrategy(config) {
150
+ const clientId = config.clientId ?? config.username;
151
+ const secretKey = config.clientSecret ?? config.apiSecret ?? config.password;
152
+ if (!clientId || !secretKey) {
153
+ throw this.createMeridianError("auth", false, "BillDesk authentication requires a client ID and secret key. " +
154
+ "Set auth.clientId + auth.clientSecret (merchant client ID and HMAC secret key).", {}, undefined, 401);
155
+ }
156
+ return { token: `${clientId}|BD|${secretKey}` };
157
+ }
158
+ rateLimitPolicy(_headers) {
159
+ // BillDesk does not publish rate-limit headers; return conservative defaults.
160
+ return {
161
+ limit: 60,
162
+ remaining: 60,
163
+ reset: new Date(Date.now() + 60_000),
164
+ };
165
+ }
166
+ paginationStrategy() {
167
+ return new BilldeskPaginationStrategy();
168
+ }
169
+ getIdempotencyConfig() {
170
+ return {
171
+ defaultSafeOperations: new Set(["GET", "HEAD", "OPTIONS"]),
172
+ operationOverrides: new Map(),
173
+ };
174
+ }
175
+ /**
176
+ * Verifies a webhook/LCM notification's JWS-HMAC signature. BillDesk delivers
177
+ * webhook payloads as compact JWS strings signed with the merchant's secret key;
178
+ * `signature` is the full `header.payload.signature` string (or just the signature
179
+ * segment), and `payload` is the raw request body received from BillDesk.
180
+ */
181
+ verifyWebhook(payload, signature, secret) {
182
+ const raw = typeof payload === "string" ? payload : payload.toString("utf-8");
183
+ const parts = raw.split(".");
184
+ let signingInput;
185
+ let providedSignature;
186
+ if (parts.length === 3 && parts[0] && parts[1]) {
187
+ signingInput = `${parts[0]}.${parts[1]}`;
188
+ providedSignature = signature.includes(".")
189
+ ? (signature.split(".").pop() ?? signature)
190
+ : signature;
191
+ }
192
+ else {
193
+ signingInput = raw;
194
+ providedSignature = signature;
195
+ }
196
+ const expected = base64url(createHmac("sha256", secret).update(signingInput).digest());
197
+ try {
198
+ const a = Buffer.from(expected);
199
+ const b = Buffer.from(providedSignature);
200
+ if (a.length !== b.length)
201
+ return false;
202
+ return timingSafeEqual(a, b);
203
+ }
204
+ catch {
205
+ return false;
206
+ }
207
+ }
208
+ createMeridianError(category, retryable, message, metadata, retryAfter, status) {
209
+ return new MeridianError(message, category, "billdesk", retryable, "", metadata, retryAfter, status);
210
+ }
211
+ }
212
+ //# sourceMappingURL=adapter.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"adapter.js","sourceRoot":"","sources":["../../../src/providers/billdesk/adapter.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ export * from "./adapter.js";
2
+ export * from "./pagination.js";
3
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/providers/billdesk/index.ts"],"names":[],"mappings":"AAAA,cAAc,cAAc,CAAC;AAC7B,cAAc,iBAAiB,CAAC"}
@@ -0,0 +1,3 @@
1
+ export * from "./adapter.js";
2
+ export * from "./pagination.js";
3
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/providers/billdesk/index.ts"],"names":[],"mappings":"AAAA,cAAc,cAAc,CAAC;AAC7B,cAAc,iBAAiB,CAAC"}
@@ -0,0 +1,15 @@
1
+ import type { PaginationStrategy, RawResponse, RequestOptions } from "../../core/types.js";
2
+ /**
3
+ * BillDesk list endpoints (e.g. transaction search) are page-based:
4
+ * { transactions: [...], page_number: number, total_pages: number }
5
+ */
6
+ export declare class BilldeskPaginationStrategy implements PaginationStrategy {
7
+ extractCursor(response: RawResponse): string | null;
8
+ extractTotal(response: RawResponse): number | null;
9
+ hasNext(response: RawResponse): boolean;
10
+ buildNextRequest(endpoint: string, options: RequestOptions, cursor: string): {
11
+ endpoint: string;
12
+ options: RequestOptions;
13
+ };
14
+ }
15
+ //# sourceMappingURL=pagination.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pagination.d.ts","sourceRoot":"","sources":["../../../src/providers/billdesk/pagination.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,kBAAkB,EAAE,WAAW,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC;AAI3F;;;GAGG;AACH,qBAAa,0BAA2B,YAAW,kBAAkB;IACnE,aAAa,CAAC,QAAQ,EAAE,WAAW,GAAG,MAAM,GAAG,IAAI;IAUnD,YAAY,CAAC,QAAQ,EAAE,WAAW,GAAG,MAAM,GAAG,IAAI;IAUlD,OAAO,CAAC,QAAQ,EAAE,WAAW,GAAG,OAAO;IAcvC,gBAAgB,CACd,QAAQ,EAAE,MAAM,EAChB,OAAO,EAAE,cAAc,EACvB,MAAM,EAAE,MAAM,GACb;QAAE,QAAQ,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,cAAc,CAAA;KAAE;CAYjD"}
@@ -0,0 +1,51 @@
1
+ const DEFAULT_PAGE_SIZE = 20;
2
+ /**
3
+ * BillDesk list endpoints (e.g. transaction search) are page-based:
4
+ * { transactions: [...], page_number: number, total_pages: number }
5
+ */
6
+ export class BilldeskPaginationStrategy {
7
+ extractCursor(response) {
8
+ if (typeof response.body === "object" && response.body !== null) {
9
+ const body = response.body;
10
+ if (typeof body.page_number === "number") {
11
+ return String(body.page_number + 1);
12
+ }
13
+ }
14
+ return null;
15
+ }
16
+ extractTotal(response) {
17
+ if (typeof response.body === "object" && response.body !== null) {
18
+ const body = response.body;
19
+ if (typeof body.total_count === "number") {
20
+ return body.total_count;
21
+ }
22
+ }
23
+ return null;
24
+ }
25
+ hasNext(response) {
26
+ if (typeof response.body === "object" && response.body !== null) {
27
+ const body = response.body;
28
+ if (typeof body.page_number === "number" && typeof body.total_pages === "number") {
29
+ return body.page_number < body.total_pages;
30
+ }
31
+ const items = body.transactions ?? body.data;
32
+ if (Array.isArray(items)) {
33
+ return items.length === DEFAULT_PAGE_SIZE;
34
+ }
35
+ }
36
+ return false;
37
+ }
38
+ buildNextRequest(endpoint, options, cursor) {
39
+ return {
40
+ endpoint,
41
+ options: {
42
+ ...options,
43
+ query: {
44
+ ...options.query,
45
+ page_number: cursor,
46
+ },
47
+ },
48
+ };
49
+ }
50
+ }
51
+ //# sourceMappingURL=pagination.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pagination.js","sourceRoot":"","sources":["../../../src/providers/billdesk/pagination.ts"],"names":[],"mappings":"AAEA,MAAM,iBAAiB,GAAG,EAAE,CAAC;AAE7B;;;GAGG;AACH,MAAM,OAAO,0BAA0B;IACrC,aAAa,CAAC,QAAqB;QACjC,IAAI,OAAO,QAAQ,CAAC,IAAI,KAAK,QAAQ,IAAI,QAAQ,CAAC,IAAI,KAAK,IAAI,EAAE,CAAC;YAChE,MAAM,IAAI,GAAG,QAAQ,CAAC,IAA+B,CAAC;YACtD,IAAI,OAAO,IAAI,CAAC,WAAW,KAAK,QAAQ,EAAE,CAAC;gBACzC,OAAO,MAAM,CAAC,IAAI,CAAC,WAAW,GAAG,CAAC,CAAC,CAAC;YACtC,CAAC;QACH,CAAC;QACD,OAAO,IAAI,CAAC;IACd,CAAC;IAED,YAAY,CAAC,QAAqB;QAChC,IAAI,OAAO,QAAQ,CAAC,IAAI,KAAK,QAAQ,IAAI,QAAQ,CAAC,IAAI,KAAK,IAAI,EAAE,CAAC;YAChE,MAAM,IAAI,GAAG,QAAQ,CAAC,IAA+B,CAAC;YACtD,IAAI,OAAO,IAAI,CAAC,WAAW,KAAK,QAAQ,EAAE,CAAC;gBACzC,OAAO,IAAI,CAAC,WAAW,CAAC;YAC1B,CAAC;QACH,CAAC;QACD,OAAO,IAAI,CAAC;IACd,CAAC;IAED,OAAO,CAAC,QAAqB;QAC3B,IAAI,OAAO,QAAQ,CAAC,IAAI,KAAK,QAAQ,IAAI,QAAQ,CAAC,IAAI,KAAK,IAAI,EAAE,CAAC;YAChE,MAAM,IAAI,GAAG,QAAQ,CAAC,IAA+B,CAAC;YACtD,IAAI,OAAO,IAAI,CAAC,WAAW,KAAK,QAAQ,IAAI,OAAO,IAAI,CAAC,WAAW,KAAK,QAAQ,EAAE,CAAC;gBACjF,OAAO,IAAI,CAAC,WAAW,GAAG,IAAI,CAAC,WAAW,CAAC;YAC7C,CAAC;YACD,MAAM,KAAK,GAAG,IAAI,CAAC,YAAY,IAAI,IAAI,CAAC,IAAI,CAAC;YAC7C,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC;gBACzB,OAAO,KAAK,CAAC,MAAM,KAAK,iBAAiB,CAAC;YAC5C,CAAC;QACH,CAAC;QACD,OAAO,KAAK,CAAC;IACf,CAAC;IAED,gBAAgB,CACd,QAAgB,EAChB,OAAuB,EACvB,MAAc;QAEd,OAAO;YACL,QAAQ;YACR,OAAO,EAAE;gBACP,GAAG,OAAO;gBACV,KAAK,EAAE;oBACL,GAAG,OAAO,CAAC,KAAK;oBAChB,WAAW,EAAE,MAAM;iBACpB;aACF;SACF,CAAC;IACJ,CAAC;CACF"}
@@ -0,0 +1,38 @@
1
+ import type { AdapterInput, AuthConfig, AuthToken, BuiltRequest, IdempotencyConfig, NormalizedResponse, PaginationStrategy, ProviderAdapter, RateLimitInfo, RawResponse } from "../../core/types.js";
2
+ import { MeridianError } from "../../core/types.js";
3
+ /** Encrypts a JSON-serializable payload into the hex `enc_request` CCAvenue expects. */
4
+ export declare function ccavenueEncrypt(data: unknown, workingKey: string): string;
5
+ /** Decrypts a hex `enc_response` string back into its plaintext (typically JSON). */
6
+ export declare function ccavenueDecrypt(encHex: string, workingKey: string): string;
7
+ /**
8
+ * CCAvenue's REST APIs exchange AES-128-CBC encrypted payloads (`enc_request` /
9
+ * `enc_response`) keyed off a merchant "working key", alongside a plaintext
10
+ * `access_code` that identifies the registered integration. Because
11
+ * `parseResponse` doesn't have access to the working key, this adapter passes
12
+ * `enc_response` through untouched in the normalized data — call the exported
13
+ * `ccavenueDecrypt` helper (or the adapter's `decryptResponse`) with your
14
+ * working key to recover the plaintext payload.
15
+ */
16
+ export declare class CcavenueAdapter implements ProviderAdapter {
17
+ private baseUrl;
18
+ constructor(baseUrl?: string);
19
+ buildRequest(input: AdapterInput): BuiltRequest;
20
+ /** Decrypts a normalized response's `enc_response` field with the given working key. */
21
+ decryptResponse(response: NormalizedResponse, workingKey: string): unknown;
22
+ parseResponse(raw: RawResponse): NormalizedResponse;
23
+ parseError(raw: unknown): MeridianError;
24
+ private parseHttpError;
25
+ authStrategy(config: AuthConfig): Promise<AuthToken>;
26
+ rateLimitPolicy(_headers: Headers): RateLimitInfo;
27
+ paginationStrategy(): PaginationStrategy;
28
+ getIdempotencyConfig(): IdempotencyConfig;
29
+ /**
30
+ * CCAvenue server-to-server (S2S) response/webhook payloads carry a plaintext
31
+ * `enc_resp_hash` / signature derived as HMAC-SHA256 of the encrypted response
32
+ * body using the working key. `payload` should be the raw `enc_response` (or
33
+ * full body string) CCAvenue posted, and `secret` the merchant's working key.
34
+ */
35
+ verifyWebhook(payload: string | Buffer, signature: string, secret: string): boolean;
36
+ private createMeridianError;
37
+ }
38
+ //# sourceMappingURL=adapter.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"adapter.d.ts","sourceRoot":"","sources":["../../../src/providers/ccavenue/adapter.ts"],"names":[],"mappings":"AAQA,OAAO,KAAK,EACV,YAAY,EACZ,UAAU,EACV,SAAS,EACT,YAAY,EACZ,iBAAiB,EACjB,kBAAkB,EAClB,kBAAkB,EAClB,eAAe,EACf,aAAa,EACb,WAAW,EACZ,MAAM,qBAAqB,CAAC;AAC7B,OAAO,EAAyB,aAAa,EAAe,MAAM,qBAAqB,CAAC;AAgBxF,wFAAwF;AACxF,wBAAgB,eAAe,CAAC,IAAI,EAAE,OAAO,EAAE,UAAU,EAAE,MAAM,GAAG,MAAM,CAKzE;AAED,qFAAqF;AACrF,wBAAgB,eAAe,CAAC,MAAM,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,GAAG,MAAM,CAK1E;AAED;;;;;;;;GAQG;AACH,qBAAa,eAAgB,YAAW,eAAe;IACrD,OAAO,CAAC,OAAO,CAAS;gBAEZ,OAAO,SAA8B;IAIjD,YAAY,CAAC,KAAK,EAAE,YAAY,GAAG,YAAY;IAgC/C,wFAAwF;IACxF,eAAe,CAAC,QAAQ,EAAE,kBAAkB,EAAE,UAAU,EAAE,MAAM,GAAG,OAAO;IAU1E,aAAa,CAAC,GAAG,EAAE,WAAW,GAAG,kBAAkB;IAqBnD,UAAU,CAAC,GAAG,EAAE,OAAO,GAAG,aAAa;IAkCvC,OAAO,CAAC,cAAc;IAqFhB,YAAY,CAAC,MAAM,EAAE,UAAU,GAAG,OAAO,CAAC,SAAS,CAAC;IAmB1D,eAAe,CAAC,QAAQ,EAAE,OAAO,GAAG,aAAa;IASjD,kBAAkB,IAAI,kBAAkB;IAIxC,oBAAoB,IAAI,iBAAiB;IAOzC;;;;;OAKG;IACH,aAAa,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,OAAO;IAanF,OAAO,CAAC,mBAAmB;CAmB5B"}
@@ -0,0 +1,181 @@
1
+ import { createCipheriv, createDecipheriv, createHash, createHmac, timingSafeEqual, } from "node:crypto";
2
+ import { ResponseNormalizer } from "../../core/normalizer.js";
3
+ import { MeridianError, SDK_VERSION } from "../../core/types.js";
4
+ import { CcavenuePaginationStrategy } from "./pagination.js";
5
+ // CCAvenue's published integration kit (Crypto.php / Crypto.java) derives a
6
+ // fixed 16-byte AES-128-CBC key/IV pair from the merchant's "working key":
7
+ // key = MD5(workingKey) (raw 16-byte digest)
8
+ // iv = ASCII bytes "0123456789abcdef" (constant across all merchants)
9
+ const CCAVENUE_IV = Buffer.from("0123456789abcdef", "utf-8");
10
+ /** Encrypts a JSON-serializable payload into the hex `enc_request` CCAvenue expects. */
11
+ export function ccavenueEncrypt(data, workingKey) {
12
+ const key = createHash("md5").update(workingKey, "utf-8").digest();
13
+ const cipher = createCipheriv("aes-128-cbc", key, CCAVENUE_IV);
14
+ const plaintext = typeof data === "string" ? data : JSON.stringify(data);
15
+ return Buffer.concat([cipher.update(plaintext, "utf-8"), cipher.final()]).toString("hex");
16
+ }
17
+ /** Decrypts a hex `enc_response` string back into its plaintext (typically JSON). */
18
+ export function ccavenueDecrypt(encHex, workingKey) {
19
+ const key = createHash("md5").update(workingKey, "utf-8").digest();
20
+ const decipher = createDecipheriv("aes-128-cbc", key, CCAVENUE_IV);
21
+ const ciphertext = Buffer.from(encHex, "hex");
22
+ return Buffer.concat([decipher.update(ciphertext), decipher.final()]).toString("utf-8");
23
+ }
24
+ /**
25
+ * CCAvenue's REST APIs exchange AES-128-CBC encrypted payloads (`enc_request` /
26
+ * `enc_response`) keyed off a merchant "working key", alongside a plaintext
27
+ * `access_code` that identifies the registered integration. Because
28
+ * `parseResponse` doesn't have access to the working key, this adapter passes
29
+ * `enc_response` through untouched in the normalized data — call the exported
30
+ * `ccavenueDecrypt` helper (or the adapter's `decryptResponse`) with your
31
+ * working key to recover the plaintext payload.
32
+ */
33
+ export class CcavenueAdapter {
34
+ baseUrl;
35
+ constructor(baseUrl = "https://api.ccavenue.com/") {
36
+ this.baseUrl = baseUrl;
37
+ }
38
+ buildRequest(input) {
39
+ const { endpoint, options, authToken, baseUrl } = input;
40
+ const effectiveBaseUrl = baseUrl ?? this.baseUrl;
41
+ const url = new URL(endpoint, effectiveBaseUrl);
42
+ const [accessCode, workingKey] = authToken.token.split("|CCA|");
43
+ const method = options.method ?? "GET";
44
+ if (options.query) {
45
+ for (const [key, value] of Object.entries(options.query)) {
46
+ url.searchParams.set(key, String(value));
47
+ }
48
+ }
49
+ if (accessCode) {
50
+ url.searchParams.set("access_code", accessCode);
51
+ }
52
+ url.searchParams.set("request_type", "JSON");
53
+ url.searchParams.set("response_type", "JSON");
54
+ if (options.body && workingKey) {
55
+ url.searchParams.set("enc_request", ccavenueEncrypt(options.body, workingKey));
56
+ }
57
+ const headers = {
58
+ "Content-Type": "application/x-www-form-urlencoded",
59
+ "User-Agent": `Meridian-SDK/${SDK_VERSION}`,
60
+ ...options.headers,
61
+ };
62
+ return { url: url.toString(), method, headers };
63
+ }
64
+ /** Decrypts a normalized response's `enc_response` field with the given working key. */
65
+ decryptResponse(response, workingKey) {
66
+ const data = response.data;
67
+ if (!data?.enc_response)
68
+ return response.data;
69
+ try {
70
+ return JSON.parse(ccavenueDecrypt(data.enc_response, workingKey));
71
+ }
72
+ catch {
73
+ return ccavenueDecrypt(data.enc_response, workingKey);
74
+ }
75
+ }
76
+ parseResponse(raw) {
77
+ const rateLimitInfo = this.rateLimitPolicy(raw.headers);
78
+ const paginationStrategy = this.paginationStrategy();
79
+ const paginationInfo = ResponseNormalizer.extractPaginationInfo(raw, paginationStrategy);
80
+ const warnings = [];
81
+ if (typeof raw.body === "object" && raw.body !== null && "enc_response" in raw.body) {
82
+ warnings.push("Response payload is AES-encrypted (enc_response). Decrypt it with your working key " +
83
+ "via `ccavenueDecrypt(encHex, workingKey)` or `adapter.decryptResponse(response, workingKey)`.");
84
+ }
85
+ return ResponseNormalizer.normalize(raw, "ccavenue", rateLimitInfo, paginationInfo, warnings, "1.0.0");
86
+ }
87
+ parseError(raw) {
88
+ if (raw instanceof Error) {
89
+ const msg = raw.message.toLowerCase();
90
+ if (msg.includes("fetch") ||
91
+ msg.includes("network") ||
92
+ msg.includes("econnreset") ||
93
+ msg.includes("etimedout") ||
94
+ msg.includes("enotfound") ||
95
+ msg.includes("timeout")) {
96
+ return this.createMeridianError("network", true, "Network request failed. Check your connection and try again.", { originalError: raw.message });
97
+ }
98
+ }
99
+ if (typeof raw === "object" &&
100
+ raw !== null &&
101
+ "status" in raw &&
102
+ typeof raw.status === "number") {
103
+ return this.parseHttpError(raw);
104
+ }
105
+ return this.createMeridianError("provider", false, "An unexpected error occurred", { raw });
106
+ }
107
+ parseHttpError(error) {
108
+ const { status, body } = error;
109
+ const errorBody = body;
110
+ const errorMessage = errorBody?.error_desc ?? errorBody?.reason;
111
+ if (status === 401 || status === 403) {
112
+ return this.createMeridianError("auth", false, errorMessage ?? "Authentication failed. Check your CCAvenue access code and working key.", { errorCode: errorBody?.error_code }, undefined, status);
113
+ }
114
+ if (status === 404) {
115
+ return this.createMeridianError("validation", false, errorMessage ?? "Resource not found.", { errorCode: errorBody?.error_code }, undefined, 404);
116
+ }
117
+ if (status === 429) {
118
+ return this.createMeridianError("rate_limit", true, errorMessage ?? "Rate limit exceeded. Please wait before retrying.", { errorCode: errorBody?.error_code }, undefined, 429);
119
+ }
120
+ if (status === 400 || status === 422) {
121
+ return this.createMeridianError("validation", false, errorMessage ?? "Request validation failed.", { errorCode: errorBody?.error_code, reason: errorBody?.reason }, undefined, status);
122
+ }
123
+ if (status >= 500) {
124
+ return this.createMeridianError("provider", true, errorMessage ?? `CCAvenue API returned error ${status}. This may be temporary.`, { status }, undefined, status);
125
+ }
126
+ if (status >= 400) {
127
+ return this.createMeridianError("validation", false, errorMessage ?? `Request failed with status ${status}.`, { status }, undefined, status);
128
+ }
129
+ return this.createMeridianError("provider", false, `Unexpected response status ${status}.`, { status }, undefined, status);
130
+ }
131
+ async authStrategy(config) {
132
+ const accessCode = config.apiKey ?? config.username;
133
+ const workingKey = config.apiSecret ?? config.password ?? config.clientSecret;
134
+ if (!accessCode || !workingKey) {
135
+ throw this.createMeridianError("auth", false, "CCAvenue authentication requires an access code and working key. " +
136
+ "Set auth.apiKey (access code) + auth.apiSecret (working key).", {}, undefined, 401);
137
+ }
138
+ return { token: `${accessCode}|CCA|${workingKey}` };
139
+ }
140
+ rateLimitPolicy(_headers) {
141
+ // CCAvenue does not publish rate-limit headers; return conservative defaults.
142
+ return {
143
+ limit: 60,
144
+ remaining: 60,
145
+ reset: new Date(Date.now() + 60_000),
146
+ };
147
+ }
148
+ paginationStrategy() {
149
+ return new CcavenuePaginationStrategy();
150
+ }
151
+ getIdempotencyConfig() {
152
+ return {
153
+ defaultSafeOperations: new Set(["GET", "HEAD", "OPTIONS"]),
154
+ operationOverrides: new Map(),
155
+ };
156
+ }
157
+ /**
158
+ * CCAvenue server-to-server (S2S) response/webhook payloads carry a plaintext
159
+ * `enc_resp_hash` / signature derived as HMAC-SHA256 of the encrypted response
160
+ * body using the working key. `payload` should be the raw `enc_response` (or
161
+ * full body string) CCAvenue posted, and `secret` the merchant's working key.
162
+ */
163
+ verifyWebhook(payload, signature, secret) {
164
+ const raw = typeof payload === "string" ? payload : payload.toString("utf-8");
165
+ const expected = createHmac("sha256", secret).update(raw).digest("hex");
166
+ try {
167
+ const a = Buffer.from(expected);
168
+ const b = Buffer.from(signature);
169
+ if (a.length !== b.length)
170
+ return false;
171
+ return timingSafeEqual(a, b);
172
+ }
173
+ catch {
174
+ return false;
175
+ }
176
+ }
177
+ createMeridianError(category, retryable, message, metadata, retryAfter, status) {
178
+ return new MeridianError(message, category, "ccavenue", retryable, "", metadata, retryAfter, status);
179
+ }
180
+ }
181
+ //# sourceMappingURL=adapter.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"adapter.js","sourceRoot":"","sources":["../../../src/providers/ccavenue/adapter.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ export * from "./adapter.js";
2
+ export * from "./pagination.js";
3
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/providers/ccavenue/index.ts"],"names":[],"mappings":"AAAA,cAAc,cAAc,CAAC;AAC7B,cAAc,iBAAiB,CAAC"}
@@ -0,0 +1,3 @@
1
+ export * from "./adapter.js";
2
+ export * from "./pagination.js";
3
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/providers/ccavenue/index.ts"],"names":[],"mappings":"AAAA,cAAc,cAAc,CAAC;AAC7B,cAAc,iBAAiB,CAAC"}
@@ -0,0 +1,16 @@
1
+ import type { PaginationStrategy, RawResponse, RequestOptions } from "../../core/types.js";
2
+ /**
3
+ * CCAvenue's transaction/order-status APIs are command-driven, single-record
4
+ * lookups rather than paginated listings — there is no documented cursor or
5
+ * page convention. This strategy reports "no further pages" for every response.
6
+ */
7
+ export declare class CcavenuePaginationStrategy implements PaginationStrategy {
8
+ extractCursor(_response: RawResponse): string | null;
9
+ extractTotal(_response: RawResponse): number | null;
10
+ hasNext(_response: RawResponse): boolean;
11
+ buildNextRequest(endpoint: string, options: RequestOptions, _cursor: string): {
12
+ endpoint: string;
13
+ options: RequestOptions;
14
+ };
15
+ }
16
+ //# sourceMappingURL=pagination.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pagination.d.ts","sourceRoot":"","sources":["../../../src/providers/ccavenue/pagination.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,kBAAkB,EAAE,WAAW,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC;AAE3F;;;;GAIG;AACH,qBAAa,0BAA2B,YAAW,kBAAkB;IACnE,aAAa,CAAC,SAAS,EAAE,WAAW,GAAG,MAAM,GAAG,IAAI;IAIpD,YAAY,CAAC,SAAS,EAAE,WAAW,GAAG,MAAM,GAAG,IAAI;IAInD,OAAO,CAAC,SAAS,EAAE,WAAW,GAAG,OAAO;IAIxC,gBAAgB,CACd,QAAQ,EAAE,MAAM,EAChB,OAAO,EAAE,cAAc,EACvB,OAAO,EAAE,MAAM,GACd;QAAE,QAAQ,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,cAAc,CAAA;KAAE;CAGjD"}
@@ -0,0 +1,20 @@
1
+ /**
2
+ * CCAvenue's transaction/order-status APIs are command-driven, single-record
3
+ * lookups rather than paginated listings — there is no documented cursor or
4
+ * page convention. This strategy reports "no further pages" for every response.
5
+ */
6
+ export class CcavenuePaginationStrategy {
7
+ extractCursor(_response) {
8
+ return null;
9
+ }
10
+ extractTotal(_response) {
11
+ return null;
12
+ }
13
+ hasNext(_response) {
14
+ return false;
15
+ }
16
+ buildNextRequest(endpoint, options, _cursor) {
17
+ return { endpoint, options };
18
+ }
19
+ }
20
+ //# sourceMappingURL=pagination.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pagination.js","sourceRoot":"","sources":["../../../src/providers/ccavenue/pagination.ts"],"names":[],"mappings":"AAEA;;;;GAIG;AACH,MAAM,OAAO,0BAA0B;IACrC,aAAa,CAAC,SAAsB;QAClC,OAAO,IAAI,CAAC;IACd,CAAC;IAED,YAAY,CAAC,SAAsB;QACjC,OAAO,IAAI,CAAC;IACd,CAAC;IAED,OAAO,CAAC,SAAsB;QAC5B,OAAO,KAAK,CAAC;IACf,CAAC;IAED,gBAAgB,CACd,QAAgB,EAChB,OAAuB,EACvB,OAAe;QAEf,OAAO,EAAE,QAAQ,EAAE,OAAO,EAAE,CAAC;IAC/B,CAAC;CACF"}