@forklaunch/core 3.0.1 → 3.2.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/bin/gateway-mock/routes/email.mjs +91 -4
- package/bin/gateway-mock/server.mjs +39 -21
- package/lib/http/emailClient.d.ts +46 -0
- package/lib/http/emailClient.d.ts.map +1 -1
- package/lib/http/index.d.ts +2 -0
- package/lib/http/index.d.ts.map +1 -1
- package/lib/http/index.js +393 -91
- package/lib/http/index.js.map +1 -1
- package/lib/http/index.mjs +351 -53
- package/lib/http/index.mjs.map +1 -1
- package/lib/http/middleware/request/enrichDetails.middleware.d.ts.map +1 -1
- package/lib/http/paymentsClient.d.ts +19 -8
- package/lib/http/paymentsClient.d.ts.map +1 -1
- package/lib/http/previewModelGatewayClient.d.ts +48 -0
- package/lib/http/previewModelGatewayClient.d.ts.map +1 -0
- package/lib/http/telemetry/auditLogger.d.ts +5 -1
- package/lib/http/telemetry/auditLogger.d.ts.map +1 -1
- package/lib/http/telemetry/requestAudit.d.ts +30 -0
- package/lib/http/telemetry/requestAudit.d.ts.map +1 -0
- package/lib/persistence/complianceChanges.d.ts +30 -0
- package/lib/persistence/complianceChanges.d.ts.map +1 -0
- package/lib/persistence/compliancePropertyBuilder.d.ts.map +1 -1
- package/lib/persistence/compliantField.d.ts +41 -8
- package/lib/persistence/compliantField.d.ts.map +1 -1
- package/lib/persistence/defineComplianceEntity.d.ts.map +1 -1
- package/lib/persistence/index.d.ts +2 -1
- package/lib/persistence/index.d.ts.map +1 -1
- package/lib/persistence/index.js +150 -18
- package/lib/persistence/index.js.map +1 -1
- package/lib/persistence/index.mjs +148 -18
- package/lib/persistence/index.mjs.map +1 -1
- package/package.json +34 -34
|
@@ -18,7 +18,9 @@
|
|
|
18
18
|
* The quota counts recipients, as SES does.
|
|
19
19
|
*
|
|
20
20
|
* Vendor route (unauthenticated): GET /__mock/email/messages[?to=address]
|
|
21
|
-
* lists what was "sent", with its from address and configuration set
|
|
21
|
+
* lists what was "sent", with its from address and configuration set; a
|
|
22
|
+
* message sent with `listUnsubscribe` also shows it and the `headers` the
|
|
23
|
+
* platform would add (List-Unsubscribe, List-Unsubscribe-Post).
|
|
22
24
|
*
|
|
23
25
|
* MOCK_EMAIL_DAILY_QUOTA recipients per UTC day, default 200
|
|
24
26
|
* MOCK_EMAIL_SENDING_DOMAIN default mail.forklaunch.test; the from address
|
|
@@ -36,11 +38,18 @@ const LIMITS = {
|
|
|
36
38
|
maxRecipients: 50,
|
|
37
39
|
maxSubjectLength: 998,
|
|
38
40
|
maxBodyBytes: 512 * 1024,
|
|
39
|
-
maxTags: 10
|
|
41
|
+
maxTags: 10,
|
|
42
|
+
maxUnsubscribeUrlLength: 512
|
|
40
43
|
};
|
|
41
44
|
const ADDRESS =
|
|
42
45
|
/^[^\s@<>()[\]\\,;:"]+@[A-Za-z0-9](?:[A-Za-z0-9-]*[A-Za-z0-9])?(?:\.[A-Za-z0-9](?:[A-Za-z0-9-]*[A-Za-z0-9])?)+$/;
|
|
43
46
|
const TAG_PART = /^[A-Za-z0-9_-]{1,256}$/;
|
|
47
|
+
// List-Unsubscribe: the platform's rules (list-unsubscribe.util.ts there).
|
|
48
|
+
const HEADER_SAFE = /^[\x21-\x7e]+$/;
|
|
49
|
+
const URL_DELIMITERS = /[<>,"\\]/;
|
|
50
|
+
const MAILBOX =
|
|
51
|
+
/^[A-Za-z0-9._+-]+@[A-Za-z0-9](?:[A-Za-z0-9-]*[A-Za-z0-9])?(?:\.[A-Za-z0-9](?:[A-Za-z0-9-]*[A-Za-z0-9])?)+$/;
|
|
52
|
+
const UNSUBSCRIBE_FIELDS = new Set(['url', 'mailto', 'oneClick']);
|
|
44
53
|
|
|
45
54
|
const isAddress = (a) =>
|
|
46
55
|
typeof a === 'string' && a.length <= 254 && ADDRESS.test(a);
|
|
@@ -74,6 +83,76 @@ function init(state) {
|
|
|
74
83
|
return state;
|
|
75
84
|
}
|
|
76
85
|
|
|
86
|
+
function unsubscribeUrlProblem(url) {
|
|
87
|
+
if (typeof url !== 'string' || url === '') return 'url must be a string';
|
|
88
|
+
if (url.length > LIMITS.maxUnsubscribeUrlLength)
|
|
89
|
+
return `url is longer than ${LIMITS.maxUnsubscribeUrlLength} characters`;
|
|
90
|
+
if (!HEADER_SAFE.test(url))
|
|
91
|
+
return 'url must be printable ASCII with no spaces or line breaks; percent-encode anything else';
|
|
92
|
+
if (URL_DELIMITERS.test(url))
|
|
93
|
+
return 'url must not contain < > , " or \\; percent-encode them';
|
|
94
|
+
let parsed;
|
|
95
|
+
try {
|
|
96
|
+
parsed = new URL(url);
|
|
97
|
+
} catch {
|
|
98
|
+
return 'url is not a URL';
|
|
99
|
+
}
|
|
100
|
+
if (parsed.protocol !== 'https:') return 'url must be https';
|
|
101
|
+
if (parsed.username || parsed.password)
|
|
102
|
+
return 'url must not carry a user name or password';
|
|
103
|
+
return null;
|
|
104
|
+
}
|
|
105
|
+
|
|
106
|
+
/** `listUnsubscribe`: `{ value }` (undefined when absent) or `{ error }`. */
|
|
107
|
+
function checkListUnsubscribe(value) {
|
|
108
|
+
if (value === undefined || value === null) return { value: undefined };
|
|
109
|
+
const fail = (problem) => ({ error: `listUnsubscribe: ${problem}` });
|
|
110
|
+
if (typeof value !== 'object' || Array.isArray(value))
|
|
111
|
+
return fail('must be an object');
|
|
112
|
+
const unknown = Object.keys(value).filter((k) => !UNSUBSCRIBE_FIELDS.has(k));
|
|
113
|
+
if (unknown.length)
|
|
114
|
+
return fail(`unknown field ${unknown.map((k) => `'${k}'`).join(', ')}`);
|
|
115
|
+
const { url, mailto, oneClick } = value;
|
|
116
|
+
if (url === undefined && mailto === undefined)
|
|
117
|
+
return fail('needs a url or a mailto');
|
|
118
|
+
if (url !== undefined) {
|
|
119
|
+
const problem = unsubscribeUrlProblem(url);
|
|
120
|
+
if (problem) return fail(problem);
|
|
121
|
+
}
|
|
122
|
+
if (
|
|
123
|
+
mailto !== undefined &&
|
|
124
|
+
(typeof mailto !== 'string' || mailto.length > 254 || !MAILBOX.test(mailto))
|
|
125
|
+
)
|
|
126
|
+
return fail(
|
|
127
|
+
`mailto: '${String(mailto).slice(0, 80)}' is not a plain mailbox (letters, digits, . _ + - before the @)`
|
|
128
|
+
);
|
|
129
|
+
if (oneClick !== undefined && typeof oneClick !== 'boolean')
|
|
130
|
+
return fail('oneClick must be true or false');
|
|
131
|
+
if (oneClick === true && url === undefined)
|
|
132
|
+
return fail('oneClick needs a url (RFC 8058 posts to it)');
|
|
133
|
+
return {
|
|
134
|
+
value: {
|
|
135
|
+
...(url !== undefined ? { url } : {}),
|
|
136
|
+
...(mailto !== undefined ? { mailto } : {}),
|
|
137
|
+
...(oneClick === true ? { oneClick: true } : {})
|
|
138
|
+
}
|
|
139
|
+
};
|
|
140
|
+
}
|
|
141
|
+
|
|
142
|
+
/** The headers the platform adds to the SES message for it. */
|
|
143
|
+
function listUnsubscribeHeaders({ url, mailto, oneClick }) {
|
|
144
|
+
const targets = [
|
|
145
|
+
...(url ? [`<${url}>`] : []),
|
|
146
|
+
...(mailto ? [`<mailto:${mailto}>`] : [])
|
|
147
|
+
];
|
|
148
|
+
return {
|
|
149
|
+
'List-Unsubscribe': targets.join(', '),
|
|
150
|
+
...(oneClick
|
|
151
|
+
? { 'List-Unsubscribe-Post': 'List-Unsubscribe=One-Click' }
|
|
152
|
+
: {})
|
|
153
|
+
};
|
|
154
|
+
}
|
|
155
|
+
|
|
77
156
|
/** The gateway's validation: a message, or the reason it is refused. */
|
|
78
157
|
function validate(body) {
|
|
79
158
|
const list = (v) =>
|
|
@@ -109,7 +188,9 @@ function validate(body) {
|
|
|
109
188
|
if (name.startsWith('fl-') || name.startsWith('ses:'))
|
|
110
189
|
return `tag '${name}' is reserved`;
|
|
111
190
|
}
|
|
112
|
-
|
|
191
|
+
const unsubscribe = checkListUnsubscribe(body.listUnsubscribe);
|
|
192
|
+
if (unsubscribe.error) return unsubscribe.error;
|
|
193
|
+
return { to, replyTo, tags, listUnsubscribe: unsubscribe.value };
|
|
113
194
|
}
|
|
114
195
|
|
|
115
196
|
export default {
|
|
@@ -122,7 +203,7 @@ export default {
|
|
|
122
203
|
const state = init(ctx.state);
|
|
123
204
|
const checked = validate(ctx.body);
|
|
124
205
|
if (typeof checked === 'string') return ctx.send(400, checked);
|
|
125
|
-
const { to, replyTo, tags } = checked;
|
|
206
|
+
const { to, replyTo, tags, listUnsubscribe } = checked;
|
|
126
207
|
const refused = to.filter((a) => state.suppressed.has(a.toLowerCase()));
|
|
127
208
|
if (refused.length) {
|
|
128
209
|
return ctx.send(
|
|
@@ -151,6 +232,12 @@ export default {
|
|
|
151
232
|
text: ctx.body.text,
|
|
152
233
|
html: ctx.body.html,
|
|
153
234
|
tags,
|
|
235
|
+
...(listUnsubscribe
|
|
236
|
+
? {
|
|
237
|
+
listUnsubscribe,
|
|
238
|
+
headers: listUnsubscribeHeaders(listUnsubscribe)
|
|
239
|
+
}
|
|
240
|
+
: {}),
|
|
154
241
|
at: new Date().toISOString()
|
|
155
242
|
});
|
|
156
243
|
|
|
@@ -49,7 +49,9 @@
|
|
|
49
49
|
* MOCK_INSTANCE_HMAC_KEY verify instance signatures and sign events
|
|
50
50
|
* (unset: accept any signature; events unsigned)
|
|
51
51
|
* MOCK_EVENTS_URL the app's base URL for event delivery
|
|
52
|
-
* MOCK_EVENTS_URL_<FEATURE> per-feature override (the service that declared it)
|
|
52
|
+
* MOCK_EVENTS_URL_<FEATURE> per-feature override (the service that declared it);
|
|
53
|
+
* a comma-separated list when several projects hold
|
|
54
|
+
* the feature — each event goes to every entry
|
|
53
55
|
* (plus each feature's own MOCK_* settings; see its route file)
|
|
54
56
|
*
|
|
55
57
|
* Usage: npx -p @forklaunch/core forklaunch-gateway-mock
|
|
@@ -141,34 +143,50 @@ export async function startGatewayMock(env = process.env) {
|
|
|
141
143
|
occurredAt: new Date().toISOString(),
|
|
142
144
|
data: data ?? {}
|
|
143
145
|
};
|
|
144
|
-
const record = { event, status: null, error: null };
|
|
146
|
+
const record = { event, status: null, error: null, deliveries: [] };
|
|
145
147
|
events.push(record);
|
|
146
|
-
// A feature's events can go to its own service (MOCK_EVENTS_URL_<FEATURE>)
|
|
147
|
-
|
|
148
|
+
// A feature's events can go to its own service (MOCK_EVENTS_URL_<FEATURE>),
|
|
149
|
+
// or to several: every project that holds the feature, comma-separated.
|
|
150
|
+
const targets = (
|
|
148
151
|
env[`MOCK_EVENTS_URL_${feature.toUpperCase().replace(/-/g, '_')}`] ||
|
|
149
|
-
eventsUrl
|
|
150
|
-
|
|
152
|
+
eventsUrl
|
|
153
|
+
)
|
|
154
|
+
.split(',')
|
|
155
|
+
.map((t) => t.trim())
|
|
156
|
+
.filter(Boolean);
|
|
157
|
+
if (targets.length === 0) {
|
|
151
158
|
record.error = 'MOCK_EVENTS_URL is not set; event recorded, not delivered';
|
|
152
159
|
return record;
|
|
153
160
|
}
|
|
154
161
|
const path = `/platform-events/${feature}`;
|
|
155
162
|
const body = JSON.stringify(event);
|
|
156
|
-
const
|
|
157
|
-
|
|
158
|
-
const
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
163
|
+
for (const target of targets) {
|
|
164
|
+
// A fresh signature per destination: each app rejects a reused nonce.
|
|
165
|
+
const headers = { 'content-type': 'application/json' };
|
|
166
|
+
if (hmacKey) {
|
|
167
|
+
const ts = new Date().toISOString();
|
|
168
|
+
const nonce = randomUUID();
|
|
169
|
+
headers.authorization = `HMAC keyId=platform ts=${ts} nonce=${nonce} signature=${sign(hmacKey, 'POST', path, `${body}\n`, ts, nonce)}`;
|
|
170
|
+
}
|
|
171
|
+
const delivery = { target, status: null, error: null };
|
|
172
|
+
try {
|
|
173
|
+
const response = await fetch(`${target.replace(/\/$/, '')}${path}`, {
|
|
174
|
+
method: 'POST',
|
|
175
|
+
headers,
|
|
176
|
+
body
|
|
177
|
+
});
|
|
178
|
+
delivery.status = response.status;
|
|
179
|
+
} catch (error) {
|
|
180
|
+
delivery.error = String(error?.message ?? error);
|
|
181
|
+
}
|
|
182
|
+
record.deliveries.push(delivery);
|
|
171
183
|
}
|
|
184
|
+
// The summary: the first failed delivery, else the last one.
|
|
185
|
+
const summary =
|
|
186
|
+
record.deliveries.find((d) => d.error || d.status >= 300) ??
|
|
187
|
+
record.deliveries[record.deliveries.length - 1];
|
|
188
|
+
record.status = summary.status;
|
|
189
|
+
record.error = summary.error;
|
|
172
190
|
return record;
|
|
173
191
|
}
|
|
174
192
|
|
|
@@ -33,6 +33,19 @@ import { InstanceGatewayRequestError } from './instanceGateway';
|
|
|
33
33
|
* text: 'See you on Tuesday at 10:00.'
|
|
34
34
|
* });
|
|
35
35
|
* if (await email.suppressed('pat@example.com')) { … ask for another address }
|
|
36
|
+
*
|
|
37
|
+
* @example One-click unsubscribe (RFC 8058), which Gmail and Yahoo require of
|
|
38
|
+
* bulk senders: the platform adds `List-Unsubscribe` and
|
|
39
|
+
* `List-Unsubscribe-Post: List-Unsubscribe=One-Click`.
|
|
40
|
+
* await email.send({
|
|
41
|
+
* to: member.email,
|
|
42
|
+
* subject: 'Your weekly recap',
|
|
43
|
+
* html,
|
|
44
|
+
* listUnsubscribe: {
|
|
45
|
+
* url: `https://app.example.com/unsubscribe?token=${token}`, // accepts POST
|
|
46
|
+
* oneClick: true
|
|
47
|
+
* }
|
|
48
|
+
* });
|
|
36
49
|
*/
|
|
37
50
|
export interface EmailClientOptions {
|
|
38
51
|
/** Platform base URL. Default: `PLATFORM_GATEWAY_URL`. */
|
|
@@ -57,7 +70,33 @@ export interface EmailSendRequest {
|
|
|
57
70
|
* letters, digits, `_` and `-`. Names starting `fl-` or `ses:` are reserved.
|
|
58
71
|
*/
|
|
59
72
|
tags?: Record<string, string>;
|
|
73
|
+
/** `List-Unsubscribe` targets; see {@link EmailListUnsubscribe}. */
|
|
74
|
+
listUnsubscribe?: EmailListUnsubscribe;
|
|
60
75
|
}
|
|
76
|
+
/**
|
|
77
|
+
* Where a recipient unsubscribes: the `List-Unsubscribe` header (RFC 2369),
|
|
78
|
+
* plus `List-Unsubscribe-Post: List-Unsubscribe=One-Click` (RFC 8058) with
|
|
79
|
+
* `oneClick`. The platform writes the headers; these are targets, not header
|
|
80
|
+
* text.
|
|
81
|
+
*
|
|
82
|
+
* - `url`: https only, printable ASCII up to 512 characters, no `< > , " \`
|
|
83
|
+
* (percent-encode them). With `oneClick`, mailbox providers POST
|
|
84
|
+
* `List-Unsubscribe=One-Click` to it (form-encoded, no cookies): it must
|
|
85
|
+
* unsubscribe from that alone, without a confirmation page.
|
|
86
|
+
* - `mailto`: a plain mailbox (letters, digits, `. _ + -` before the `@`).
|
|
87
|
+
*
|
|
88
|
+
* The headers go to every address in `to`; for a per-recipient link, send
|
|
89
|
+
* one message per recipient.
|
|
90
|
+
*/
|
|
91
|
+
export type EmailListUnsubscribe = {
|
|
92
|
+
url: string;
|
|
93
|
+
mailto?: string;
|
|
94
|
+
oneClick?: boolean;
|
|
95
|
+
} | {
|
|
96
|
+
url?: undefined;
|
|
97
|
+
mailto: string;
|
|
98
|
+
oneClick?: false;
|
|
99
|
+
};
|
|
61
100
|
export interface EmailSendResult {
|
|
62
101
|
/** The provider's message id; delivery events carry it. */
|
|
63
102
|
messageId: string;
|
|
@@ -93,9 +132,16 @@ export declare const EMAIL_LIMITS: {
|
|
|
93
132
|
/** text + html, UTF-8 bytes. */
|
|
94
133
|
readonly maxBodyBytes: number;
|
|
95
134
|
readonly maxTags: 10;
|
|
135
|
+
/** `listUnsubscribe.url`; keeps the header within SES's limit. */
|
|
136
|
+
readonly maxUnsubscribeUrlLength: 512;
|
|
96
137
|
};
|
|
97
138
|
/** Whether `address` is a plain mailbox address (`local@domain.tld`). */
|
|
98
139
|
export declare function isEmailAddress(address: unknown): address is string;
|
|
140
|
+
/**
|
|
141
|
+
* Check `listUnsubscribe` the way the gateway does; returns its wire form.
|
|
142
|
+
* At least one of `url` and `mailto`; `oneClick` only with `url`.
|
|
143
|
+
*/
|
|
144
|
+
export declare function validateListUnsubscribe(value: unknown): EmailListUnsubscribe | undefined;
|
|
99
145
|
/** Validate a send request the way the gateway does; returns the wire body. */
|
|
100
146
|
export declare function validateEmailSendRequest(request: EmailSendRequest): Record<string, unknown>;
|
|
101
147
|
export declare function createEmailClient(options?: EmailClientOptions): EmailClient;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"emailClient.d.ts","sourceRoot":"","sources":["../../src/http/emailClient.ts"],"names":[],"mappings":"AAAA,OAAO,EAEL,2BAA2B,EAE5B,MAAM,mBAAmB,CAAC;AAE3B
|
|
1
|
+
{"version":3,"file":"emailClient.d.ts","sourceRoot":"","sources":["../../src/http/emailClient.ts"],"names":[],"mappings":"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"}
|
package/lib/http/index.d.ts
CHANGED
|
@@ -6,6 +6,7 @@ export * from './createHmacToken';
|
|
|
6
6
|
export * from './generateHmacAuthHeaders';
|
|
7
7
|
export * from './instanceGateway';
|
|
8
8
|
export * from './modelGatewayClient';
|
|
9
|
+
export * from './previewModelGatewayClient';
|
|
9
10
|
export * from './emailClient';
|
|
10
11
|
export * from './smsClient';
|
|
11
12
|
export * from './whatsappClient';
|
|
@@ -34,6 +35,7 @@ export * from './openApiV3Generator/openApiV3Generator';
|
|
|
34
35
|
export * from './router/discriminateBody';
|
|
35
36
|
export * from './router/expressLikeRouter';
|
|
36
37
|
export * from './telemetry/auditLogger';
|
|
38
|
+
export * from './telemetry/requestAudit';
|
|
37
39
|
export * from './telemetry/constants';
|
|
38
40
|
export * from './telemetry/evaluateTelemetryOptions';
|
|
39
41
|
export * from './telemetry/metricsDefinition';
|
package/lib/http/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/http/index.ts"],"names":[],"mappings":"AAAA,YAAY,EAAE,QAAQ,EAAE,MAAM,IAAI,CAAC;AACnC,cAAc,sCAAsC,CAAC;AACrD,cAAc,yBAAyB,CAAC;AACxC,cAAc,uBAAuB,CAAC;AACtC,cAAc,mBAAmB,CAAC;AAClC,cAAc,2BAA2B,CAAC;AAC1C,cAAc,mBAAmB,CAAC;AAClC,cAAc,sBAAsB,CAAC;AACrC,cAAc,eAAe,CAAC;AAC9B,cAAc,aAAa,CAAC;AAC5B,cAAc,kBAAkB,CAAC;AACjC,cAAc,eAAe,CAAC;AAC9B,cAAc,kBAAkB,CAAC;AACjC,cAAc,0BAA0B,CAAC;AACzC,cAAc,8BAA8B,CAAC;AAC7C,cAAc,6BAA6B,CAAC;AAC5C,cAAc,mBAAmB,CAAC;AAClC,cAAc,gBAAgB,CAAC;AAC/B,cAAc,iBAAiB,CAAC;AAChC,cAAc,uBAAuB,CAAC;AACtC,cAAc,oBAAoB,CAAC;AACnC,cAAc,kBAAkB,CAAC;AACjC,cAAc,iBAAiB,CAAC;AAChC,cAAc,gBAAgB,CAAC;AAC/B,cAAc,kBAAkB,CAAC;AACjC,cAAc,6BAA6B,CAAC;AAC5C,cAAc,yBAAyB,CAAC;AACxC,cAAc,mBAAmB,CAAC;AAClC,cAAc,0CAA0C,CAAC;AACzD,cAAc,6BAA6B,CAAC;AAC5C,cAAc,+CAA+C,CAAC;AAC9D,cAAc,wDAAwD,CAAC;AACvE,cAAc,yCAAyC,CAAC;AACxD,cAAc,2BAA2B,CAAC;AAC1C,cAAc,4BAA4B,CAAC;AAC3C,cAAc,yBAAyB,CAAC;AACxC,cAAc,uBAAuB,CAAC;AACtC,cAAc,sCAAsC,CAAC;AACrD,cAAc,+BAA+B,CAAC;AAC9C,cAAc,oCAAoC,CAAC;AACnD,cAAc,wBAAwB,CAAC;AACvC,cAAc,0BAA0B,CAAC;AACzC,cAAc,6BAA6B,CAAC;AAC5C,cAAc,+BAA+B,CAAC;AAC9C,cAAc,iCAAiC,CAAC;AAChD,cAAc,4BAA4B,CAAC;AAC3C,cAAc,iCAAiC,CAAC;AAChD,cAAc,sCAAsC,CAAC;AACrD,cAAc,sBAAsB,CAAC;AACrC,cAAc,mBAAmB,CAAC;AAClC,cAAc,mBAAmB,CAAC;AAClC,OAAO,EAAE,QAAQ,EAAE,MAAM,mBAAmB,CAAC;AAC7C,cAAc,4BAA4B,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/http/index.ts"],"names":[],"mappings":"AAAA,YAAY,EAAE,QAAQ,EAAE,MAAM,IAAI,CAAC;AACnC,cAAc,sCAAsC,CAAC;AACrD,cAAc,yBAAyB,CAAC;AACxC,cAAc,uBAAuB,CAAC;AACtC,cAAc,mBAAmB,CAAC;AAClC,cAAc,2BAA2B,CAAC;AAC1C,cAAc,mBAAmB,CAAC;AAClC,cAAc,sBAAsB,CAAC;AACrC,cAAc,6BAA6B,CAAC;AAC5C,cAAc,eAAe,CAAC;AAC9B,cAAc,aAAa,CAAC;AAC5B,cAAc,kBAAkB,CAAC;AACjC,cAAc,eAAe,CAAC;AAC9B,cAAc,kBAAkB,CAAC;AACjC,cAAc,0BAA0B,CAAC;AACzC,cAAc,8BAA8B,CAAC;AAC7C,cAAc,6BAA6B,CAAC;AAC5C,cAAc,mBAAmB,CAAC;AAClC,cAAc,gBAAgB,CAAC;AAC/B,cAAc,iBAAiB,CAAC;AAChC,cAAc,uBAAuB,CAAC;AACtC,cAAc,oBAAoB,CAAC;AACnC,cAAc,kBAAkB,CAAC;AACjC,cAAc,iBAAiB,CAAC;AAChC,cAAc,gBAAgB,CAAC;AAC/B,cAAc,kBAAkB,CAAC;AACjC,cAAc,6BAA6B,CAAC;AAC5C,cAAc,yBAAyB,CAAC;AACxC,cAAc,mBAAmB,CAAC;AAClC,cAAc,0CAA0C,CAAC;AACzD,cAAc,6BAA6B,CAAC;AAC5C,cAAc,+CAA+C,CAAC;AAC9D,cAAc,wDAAwD,CAAC;AACvE,cAAc,yCAAyC,CAAC;AACxD,cAAc,2BAA2B,CAAC;AAC1C,cAAc,4BAA4B,CAAC;AAC3C,cAAc,yBAAyB,CAAC;AACxC,cAAc,0BAA0B,CAAC;AACzC,cAAc,uBAAuB,CAAC;AACtC,cAAc,sCAAsC,CAAC;AACrD,cAAc,+BAA+B,CAAC;AAC9C,cAAc,oCAAoC,CAAC;AACnD,cAAc,wBAAwB,CAAC;AACvC,cAAc,0BAA0B,CAAC;AACzC,cAAc,6BAA6B,CAAC;AAC5C,cAAc,+BAA+B,CAAC;AAC9C,cAAc,iCAAiC,CAAC;AAChD,cAAc,4BAA4B,CAAC;AAC3C,cAAc,iCAAiC,CAAC;AAChD,cAAc,sCAAsC,CAAC;AACrD,cAAc,sBAAsB,CAAC;AACrC,cAAc,mBAAmB,CAAC;AAClC,cAAc,mBAAmB,CAAC;AAClC,OAAO,EAAE,QAAQ,EAAE,MAAM,mBAAmB,CAAC;AAC7C,cAAc,4BAA4B,CAAC"}
|