@alogram/payrisk 0.1.6
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/AI.md +37 -0
- package/LICENSE +201 -0
- package/README.md +129 -0
- package/dist/_generated/apis/PayriskApi.d.ts +108 -0
- package/dist/_generated/apis/PayriskApi.js +342 -0
- package/dist/_generated/apis/index.d.ts +1 -0
- package/dist/_generated/apis/index.js +19 -0
- package/dist/_generated/index.d.ts +3 -0
- package/dist/_generated/index.js +21 -0
- package/dist/_generated/models/Account.d.ts +59 -0
- package/dist/_generated/models/Account.js +57 -0
- package/dist/_generated/models/AccountCheckRequest.d.ts +64 -0
- package/dist/_generated/models/AccountCheckRequest.js +72 -0
- package/dist/_generated/models/AvsResultEnum.d.ts +54 -0
- package/dist/_generated/models/AvsResultEnum.js +82 -0
- package/dist/_generated/models/BankTransfer.d.ts +39 -0
- package/dist/_generated/models/BankTransfer.js +59 -0
- package/dist/_generated/models/Card.d.ts +93 -0
- package/dist/_generated/models/Card.js +81 -0
- package/dist/_generated/models/CardNetworkEnum.d.ts +30 -0
- package/dist/_generated/models/CardNetworkEnum.js +58 -0
- package/dist/_generated/models/CategorySignal.d.ts +45 -0
- package/dist/_generated/models/CategorySignal.js +55 -0
- package/dist/_generated/models/ChannelEnum.d.ts +28 -0
- package/dist/_generated/models/ChannelEnum.js +56 -0
- package/dist/_generated/models/CheckRequest.d.ts +66 -0
- package/dist/_generated/models/CheckRequest.js +72 -0
- package/dist/_generated/models/ConfidenceEnum.d.ts +26 -0
- package/dist/_generated/models/ConfidenceEnum.js +54 -0
- package/dist/_generated/models/Crypto.d.ts +39 -0
- package/dist/_generated/models/Crypto.js +59 -0
- package/dist/_generated/models/CvvResultEnum.d.ts +33 -0
- package/dist/_generated/models/CvvResultEnum.js +61 -0
- package/dist/_generated/models/DecisionResponse.d.ts +128 -0
- package/dist/_generated/models/DecisionResponse.js +107 -0
- package/dist/_generated/models/DeviceInfo.d.ts +54 -0
- package/dist/_generated/models/DeviceInfo.js +56 -0
- package/dist/_generated/models/EntityIds.d.ts +113 -0
- package/dist/_generated/models/EntityIds.js +70 -0
- package/dist/_generated/models/EntryMethodEnum.d.ts +30 -0
- package/dist/_generated/models/EntryMethodEnum.js +58 -0
- package/dist/_generated/models/FraudScore.d.ts +52 -0
- package/dist/_generated/models/FraudScore.js +58 -0
- package/dist/_generated/models/Identity.d.ts +71 -0
- package/dist/_generated/models/Identity.js +57 -0
- package/dist/_generated/models/Integrity.d.ts +68 -0
- package/dist/_generated/models/Integrity.js +58 -0
- package/dist/_generated/models/Interaction.d.ts +59 -0
- package/dist/_generated/models/Interaction.js +60 -0
- package/dist/_generated/models/InteractionTypeEnum.d.ts +29 -0
- package/dist/_generated/models/InteractionTypeEnum.js +57 -0
- package/dist/_generated/models/Invoice.d.ts +39 -0
- package/dist/_generated/models/Invoice.js +59 -0
- package/dist/_generated/models/IpInfo.d.ts +101 -0
- package/dist/_generated/models/IpInfo.js +78 -0
- package/dist/_generated/models/KycCheckRequest.d.ts +64 -0
- package/dist/_generated/models/KycCheckRequest.js +74 -0
- package/dist/_generated/models/KycPayload.d.ts +84 -0
- package/dist/_generated/models/KycPayload.js +82 -0
- package/dist/_generated/models/MerchantContext.d.ts +38 -0
- package/dist/_generated/models/MerchantContext.js +50 -0
- package/dist/_generated/models/OrderContext.d.ts +60 -0
- package/dist/_generated/models/OrderContext.js +65 -0
- package/dist/_generated/models/PayerTypeEnum.d.ts +25 -0
- package/dist/_generated/models/PayerTypeEnum.js +53 -0
- package/dist/_generated/models/PaymentAuthorizationOutcome.d.ts +38 -0
- package/dist/_generated/models/PaymentAuthorizationOutcome.js +50 -0
- package/dist/_generated/models/PaymentCaptureOutcome.d.ts +42 -0
- package/dist/_generated/models/PaymentCaptureOutcome.js +60 -0
- package/dist/_generated/models/PaymentCardTypeEnum.d.ts +26 -0
- package/dist/_generated/models/PaymentCardTypeEnum.js +54 -0
- package/dist/_generated/models/PaymentChargeback.d.ts +32 -0
- package/dist/_generated/models/PaymentChargeback.js +48 -0
- package/dist/_generated/models/PaymentChargebackOutcome.d.ts +42 -0
- package/dist/_generated/models/PaymentChargebackOutcome.js +60 -0
- package/dist/_generated/models/PaymentDisputeOutcome.d.ts +43 -0
- package/dist/_generated/models/PaymentDisputeOutcome.js +61 -0
- package/dist/_generated/models/PaymentEvent.d.ts +72 -0
- package/dist/_generated/models/PaymentEvent.js +68 -0
- package/dist/_generated/models/PaymentEventType.d.ts +30 -0
- package/dist/_generated/models/PaymentEventType.js +58 -0
- package/dist/_generated/models/PaymentMethod.d.ts +39 -0
- package/dist/_generated/models/PaymentMethod.js +73 -0
- package/dist/_generated/models/PaymentMethodBase.d.ts +44 -0
- package/dist/_generated/models/PaymentMethodBase.js +64 -0
- package/dist/_generated/models/PaymentOutcome.d.ts +69 -0
- package/dist/_generated/models/PaymentOutcome.js +64 -0
- package/dist/_generated/models/PaymentRealtimeTypeEnum.d.ts +28 -0
- package/dist/_generated/models/PaymentRealtimeTypeEnum.js +56 -0
- package/dist/_generated/models/PaymentRefundOutcome.d.ts +41 -0
- package/dist/_generated/models/PaymentRefundOutcome.js +59 -0
- package/dist/_generated/models/PaymentWalletTypeEnum.d.ts +28 -0
- package/dist/_generated/models/PaymentWalletTypeEnum.js +56 -0
- package/dist/_generated/models/PostalAddress.d.ts +65 -0
- package/dist/_generated/models/PostalAddress.js +58 -0
- package/dist/_generated/models/Problem.d.ts +62 -0
- package/dist/_generated/models/Problem.js +62 -0
- package/dist/_generated/models/Purchase.d.ts +122 -0
- package/dist/_generated/models/Purchase.js +88 -0
- package/dist/_generated/models/PurchaseInitiatorEnum.d.ts +25 -0
- package/dist/_generated/models/PurchaseInitiatorEnum.js +53 -0
- package/dist/_generated/models/PurchaseSequenceEnum.d.ts +25 -0
- package/dist/_generated/models/PurchaseSequenceEnum.js +53 -0
- package/dist/_generated/models/PurchaseUsageEnum.d.ts +27 -0
- package/dist/_generated/models/PurchaseUsageEnum.js +55 -0
- package/dist/_generated/models/Realtime.d.ts +46 -0
- package/dist/_generated/models/Realtime.js +62 -0
- package/dist/_generated/models/ReasonDetail.d.ts +57 -0
- package/dist/_generated/models/ReasonDetail.js +63 -0
- package/dist/_generated/models/RiskBreakdown.d.ts +51 -0
- package/dist/_generated/models/RiskBreakdown.js +55 -0
- package/dist/_generated/models/RiskCategoryEnum.d.ts +27 -0
- package/dist/_generated/models/RiskCategoryEnum.js +55 -0
- package/dist/_generated/models/RiskLevelEnum.d.ts +26 -0
- package/dist/_generated/models/RiskLevelEnum.js +54 -0
- package/dist/_generated/models/ScaMethodEnum.d.ts +30 -0
- package/dist/_generated/models/ScaMethodEnum.js +58 -0
- package/dist/_generated/models/ScoreRecord.d.ts +107 -0
- package/dist/_generated/models/ScoreRecord.js +92 -0
- package/dist/_generated/models/ScoresSuccessResponse.d.ts +39 -0
- package/dist/_generated/models/ScoresSuccessResponse.js +51 -0
- package/dist/_generated/models/SignalsAccountVariant.d.ts +53 -0
- package/dist/_generated/models/SignalsAccountVariant.js +69 -0
- package/dist/_generated/models/SignalsInteractionVariant.d.ts +53 -0
- package/dist/_generated/models/SignalsInteractionVariant.js +69 -0
- package/dist/_generated/models/SignalsRequest.d.ts +28 -0
- package/dist/_generated/models/SignalsRequest.js +53 -0
- package/dist/_generated/models/StoredCredentialContext.d.ts +47 -0
- package/dist/_generated/models/StoredCredentialContext.js +55 -0
- package/dist/_generated/models/ThreeDSData.d.ts +68 -0
- package/dist/_generated/models/ThreeDSData.js +66 -0
- package/dist/_generated/models/Wallet.d.ts +46 -0
- package/dist/_generated/models/Wallet.js +62 -0
- package/dist/_generated/models/index.d.ts +62 -0
- package/dist/_generated/models/index.js +80 -0
- package/dist/_generated/runtime.d.ts +184 -0
- package/dist/_generated/runtime.js +338 -0
- package/dist/client.d.ts +69 -0
- package/dist/client.js +281 -0
- package/dist/exceptions.d.ts +24 -0
- package/dist/exceptions.js +59 -0
- package/dist/index.d.ts +5 -0
- package/dist/index.js +23 -0
- package/dist/testing.d.ts +24 -0
- package/dist/testing.js +100 -0
- package/dist/webhooks.d.ts +10 -0
- package/dist/webhooks.js +32 -0
- package/examples/asyncSignalIngestion.ts +52 -0
- package/examples/checkRisk.ts +26 -0
- package/examples/productionErrorHandling.ts +52 -0
- package/examples/webhookVerification.ts +29 -0
- package/package.json +64 -0
|
@@ -0,0 +1,338 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/* tslint:disable */
|
|
3
|
+
/* eslint-disable */
|
|
4
|
+
/**
|
|
5
|
+
* Payments Risk API
|
|
6
|
+
* API for detecting and scoring fraud for purchases, with lifecycle labeling and behavioral signals. v1 focuses on purchases only (`/risk/check`), with future account/session and KYC checks stubbed below.
|
|
7
|
+
*
|
|
8
|
+
* The version of the OpenAPI document: 0.1.6-rc.3
|
|
9
|
+
* Contact: support@alogram.ai
|
|
10
|
+
*
|
|
11
|
+
* NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech).
|
|
12
|
+
* https://openapi-generator.tech
|
|
13
|
+
* Do not edit the class manually.
|
|
14
|
+
*/
|
|
15
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
16
|
+
exports.TextApiResponse = exports.BlobApiResponse = exports.VoidApiResponse = exports.JSONApiResponse = exports.COLLECTION_FORMATS = exports.RequiredError = exports.FetchError = exports.ResponseError = exports.BaseAPI = exports.DefaultConfig = exports.Configuration = exports.BASE_PATH = void 0;
|
|
17
|
+
exports.querystring = querystring;
|
|
18
|
+
exports.exists = exists;
|
|
19
|
+
exports.mapValues = mapValues;
|
|
20
|
+
exports.canConsumeForm = canConsumeForm;
|
|
21
|
+
exports.BASE_PATH = "https://api-dev.alogram.ai/v1".replace(/\/+$/, "");
|
|
22
|
+
class Configuration {
|
|
23
|
+
constructor(configuration = {}) {
|
|
24
|
+
this.configuration = configuration;
|
|
25
|
+
}
|
|
26
|
+
set config(configuration) {
|
|
27
|
+
this.configuration = configuration;
|
|
28
|
+
}
|
|
29
|
+
get basePath() {
|
|
30
|
+
return this.configuration.basePath != null ? this.configuration.basePath : exports.BASE_PATH;
|
|
31
|
+
}
|
|
32
|
+
get fetchApi() {
|
|
33
|
+
return this.configuration.fetchApi;
|
|
34
|
+
}
|
|
35
|
+
get middleware() {
|
|
36
|
+
return this.configuration.middleware || [];
|
|
37
|
+
}
|
|
38
|
+
get queryParamsStringify() {
|
|
39
|
+
return this.configuration.queryParamsStringify || querystring;
|
|
40
|
+
}
|
|
41
|
+
get username() {
|
|
42
|
+
return this.configuration.username;
|
|
43
|
+
}
|
|
44
|
+
get password() {
|
|
45
|
+
return this.configuration.password;
|
|
46
|
+
}
|
|
47
|
+
get apiKey() {
|
|
48
|
+
const apiKey = this.configuration.apiKey;
|
|
49
|
+
if (apiKey) {
|
|
50
|
+
return typeof apiKey === 'function' ? apiKey : () => apiKey;
|
|
51
|
+
}
|
|
52
|
+
return undefined;
|
|
53
|
+
}
|
|
54
|
+
get accessToken() {
|
|
55
|
+
const accessToken = this.configuration.accessToken;
|
|
56
|
+
if (accessToken) {
|
|
57
|
+
return typeof accessToken === 'function' ? accessToken : async () => accessToken;
|
|
58
|
+
}
|
|
59
|
+
return undefined;
|
|
60
|
+
}
|
|
61
|
+
get headers() {
|
|
62
|
+
return this.configuration.headers;
|
|
63
|
+
}
|
|
64
|
+
get credentials() {
|
|
65
|
+
return this.configuration.credentials;
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
exports.Configuration = Configuration;
|
|
69
|
+
exports.DefaultConfig = new Configuration();
|
|
70
|
+
/**
|
|
71
|
+
* This is the base class for all generated API classes.
|
|
72
|
+
*/
|
|
73
|
+
class BaseAPI {
|
|
74
|
+
constructor(configuration = exports.DefaultConfig) {
|
|
75
|
+
this.configuration = configuration;
|
|
76
|
+
this.fetchApi = async (url, init) => {
|
|
77
|
+
let fetchParams = { url, init };
|
|
78
|
+
for (const middleware of this.middleware) {
|
|
79
|
+
if (middleware.pre) {
|
|
80
|
+
fetchParams = await middleware.pre({
|
|
81
|
+
fetch: this.fetchApi,
|
|
82
|
+
...fetchParams,
|
|
83
|
+
}) || fetchParams;
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
let response = undefined;
|
|
87
|
+
try {
|
|
88
|
+
response = await (this.configuration.fetchApi || fetch)(fetchParams.url, fetchParams.init);
|
|
89
|
+
}
|
|
90
|
+
catch (e) {
|
|
91
|
+
for (const middleware of this.middleware) {
|
|
92
|
+
if (middleware.onError) {
|
|
93
|
+
response = await middleware.onError({
|
|
94
|
+
fetch: this.fetchApi,
|
|
95
|
+
url: fetchParams.url,
|
|
96
|
+
init: fetchParams.init,
|
|
97
|
+
error: e,
|
|
98
|
+
response: response ? response.clone() : undefined,
|
|
99
|
+
}) || response;
|
|
100
|
+
}
|
|
101
|
+
}
|
|
102
|
+
if (response === undefined) {
|
|
103
|
+
if (e instanceof Error) {
|
|
104
|
+
throw new FetchError(e, 'The request failed and the interceptors did not return an alternative response');
|
|
105
|
+
}
|
|
106
|
+
else {
|
|
107
|
+
throw e;
|
|
108
|
+
}
|
|
109
|
+
}
|
|
110
|
+
}
|
|
111
|
+
for (const middleware of this.middleware) {
|
|
112
|
+
if (middleware.post) {
|
|
113
|
+
response = await middleware.post({
|
|
114
|
+
fetch: this.fetchApi,
|
|
115
|
+
url: fetchParams.url,
|
|
116
|
+
init: fetchParams.init,
|
|
117
|
+
response: response.clone(),
|
|
118
|
+
}) || response;
|
|
119
|
+
}
|
|
120
|
+
}
|
|
121
|
+
return response;
|
|
122
|
+
};
|
|
123
|
+
this.middleware = configuration.middleware;
|
|
124
|
+
}
|
|
125
|
+
withMiddleware(...middlewares) {
|
|
126
|
+
const next = this.clone();
|
|
127
|
+
next.middleware = next.middleware.concat(...middlewares);
|
|
128
|
+
return next;
|
|
129
|
+
}
|
|
130
|
+
withPreMiddleware(...preMiddlewares) {
|
|
131
|
+
const middlewares = preMiddlewares.map((pre) => ({ pre }));
|
|
132
|
+
return this.withMiddleware(...middlewares);
|
|
133
|
+
}
|
|
134
|
+
withPostMiddleware(...postMiddlewares) {
|
|
135
|
+
const middlewares = postMiddlewares.map((post) => ({ post }));
|
|
136
|
+
return this.withMiddleware(...middlewares);
|
|
137
|
+
}
|
|
138
|
+
/**
|
|
139
|
+
* Check if the given MIME is a JSON MIME.
|
|
140
|
+
* JSON MIME examples:
|
|
141
|
+
* application/json
|
|
142
|
+
* application/json; charset=UTF8
|
|
143
|
+
* APPLICATION/JSON
|
|
144
|
+
* application/vnd.company+json
|
|
145
|
+
* @param mime - MIME (Multipurpose Internet Mail Extensions)
|
|
146
|
+
* @return True if the given MIME is JSON, false otherwise.
|
|
147
|
+
*/
|
|
148
|
+
isJsonMime(mime) {
|
|
149
|
+
if (!mime) {
|
|
150
|
+
return false;
|
|
151
|
+
}
|
|
152
|
+
return BaseAPI.jsonRegex.test(mime);
|
|
153
|
+
}
|
|
154
|
+
async request(context, initOverrides) {
|
|
155
|
+
const { url, init } = await this.createFetchParams(context, initOverrides);
|
|
156
|
+
const response = await this.fetchApi(url, init);
|
|
157
|
+
if (response && (response.status >= 200 && response.status < 300)) {
|
|
158
|
+
return response;
|
|
159
|
+
}
|
|
160
|
+
throw new ResponseError(response, 'Response returned an error code');
|
|
161
|
+
}
|
|
162
|
+
async createFetchParams(context, initOverrides) {
|
|
163
|
+
let url = this.configuration.basePath + context.path;
|
|
164
|
+
if (context.query !== undefined && Object.keys(context.query).length !== 0) {
|
|
165
|
+
// only add the querystring to the URL if there are query parameters.
|
|
166
|
+
// this is done to avoid urls ending with a "?" character which buggy webservers
|
|
167
|
+
// do not handle correctly sometimes.
|
|
168
|
+
url += '?' + this.configuration.queryParamsStringify(context.query);
|
|
169
|
+
}
|
|
170
|
+
const headers = Object.assign({}, this.configuration.headers, context.headers);
|
|
171
|
+
Object.keys(headers).forEach(key => headers[key] === undefined ? delete headers[key] : {});
|
|
172
|
+
const initOverrideFn = typeof initOverrides === "function"
|
|
173
|
+
? initOverrides
|
|
174
|
+
: async () => initOverrides;
|
|
175
|
+
const initParams = {
|
|
176
|
+
method: context.method,
|
|
177
|
+
headers,
|
|
178
|
+
body: context.body,
|
|
179
|
+
credentials: this.configuration.credentials,
|
|
180
|
+
};
|
|
181
|
+
const overriddenInit = {
|
|
182
|
+
...initParams,
|
|
183
|
+
...(await initOverrideFn({
|
|
184
|
+
init: initParams,
|
|
185
|
+
context,
|
|
186
|
+
}))
|
|
187
|
+
};
|
|
188
|
+
let body;
|
|
189
|
+
if (isFormData(overriddenInit.body)
|
|
190
|
+
|| (overriddenInit.body instanceof URLSearchParams)
|
|
191
|
+
|| isBlob(overriddenInit.body)) {
|
|
192
|
+
body = overriddenInit.body;
|
|
193
|
+
}
|
|
194
|
+
else if (this.isJsonMime(headers['Content-Type'])) {
|
|
195
|
+
body = JSON.stringify(overriddenInit.body);
|
|
196
|
+
}
|
|
197
|
+
else {
|
|
198
|
+
body = overriddenInit.body;
|
|
199
|
+
}
|
|
200
|
+
const init = {
|
|
201
|
+
...overriddenInit,
|
|
202
|
+
body
|
|
203
|
+
};
|
|
204
|
+
return { url, init };
|
|
205
|
+
}
|
|
206
|
+
/**
|
|
207
|
+
* Create a shallow clone of `this` by constructing a new instance
|
|
208
|
+
* and then shallow cloning data members.
|
|
209
|
+
*/
|
|
210
|
+
clone() {
|
|
211
|
+
const constructor = this.constructor;
|
|
212
|
+
const next = new constructor(this.configuration);
|
|
213
|
+
next.middleware = this.middleware.slice();
|
|
214
|
+
return next;
|
|
215
|
+
}
|
|
216
|
+
}
|
|
217
|
+
exports.BaseAPI = BaseAPI;
|
|
218
|
+
BaseAPI.jsonRegex = new RegExp('^(:?application\/json|[^;/ \t]+\/[^;/ \t]+[+]json)[ \t]*(:?;.*)?$', 'i');
|
|
219
|
+
;
|
|
220
|
+
function isBlob(value) {
|
|
221
|
+
return typeof Blob !== 'undefined' && value instanceof Blob;
|
|
222
|
+
}
|
|
223
|
+
function isFormData(value) {
|
|
224
|
+
return typeof FormData !== "undefined" && value instanceof FormData;
|
|
225
|
+
}
|
|
226
|
+
class ResponseError extends Error {
|
|
227
|
+
constructor(response, msg) {
|
|
228
|
+
super(msg);
|
|
229
|
+
this.response = response;
|
|
230
|
+
this.name = "ResponseError";
|
|
231
|
+
}
|
|
232
|
+
}
|
|
233
|
+
exports.ResponseError = ResponseError;
|
|
234
|
+
class FetchError extends Error {
|
|
235
|
+
constructor(cause, msg) {
|
|
236
|
+
super(msg);
|
|
237
|
+
this.cause = cause;
|
|
238
|
+
this.name = "FetchError";
|
|
239
|
+
}
|
|
240
|
+
}
|
|
241
|
+
exports.FetchError = FetchError;
|
|
242
|
+
class RequiredError extends Error {
|
|
243
|
+
constructor(field, msg) {
|
|
244
|
+
super(msg);
|
|
245
|
+
this.field = field;
|
|
246
|
+
this.name = "RequiredError";
|
|
247
|
+
}
|
|
248
|
+
}
|
|
249
|
+
exports.RequiredError = RequiredError;
|
|
250
|
+
exports.COLLECTION_FORMATS = {
|
|
251
|
+
csv: ",",
|
|
252
|
+
ssv: " ",
|
|
253
|
+
tsv: "\t",
|
|
254
|
+
pipes: "|",
|
|
255
|
+
};
|
|
256
|
+
function querystring(params, prefix = '') {
|
|
257
|
+
return Object.keys(params)
|
|
258
|
+
.map(key => querystringSingleKey(key, params[key], prefix))
|
|
259
|
+
.filter(part => part.length > 0)
|
|
260
|
+
.join('&');
|
|
261
|
+
}
|
|
262
|
+
function querystringSingleKey(key, value, keyPrefix = '') {
|
|
263
|
+
const fullKey = keyPrefix + (keyPrefix.length ? `[${key}]` : key);
|
|
264
|
+
if (value instanceof Array) {
|
|
265
|
+
const multiValue = value.map(singleValue => encodeURIComponent(String(singleValue)))
|
|
266
|
+
.join(`&${encodeURIComponent(fullKey)}=`);
|
|
267
|
+
return `${encodeURIComponent(fullKey)}=${multiValue}`;
|
|
268
|
+
}
|
|
269
|
+
if (value instanceof Set) {
|
|
270
|
+
const valueAsArray = Array.from(value);
|
|
271
|
+
return querystringSingleKey(key, valueAsArray, keyPrefix);
|
|
272
|
+
}
|
|
273
|
+
if (value instanceof Date) {
|
|
274
|
+
return `${encodeURIComponent(fullKey)}=${encodeURIComponent(value.toISOString())}`;
|
|
275
|
+
}
|
|
276
|
+
if (value instanceof Object) {
|
|
277
|
+
return querystring(value, fullKey);
|
|
278
|
+
}
|
|
279
|
+
return `${encodeURIComponent(fullKey)}=${encodeURIComponent(String(value))}`;
|
|
280
|
+
}
|
|
281
|
+
function exists(json, key) {
|
|
282
|
+
const value = json[key];
|
|
283
|
+
return value !== null && value !== undefined;
|
|
284
|
+
}
|
|
285
|
+
function mapValues(data, fn) {
|
|
286
|
+
const result = {};
|
|
287
|
+
for (const key of Object.keys(data)) {
|
|
288
|
+
result[key] = fn(data[key]);
|
|
289
|
+
}
|
|
290
|
+
return result;
|
|
291
|
+
}
|
|
292
|
+
function canConsumeForm(consumes) {
|
|
293
|
+
for (const consume of consumes) {
|
|
294
|
+
if ('multipart/form-data' === consume.contentType) {
|
|
295
|
+
return true;
|
|
296
|
+
}
|
|
297
|
+
}
|
|
298
|
+
return false;
|
|
299
|
+
}
|
|
300
|
+
class JSONApiResponse {
|
|
301
|
+
constructor(raw, transformer = (jsonValue) => jsonValue) {
|
|
302
|
+
this.raw = raw;
|
|
303
|
+
this.transformer = transformer;
|
|
304
|
+
}
|
|
305
|
+
async value() {
|
|
306
|
+
return this.transformer(await this.raw.json());
|
|
307
|
+
}
|
|
308
|
+
}
|
|
309
|
+
exports.JSONApiResponse = JSONApiResponse;
|
|
310
|
+
class VoidApiResponse {
|
|
311
|
+
constructor(raw) {
|
|
312
|
+
this.raw = raw;
|
|
313
|
+
}
|
|
314
|
+
async value() {
|
|
315
|
+
return undefined;
|
|
316
|
+
}
|
|
317
|
+
}
|
|
318
|
+
exports.VoidApiResponse = VoidApiResponse;
|
|
319
|
+
class BlobApiResponse {
|
|
320
|
+
constructor(raw) {
|
|
321
|
+
this.raw = raw;
|
|
322
|
+
}
|
|
323
|
+
async value() {
|
|
324
|
+
return await this.raw.blob();
|
|
325
|
+
}
|
|
326
|
+
;
|
|
327
|
+
}
|
|
328
|
+
exports.BlobApiResponse = BlobApiResponse;
|
|
329
|
+
class TextApiResponse {
|
|
330
|
+
constructor(raw) {
|
|
331
|
+
this.raw = raw;
|
|
332
|
+
}
|
|
333
|
+
async value() {
|
|
334
|
+
return await this.raw.text();
|
|
335
|
+
}
|
|
336
|
+
;
|
|
337
|
+
}
|
|
338
|
+
exports.TextApiResponse = TextApiResponse;
|
package/dist/client.d.ts
ADDED
|
@@ -0,0 +1,69 @@
|
|
|
1
|
+
import * as generated from './_generated';
|
|
2
|
+
export interface AlogramClientOptions {
|
|
3
|
+
baseUrl?: string;
|
|
4
|
+
apiKey?: string;
|
|
5
|
+
accessToken?: string;
|
|
6
|
+
tenantId?: string;
|
|
7
|
+
clientId?: string;
|
|
8
|
+
debug?: boolean;
|
|
9
|
+
}
|
|
10
|
+
/**
|
|
11
|
+
* 🔒 Internal base class for shared SDK logic.
|
|
12
|
+
*/
|
|
13
|
+
declare abstract class AlogramBaseClient {
|
|
14
|
+
protected options: AlogramClientOptions;
|
|
15
|
+
protected config: generated.Configuration;
|
|
16
|
+
protected api: generated.PayriskApi;
|
|
17
|
+
constructor(options: AlogramClientOptions);
|
|
18
|
+
protected generateId(prefix: string): string;
|
|
19
|
+
protected mapError(error: any): Error;
|
|
20
|
+
protected withTelemetry<T>(name: string, tags: {
|
|
21
|
+
tid: string;
|
|
22
|
+
ik: string;
|
|
23
|
+
}, fn: () => Promise<T>): Promise<T>;
|
|
24
|
+
}
|
|
25
|
+
/**
|
|
26
|
+
* 🏢 **AlogramRiskClient** (Secret Client)
|
|
27
|
+
* Designed for server-side environments using a Secret Key (`sk_...`).
|
|
28
|
+
* Provides full access to risk decisioning and score retrieval.
|
|
29
|
+
*/
|
|
30
|
+
export declare class AlogramRiskClient extends AlogramBaseClient {
|
|
31
|
+
constructor(options: AlogramClientOptions);
|
|
32
|
+
/**
|
|
33
|
+
* 📥 Evaluate risk for a purchase or entity.
|
|
34
|
+
*/
|
|
35
|
+
checkRisk(request: generated.CheckRequest, overrides?: {
|
|
36
|
+
idempotencyKey?: string;
|
|
37
|
+
traceId?: string;
|
|
38
|
+
}): Promise<generated.DecisionResponse>;
|
|
39
|
+
/**
|
|
40
|
+
* 📡 Ingest behavioral signals.
|
|
41
|
+
*/
|
|
42
|
+
ingestSignals(request: generated.SignalsRequest, overrides?: {
|
|
43
|
+
idempotencyKey?: string;
|
|
44
|
+
traceId?: string;
|
|
45
|
+
}): Promise<void>;
|
|
46
|
+
/**
|
|
47
|
+
* 📡 Ingest payment lifecycle events.
|
|
48
|
+
*/
|
|
49
|
+
ingestEvent(event: generated.PaymentEvent, overrides?: {
|
|
50
|
+
idempotencyKey?: string;
|
|
51
|
+
traceId?: string;
|
|
52
|
+
}): Promise<void>;
|
|
53
|
+
}
|
|
54
|
+
/**
|
|
55
|
+
* 🌐 **AlogramPublicClient** (Public Client)
|
|
56
|
+
* Designed for client-side environments (Browsers, Mobile) using a Publishable Key (`pk_...`).
|
|
57
|
+
* Strictly restricted to non-sensitive ingestion methods.
|
|
58
|
+
*/
|
|
59
|
+
export declare class AlogramPublicClient extends AlogramBaseClient {
|
|
60
|
+
constructor(options: AlogramClientOptions);
|
|
61
|
+
/**
|
|
62
|
+
* 📡 Ingest behavioral signals from the frontend.
|
|
63
|
+
*/
|
|
64
|
+
ingestSignals(request: generated.SignalsRequest, overrides?: {
|
|
65
|
+
idempotencyKey?: string;
|
|
66
|
+
traceId?: string;
|
|
67
|
+
}): Promise<void>;
|
|
68
|
+
}
|
|
69
|
+
export {};
|
package/dist/client.js
ADDED
|
@@ -0,0 +1,281 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
// Copyright (c) 2025 Alogram Inc.
|
|
3
|
+
// All rights reserved.
|
|
4
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
5
|
+
if (k2 === undefined) k2 = k;
|
|
6
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
7
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
8
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
9
|
+
}
|
|
10
|
+
Object.defineProperty(o, k2, desc);
|
|
11
|
+
}) : (function(o, m, k, k2) {
|
|
12
|
+
if (k2 === undefined) k2 = k;
|
|
13
|
+
o[k2] = m[k];
|
|
14
|
+
}));
|
|
15
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
16
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
17
|
+
}) : function(o, v) {
|
|
18
|
+
o["default"] = v;
|
|
19
|
+
});
|
|
20
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
21
|
+
var ownKeys = function(o) {
|
|
22
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
23
|
+
var ar = [];
|
|
24
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
25
|
+
return ar;
|
|
26
|
+
};
|
|
27
|
+
return ownKeys(o);
|
|
28
|
+
};
|
|
29
|
+
return function (mod) {
|
|
30
|
+
if (mod && mod.__esModule) return mod;
|
|
31
|
+
var result = {};
|
|
32
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
33
|
+
__setModuleDefault(result, mod);
|
|
34
|
+
return result;
|
|
35
|
+
};
|
|
36
|
+
})();
|
|
37
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
38
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
39
|
+
};
|
|
40
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
41
|
+
exports.AlogramPublicClient = exports.AlogramRiskClient = void 0;
|
|
42
|
+
const uuid_1 = require("uuid");
|
|
43
|
+
const async_retry_1 = __importDefault(require("async-retry"));
|
|
44
|
+
const generated = __importStar(require("./_generated"));
|
|
45
|
+
const exceptions_1 = require("./exceptions");
|
|
46
|
+
// --- OpenTelemetry Support (Optional) ---
|
|
47
|
+
let tracer = null;
|
|
48
|
+
try {
|
|
49
|
+
const { trace } = require('@opentelemetry/api');
|
|
50
|
+
if (trace) {
|
|
51
|
+
tracer = trace.getTracer('@alogram/payrisk', '0.1.6');
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
catch (e) {
|
|
55
|
+
// OTel not available, skip telemetry
|
|
56
|
+
}
|
|
57
|
+
/**
|
|
58
|
+
* 🔒 Internal base class for shared SDK logic.
|
|
59
|
+
*/
|
|
60
|
+
class AlogramBaseClient {
|
|
61
|
+
constructor(options) {
|
|
62
|
+
this.options = options;
|
|
63
|
+
const baseUrl = options.baseUrl || 'https://api.alogram.ai';
|
|
64
|
+
const headers = {};
|
|
65
|
+
if (options.apiKey) {
|
|
66
|
+
headers['x-api-key'] = options.apiKey;
|
|
67
|
+
}
|
|
68
|
+
if (options.accessToken) {
|
|
69
|
+
headers['Authorization'] = `Bearer ${options.accessToken}`;
|
|
70
|
+
}
|
|
71
|
+
if (options.tenantId) {
|
|
72
|
+
headers['x-trusted-tenant-id'] = options.tenantId;
|
|
73
|
+
}
|
|
74
|
+
if (options.clientId) {
|
|
75
|
+
headers['x-trusted-client-id'] = options.clientId;
|
|
76
|
+
}
|
|
77
|
+
this.config = new generated.Configuration({
|
|
78
|
+
basePath: baseUrl,
|
|
79
|
+
headers: headers,
|
|
80
|
+
});
|
|
81
|
+
this.api = new generated.PayriskApi(this.config);
|
|
82
|
+
}
|
|
83
|
+
generateId(prefix) {
|
|
84
|
+
return `${prefix}_${(0, uuid_1.v4)().replace(/-/g, '')}`;
|
|
85
|
+
}
|
|
86
|
+
mapError(error) {
|
|
87
|
+
if (error instanceof generated.ResponseError) {
|
|
88
|
+
const status = error.response.status;
|
|
89
|
+
const message = `API Error: ${error.response.statusText}`;
|
|
90
|
+
if (status === 401 || status === 403) {
|
|
91
|
+
return new exceptions_1.AuthenticationError(message, status);
|
|
92
|
+
}
|
|
93
|
+
if (status === 429) {
|
|
94
|
+
return new exceptions_1.RateLimitError(message, status);
|
|
95
|
+
}
|
|
96
|
+
if (status === 400 || status === 422) {
|
|
97
|
+
return new exceptions_1.ValidationError(message, status);
|
|
98
|
+
}
|
|
99
|
+
if (status >= 500) {
|
|
100
|
+
return new exceptions_1.InternalServerError(message, status);
|
|
101
|
+
}
|
|
102
|
+
return new exceptions_1.AlogramError(message, status);
|
|
103
|
+
}
|
|
104
|
+
// If it's already one of our custom error types, return it directly
|
|
105
|
+
if (error instanceof exceptions_1.AuthenticationError ||
|
|
106
|
+
error instanceof exceptions_1.RateLimitError ||
|
|
107
|
+
error instanceof exceptions_1.ValidationError ||
|
|
108
|
+
error instanceof exceptions_1.InternalServerError ||
|
|
109
|
+
error instanceof exceptions_1.AlogramError) {
|
|
110
|
+
return error;
|
|
111
|
+
}
|
|
112
|
+
return error;
|
|
113
|
+
}
|
|
114
|
+
async withTelemetry(name, tags, fn) {
|
|
115
|
+
if (!tracer)
|
|
116
|
+
return fn();
|
|
117
|
+
return tracer.startActiveSpan(name, async (span) => {
|
|
118
|
+
try {
|
|
119
|
+
span.setAttribute('alogram.trace_id', tags.tid);
|
|
120
|
+
span.setAttribute('alogram.idempotency_key', tags.ik);
|
|
121
|
+
const result = await fn();
|
|
122
|
+
if (typeof result === 'object' && result !== null && 'decision' in result) {
|
|
123
|
+
span.setAttribute('alogram.decision', result.decision);
|
|
124
|
+
}
|
|
125
|
+
span.setStatus({ code: 1 }); // Ok
|
|
126
|
+
return result;
|
|
127
|
+
}
|
|
128
|
+
catch (err) {
|
|
129
|
+
span.setStatus({ code: 2, message: err.message }); // Error
|
|
130
|
+
span.recordException(err);
|
|
131
|
+
throw err;
|
|
132
|
+
}
|
|
133
|
+
finally {
|
|
134
|
+
span.end();
|
|
135
|
+
}
|
|
136
|
+
});
|
|
137
|
+
}
|
|
138
|
+
}
|
|
139
|
+
/**
|
|
140
|
+
* 🏢 **AlogramRiskClient** (Secret Client)
|
|
141
|
+
* Designed for server-side environments using a Secret Key (`sk_...`).
|
|
142
|
+
* Provides full access to risk decisioning and score retrieval.
|
|
143
|
+
*/
|
|
144
|
+
class AlogramRiskClient extends AlogramBaseClient {
|
|
145
|
+
constructor(options) {
|
|
146
|
+
if (options.apiKey && options.apiKey.startsWith('pk_')) {
|
|
147
|
+
throw new exceptions_1.ScopedAccessError('Cannot initialize AlogramRiskClient with a Publishable Key (pk_...). ' +
|
|
148
|
+
'Please use AlogramPublicClient for client-side ingestion or provide a Secret Key (sk_...).');
|
|
149
|
+
}
|
|
150
|
+
super(options);
|
|
151
|
+
}
|
|
152
|
+
/**
|
|
153
|
+
* 📥 Evaluate risk for a purchase or entity.
|
|
154
|
+
*/
|
|
155
|
+
async checkRisk(request, overrides) {
|
|
156
|
+
const ik = overrides?.idempotencyKey || this.generateId('idk');
|
|
157
|
+
const tid = overrides?.traceId || this.generateId('trc');
|
|
158
|
+
return this.withTelemetry('alogram.check_risk', { tid, ik }, async () => {
|
|
159
|
+
const headers = { ...(this.config.headers || {}) };
|
|
160
|
+
if (request.entities?.tenantId) {
|
|
161
|
+
headers['x-trusted-tenant-id'] = request.entities.tenantId;
|
|
162
|
+
}
|
|
163
|
+
if (request.entities?.clientId) {
|
|
164
|
+
headers['x-trusted-client-id'] = request.entities.clientId;
|
|
165
|
+
}
|
|
166
|
+
try {
|
|
167
|
+
return await (0, async_retry_1.default)(async (bail) => {
|
|
168
|
+
try {
|
|
169
|
+
// Re-construct headers for every attempt to ensure consistent state
|
|
170
|
+
const attemptHeaders = { ...(this.config.headers || {}) };
|
|
171
|
+
if (request.entities?.tenantId) {
|
|
172
|
+
attemptHeaders['x-trusted-tenant-id'] = request.entities.tenantId;
|
|
173
|
+
}
|
|
174
|
+
if (request.entities?.clientId) {
|
|
175
|
+
attemptHeaders['x-trusted-client-id'] = request.entities.clientId;
|
|
176
|
+
}
|
|
177
|
+
return await this.api.riskCheck({
|
|
178
|
+
xIdempotencyKey: ik,
|
|
179
|
+
xTraceId: tid,
|
|
180
|
+
checkRequest: request,
|
|
181
|
+
}, { headers: attemptHeaders });
|
|
182
|
+
}
|
|
183
|
+
catch (err) {
|
|
184
|
+
const mapped = this.mapError(err);
|
|
185
|
+
if (mapped instanceof exceptions_1.RateLimitError || mapped instanceof exceptions_1.InternalServerError) {
|
|
186
|
+
throw mapped; // retry
|
|
187
|
+
}
|
|
188
|
+
bail(mapped);
|
|
189
|
+
throw mapped;
|
|
190
|
+
}
|
|
191
|
+
}, {
|
|
192
|
+
retries: 2,
|
|
193
|
+
minTimeout: 500,
|
|
194
|
+
maxTimeout: 5000,
|
|
195
|
+
randomize: true,
|
|
196
|
+
});
|
|
197
|
+
}
|
|
198
|
+
catch (e) {
|
|
199
|
+
throw this.mapError(e);
|
|
200
|
+
}
|
|
201
|
+
});
|
|
202
|
+
}
|
|
203
|
+
/**
|
|
204
|
+
* 📡 Ingest behavioral signals.
|
|
205
|
+
*/
|
|
206
|
+
async ingestSignals(request, overrides) {
|
|
207
|
+
const ik = overrides?.idempotencyKey || this.generateId('idk');
|
|
208
|
+
const tid = overrides?.traceId || this.generateId('trc');
|
|
209
|
+
return this.withTelemetry('alogram.ingest_signals', { tid, ik }, async () => {
|
|
210
|
+
const headers = { ...(this.config.headers || {}) };
|
|
211
|
+
const actualRequest = request.actualInstance || request;
|
|
212
|
+
if (actualRequest.entities?.tenantId) {
|
|
213
|
+
headers['x-trusted-tenant-id'] = actualRequest.entities.tenant_id || actualRequest.entities.tenantId;
|
|
214
|
+
}
|
|
215
|
+
try {
|
|
216
|
+
await this.api.ingestSignals({
|
|
217
|
+
xIdempotencyKey: ik,
|
|
218
|
+
xTraceId: tid,
|
|
219
|
+
signalsRequest: request,
|
|
220
|
+
}, { headers });
|
|
221
|
+
}
|
|
222
|
+
catch (err) {
|
|
223
|
+
throw this.mapError(err);
|
|
224
|
+
}
|
|
225
|
+
});
|
|
226
|
+
}
|
|
227
|
+
/**
|
|
228
|
+
* 📡 Ingest payment lifecycle events.
|
|
229
|
+
*/
|
|
230
|
+
async ingestEvent(event, overrides) {
|
|
231
|
+
const ik = overrides?.idempotencyKey || this.generateId('idk');
|
|
232
|
+
const tid = overrides?.traceId || this.generateId('trc');
|
|
233
|
+
return this.withTelemetry('alogram.ingest_event', { tid, ik }, async () => {
|
|
234
|
+
try {
|
|
235
|
+
await this.api.ingestPaymentEvent({
|
|
236
|
+
xIdempotencyKey: ik,
|
|
237
|
+
xTraceId: tid,
|
|
238
|
+
paymentEvent: event,
|
|
239
|
+
}, { headers: this.config.headers });
|
|
240
|
+
}
|
|
241
|
+
catch (err) {
|
|
242
|
+
throw this.mapError(err);
|
|
243
|
+
}
|
|
244
|
+
});
|
|
245
|
+
}
|
|
246
|
+
}
|
|
247
|
+
exports.AlogramRiskClient = AlogramRiskClient;
|
|
248
|
+
/**
|
|
249
|
+
* 🌐 **AlogramPublicClient** (Public Client)
|
|
250
|
+
* Designed for client-side environments (Browsers, Mobile) using a Publishable Key (`pk_...`).
|
|
251
|
+
* Strictly restricted to non-sensitive ingestion methods.
|
|
252
|
+
*/
|
|
253
|
+
class AlogramPublicClient extends AlogramBaseClient {
|
|
254
|
+
constructor(options) {
|
|
255
|
+
if (options.apiKey && options.apiKey.startsWith('sk_')) {
|
|
256
|
+
throw new exceptions_1.ScopedAccessError('Cannot initialize AlogramPublicClient with a Secret Key (sk_...). ' +
|
|
257
|
+
'Please use AlogramRiskClient for server-side operations.');
|
|
258
|
+
}
|
|
259
|
+
super(options);
|
|
260
|
+
}
|
|
261
|
+
/**
|
|
262
|
+
* 📡 Ingest behavioral signals from the frontend.
|
|
263
|
+
*/
|
|
264
|
+
async ingestSignals(request, overrides) {
|
|
265
|
+
const ik = overrides?.idempotencyKey || this.generateId('idk');
|
|
266
|
+
const tid = overrides?.traceId || this.generateId('trc');
|
|
267
|
+
return this.withTelemetry('alogram.ingest_signals', { tid, ik }, async () => {
|
|
268
|
+
try {
|
|
269
|
+
await this.api.ingestSignals({
|
|
270
|
+
xIdempotencyKey: ik,
|
|
271
|
+
xTraceId: tid,
|
|
272
|
+
signalsRequest: request,
|
|
273
|
+
}, { headers: this.config.headers });
|
|
274
|
+
}
|
|
275
|
+
catch (err) {
|
|
276
|
+
throw this.mapError(err);
|
|
277
|
+
}
|
|
278
|
+
});
|
|
279
|
+
}
|
|
280
|
+
}
|
|
281
|
+
exports.AlogramPublicClient = AlogramPublicClient;
|