@synnaxlabs/freighter 0.1.0 → 0.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/.editorconfig +15 -0
- package/.eslintrc.json +33 -0
- package/.gitignore +9 -0
- package/.nyc_output/3238f10e-9572-49ec-ab9d-28cbcaa6152a.json +1 -0
- package/.nyc_output/4e78a5c9-c0ca-4664-aa04-f478522608eb.json +1 -0
- package/.nyc_output/6a2244f2-5aea-45c7-8eeb-e14b454f0096.json +1 -0
- package/.nyc_output/dd1075a0-827b-4154-a75e-9bc90a4e16d0.json +1 -0
- package/.nyc_output/f829ad27-9bcd-4604-ae57-aae8c6f28d51.json +1 -0
- package/.nyc_output/fabc60f1-8fc5-4a1e-bea0-dc1fbcc31c9c.json +1 -0
- package/.nyc_output/processinfo/3238f10e-9572-49ec-ab9d-28cbcaa6152a.json +1 -0
- package/.nyc_output/processinfo/4e78a5c9-c0ca-4664-aa04-f478522608eb.json +1 -0
- package/.nyc_output/processinfo/6a2244f2-5aea-45c7-8eeb-e14b454f0096.json +1 -0
- package/.nyc_output/processinfo/dd1075a0-827b-4154-a75e-9bc90a4e16d0.json +1 -0
- package/.nyc_output/processinfo/f829ad27-9bcd-4604-ae57-aae8c6f28d51.json +1 -0
- package/.nyc_output/processinfo/fabc60f1-8fc5-4a1e-bea0-dc1fbcc31c9c.json +1 -0
- package/.nyc_output/processinfo/index.json +1 -0
- package/.prettierignore +2 -0
- package/.prettierrc +3 -0
- package/.vscode/settings.json +4 -0
- package/build/main/index.d.ts +2 -0
- package/build/main/index.js +4 -2
- package/build/main/lib/caseconv.js +7 -7
- package/build/main/lib/encoder.d.ts +8 -9
- package/build/main/lib/encoder.js +3 -7
- package/build/main/lib/encoder.spec.js +2 -2
- package/build/main/lib/errors.d.ts +34 -24
- package/build/main/lib/errors.js +117 -99
- package/build/main/lib/errors.spec.js +63 -51
- package/build/main/lib/http.d.ts +11 -7
- package/build/main/lib/http.js +44 -29
- package/build/main/lib/http.spec.js +14 -4
- package/build/main/lib/middleware.d.ts +45 -0
- package/build/main/lib/middleware.js +38 -0
- package/build/main/lib/runtime.d.ts +2 -2
- package/build/main/lib/runtime.js +17 -15
- package/build/main/lib/stream.d.ts +2 -1
- package/build/main/lib/transport.d.ts +13 -0
- package/build/main/lib/transport.js +3 -0
- package/build/main/lib/unary.d.ts +2 -1
- package/build/main/lib/url.d.ts +30 -29
- package/build/main/lib/url.js +54 -46
- package/build/main/lib/url.spec.js +35 -30
- package/build/main/lib/util/log.d.ts +2 -0
- package/build/main/lib/util/log.js +15 -0
- package/build/main/lib/websocket.d.ts +7 -3
- package/build/main/lib/websocket.js +37 -19
- package/build/main/lib/websocket.spec.d.ts +1 -0
- package/build/main/lib/websocket.spec.js +86 -0
- package/build/main/lib/ws.spec.js +96 -54
- package/build/module/index.d.ts +2 -0
- package/build/module/index.js +2 -1
- package/build/module/lib/caseconv.js +8 -5
- package/build/module/lib/encoder.d.ts +8 -9
- package/build/module/lib/encoder.js +3 -7
- package/build/module/lib/encoder.spec.js +2 -2
- package/build/module/lib/errors.d.ts +34 -24
- package/build/module/lib/errors.js +101 -97
- package/build/module/lib/errors.spec.js +64 -50
- package/build/module/lib/http.d.ts +11 -7
- package/build/module/lib/http.js +42 -28
- package/build/module/lib/http.spec.js +14 -4
- package/build/module/lib/middleware.d.ts +45 -0
- package/build/module/lib/middleware.js +32 -0
- package/build/module/lib/runtime.d.ts +2 -2
- package/build/module/lib/runtime.js +14 -12
- package/build/module/lib/stream.d.ts +2 -1
- package/build/module/lib/transport.d.ts +13 -0
- package/build/module/lib/transport.js +2 -0
- package/build/module/lib/unary.d.ts +2 -1
- package/build/module/lib/url.d.ts +30 -29
- package/build/module/lib/url.js +55 -51
- package/build/module/lib/url.spec.js +26 -23
- package/build/module/lib/util/log.d.ts +2 -0
- package/build/module/lib/util/log.js +11 -0
- package/build/module/lib/websocket.d.ts +7 -3
- package/build/module/lib/websocket.js +40 -19
- package/build/module/lib/websocket.spec.d.ts +1 -0
- package/build/module/lib/websocket.spec.js +82 -0
- package/build/module/lib/ws.spec.js +68 -43
- package/build/tsconfig.module.tsbuildinfo +1 -0
- package/build/tsconfig.tsbuildinfo +1 -0
- package/coverage/base.css +224 -0
- package/coverage/block-navigation.js +87 -0
- package/coverage/caseconv.ts.html +124 -0
- package/coverage/encoder.ts.html +403 -0
- package/coverage/errors.ts.html +727 -0
- package/coverage/favicon.png +0 -0
- package/coverage/http.ts.html +532 -0
- package/coverage/index.html +221 -0
- package/coverage/lcov-report/base.css +224 -0
- package/coverage/lcov-report/block-navigation.js +87 -0
- package/coverage/lcov-report/caseconv.ts.html +124 -0
- package/coverage/lcov-report/encoder.ts.html +403 -0
- package/coverage/lcov-report/errors.ts.html +727 -0
- package/coverage/lcov-report/favicon.png +0 -0
- package/coverage/lcov-report/http.ts.html +532 -0
- package/coverage/lcov-report/index.html +221 -0
- package/coverage/lcov-report/middleware.ts.html +286 -0
- package/coverage/lcov-report/prettify.css +1 -0
- package/coverage/lcov-report/prettify.js +2 -0
- package/coverage/lcov-report/runtime.ts.html +154 -0
- package/coverage/lcov-report/sort-arrow-sprite.png +0 -0
- package/coverage/lcov-report/sorter.js +196 -0
- package/coverage/lcov-report/url.ts.html +322 -0
- package/coverage/lcov-report/websocket.ts.html +760 -0
- package/coverage/lcov.info +552 -0
- package/coverage/middleware.ts.html +286 -0
- package/coverage/prettify.css +1 -0
- package/coverage/prettify.js +2 -0
- package/coverage/runtime.ts.html +154 -0
- package/coverage/sort-arrow-sprite.png +0 -0
- package/coverage/sorter.js +196 -0
- package/coverage/url.ts.html +322 -0
- package/coverage/websocket.ts.html +760 -0
- package/package.json +3 -2
- package/src/index.ts +25 -0
- package/src/lib/caseconv.ts +13 -0
- package/src/lib/encoder.spec.ts +23 -0
- package/src/lib/encoder.ts +105 -0
- package/src/lib/errors.spec.ts +98 -0
- package/src/lib/errors.ts +214 -0
- package/src/lib/http.spec.ts +85 -0
- package/src/lib/http.ts +149 -0
- package/src/lib/middleware.ts +67 -0
- package/src/lib/runtime.ts +23 -0
- package/src/lib/stream.ts +88 -0
- package/src/lib/transport.ts +14 -0
- package/src/lib/unary.ts +21 -0
- package/src/lib/url.spec.ts +37 -0
- package/src/lib/url.ts +79 -0
- package/src/lib/util/log.ts +12 -0
- package/src/lib/websocket.spec.ts +106 -0
- package/src/lib/websocket.ts +225 -0
- package/src/types/example.d.ts +24 -0
- package/tsconfig.json +47 -0
- package/tsconfig.module.json +9 -0
- package/yarn.lock +5878 -0
package/build/module/lib/http.js
CHANGED
|
@@ -1,39 +1,44 @@
|
|
|
1
1
|
import axios from 'axios';
|
|
2
2
|
import { decodeError, ErrorPayloadSchema } from './errors';
|
|
3
|
+
import { MiddlewareCollector } from './middleware';
|
|
3
4
|
/**
|
|
4
|
-
* HTTPClientFactory provides a POST and GET implementation of the Unary
|
|
5
|
+
* HTTPClientFactory provides a POST and GET implementation of the Unary
|
|
6
|
+
* protocol.
|
|
5
7
|
*
|
|
6
8
|
* @param url - The base URL of the API.
|
|
7
9
|
* @param encoder - The encoder/decoder to use for the request/response.
|
|
8
10
|
*/
|
|
9
|
-
export class HTTPClientFactory {
|
|
11
|
+
export class HTTPClientFactory extends MiddlewareCollector {
|
|
10
12
|
endpoint;
|
|
11
13
|
encoder;
|
|
12
14
|
constructor(endpoint, encoder) {
|
|
15
|
+
super();
|
|
13
16
|
this.endpoint = endpoint;
|
|
14
17
|
this.encoder = encoder;
|
|
15
18
|
}
|
|
16
19
|
getClient() {
|
|
17
|
-
|
|
20
|
+
const gc = new GETClient(this.endpoint, this.encoder);
|
|
21
|
+
gc.use(...this.middleware);
|
|
22
|
+
return gc;
|
|
18
23
|
}
|
|
19
24
|
postClient() {
|
|
20
|
-
|
|
25
|
+
const pc = new POSTClient(this.endpoint, this.encoder);
|
|
26
|
+
pc.use(...this.middleware);
|
|
27
|
+
return pc;
|
|
21
28
|
}
|
|
22
29
|
}
|
|
23
|
-
|
|
30
|
+
export const CONTENT_TYPE_HEADER_KEY = 'Content-Type';
|
|
31
|
+
class Core extends MiddlewareCollector {
|
|
24
32
|
endpoint;
|
|
25
33
|
encoder;
|
|
26
|
-
static ERROR_ENCODING_HEADER_KEY = 'Error-Encoding';
|
|
27
|
-
static ERROR_ENCODING_HEADER_VALUE = 'freighter';
|
|
28
|
-
static CONTENT_TYPE_HEADER_KEY = 'Content-Type';
|
|
29
34
|
constructor(endpoint, encoder) {
|
|
35
|
+
super();
|
|
30
36
|
this.endpoint = endpoint.replace({ protocol: 'http' });
|
|
31
37
|
this.encoder = encoder;
|
|
32
38
|
}
|
|
33
39
|
get headers() {
|
|
34
40
|
return {
|
|
35
|
-
[
|
|
36
|
-
[Core.ERROR_ENCODING_HEADER_KEY]: Core.ERROR_ENCODING_HEADER_VALUE,
|
|
41
|
+
[CONTENT_TYPE_HEADER_KEY]: this.encoder.contentType,
|
|
37
42
|
};
|
|
38
43
|
}
|
|
39
44
|
requestConfig() {
|
|
@@ -45,18 +50,25 @@ class Core {
|
|
|
45
50
|
};
|
|
46
51
|
}
|
|
47
52
|
async execute(request, resSchema) {
|
|
48
|
-
|
|
49
|
-
if (
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
+
let rs = undefined;
|
|
54
|
+
if (!request.url)
|
|
55
|
+
throw new Error('[freighter.http] - expected valid request url');
|
|
56
|
+
const err = await this.executeMiddleware({ target: request.url, protocol: 'http', params: {} }, async (md) => {
|
|
57
|
+
request.headers = { ...request.headers, ...this.headers, ...md.params };
|
|
58
|
+
const httpRes = await axios.request(request);
|
|
59
|
+
if (httpRes.status < 200 || httpRes.status >= 300) {
|
|
60
|
+
try {
|
|
61
|
+
const err = this.encoder.decode(httpRes.data, ErrorPayloadSchema);
|
|
62
|
+
return decodeError(err);
|
|
63
|
+
}
|
|
64
|
+
catch {
|
|
65
|
+
return new Error(httpRes.data);
|
|
66
|
+
}
|
|
53
67
|
}
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
const data = this.encoder.decode(response.data, resSchema);
|
|
59
|
-
return [data, undefined];
|
|
68
|
+
rs = this.encoder.decode(httpRes.data, resSchema);
|
|
69
|
+
return undefined;
|
|
70
|
+
});
|
|
71
|
+
return [rs, err];
|
|
60
72
|
}
|
|
61
73
|
}
|
|
62
74
|
/**
|
|
@@ -65,10 +77,11 @@ class Core {
|
|
|
65
77
|
*/
|
|
66
78
|
export class GETClient extends Core {
|
|
67
79
|
async send(target, req, resSchema) {
|
|
68
|
-
const queryString = buildQueryString(req);
|
|
69
80
|
const request = this.requestConfig();
|
|
70
81
|
request.method = 'GET';
|
|
71
|
-
request.url =
|
|
82
|
+
request.url =
|
|
83
|
+
this.endpoint.child(target).stringify() +
|
|
84
|
+
buildQueryString({ request: req });
|
|
72
85
|
return await this.execute(request, resSchema);
|
|
73
86
|
}
|
|
74
87
|
}
|
|
@@ -86,9 +99,10 @@ export class POSTClient extends Core {
|
|
|
86
99
|
return await this.execute(request, resSchema);
|
|
87
100
|
}
|
|
88
101
|
}
|
|
89
|
-
const buildQueryString = (request) => {
|
|
90
|
-
return
|
|
91
|
-
.
|
|
92
|
-
|
|
102
|
+
export const buildQueryString = ({ request, prefix = '', }) => {
|
|
103
|
+
return ('?' +
|
|
104
|
+
Object.keys(request)
|
|
105
|
+
.map((key) => `${prefix}${key}=${request[key]}`)
|
|
106
|
+
.join('&'));
|
|
93
107
|
};
|
|
94
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
108
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaHR0cC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9saWIvaHR0cC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEtBQTZCLE1BQU0sT0FBTyxDQUFDO0FBSWxELE9BQU8sRUFBRSxXQUFXLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSxVQUFVLENBQUM7QUFDM0QsT0FBTyxFQUFZLG1CQUFtQixFQUFFLE1BQU0sY0FBYyxDQUFDO0FBSTdEOzs7Ozs7R0FNRztBQUNILE1BQU0sT0FBTyxpQkFBa0IsU0FBUSxtQkFBbUI7SUFDeEQsUUFBUSxDQUFNO0lBQ2QsT0FBTyxDQUFpQjtJQUV4QixZQUFZLFFBQWEsRUFBRSxPQUF1QjtRQUNoRCxLQUFLLEVBQUUsQ0FBQztRQUNSLElBQUksQ0FBQyxRQUFRLEdBQUcsUUFBUSxDQUFDO1FBQ3pCLElBQUksQ0FBQyxPQUFPLEdBQUcsT0FBTyxDQUFDO0lBQ3pCLENBQUM7SUFFRCxTQUFTO1FBQ1AsTUFBTSxFQUFFLEdBQUcsSUFBSSxTQUFTLENBQUMsSUFBSSxDQUFDLFFBQVEsRUFBRSxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUM7UUFDdEQsRUFBRSxDQUFDLEdBQUcsQ0FBQyxHQUFHLElBQUksQ0FBQyxVQUFVLENBQUMsQ0FBQztRQUMzQixPQUFPLEVBQUUsQ0FBQztJQUNaLENBQUM7SUFFRCxVQUFVO1FBQ1IsTUFBTSxFQUFFLEdBQUcsSUFBSSxVQUFVLENBQUMsSUFBSSxDQUFDLFFBQVEsRUFBRSxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUM7UUFDdkQsRUFBRSxDQUFDLEdBQUcsQ0FBQyxHQUFHLElBQUksQ0FBQyxVQUFVLENBQUMsQ0FBQztRQUMzQixPQUFPLEVBQUUsQ0FBQztJQUNaLENBQUM7Q0FDRjtBQUVELE1BQU0sQ0FBQyxNQUFNLHVCQUF1QixHQUFHLGNBQWMsQ0FBQztBQUV0RCxNQUFNLElBQUssU0FBUSxtQkFBbUI7SUFDcEMsUUFBUSxDQUFNO0lBQ2QsT0FB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
|
|
@@ -6,7 +6,7 @@ import URL from './url';
|
|
|
6
6
|
const ENDPOINT = new URL({
|
|
7
7
|
host: '127.0.0.1',
|
|
8
8
|
port: 8080,
|
|
9
|
-
pathPrefix: '
|
|
9
|
+
pathPrefix: 'unary',
|
|
10
10
|
});
|
|
11
11
|
const factory = new HTTPClientFactory(ENDPOINT, new JSONEncoderDecoder());
|
|
12
12
|
const MessageSchema = z.object({
|
|
@@ -33,12 +33,22 @@ test('[http] - get echo', async (t) => {
|
|
|
33
33
|
});
|
|
34
34
|
test('[http] - get not found', async (t) => {
|
|
35
35
|
const [response, error] = await getClient.send('/not-found', {}, MessageSchema);
|
|
36
|
-
t.is(error?.message, 'Cannot GET /
|
|
36
|
+
t.is(error?.message, 'Cannot GET /unary/not-found');
|
|
37
37
|
t.is(response, undefined);
|
|
38
38
|
});
|
|
39
39
|
test('[http] - post not found', async (t) => {
|
|
40
40
|
const [response, error] = await postClient.send('/not-found', {}, MessageSchema);
|
|
41
|
-
t.is(error?.message, 'Cannot POST /
|
|
41
|
+
t.is(error?.message, 'Cannot POST /unary/not-found');
|
|
42
42
|
t.is(response, undefined);
|
|
43
43
|
});
|
|
44
|
-
|
|
44
|
+
test('[http] - middleware', async (t) => {
|
|
45
|
+
const client = factory.getClient();
|
|
46
|
+
client.use(async (md, next) => {
|
|
47
|
+
md.params['Test'] = 'test';
|
|
48
|
+
return await next(md);
|
|
49
|
+
});
|
|
50
|
+
const [response, error] = await client.send('/middlewareCheck', {}, MessageSchema);
|
|
51
|
+
t.is(error, undefined);
|
|
52
|
+
t.is(response?.message, '');
|
|
53
|
+
});
|
|
54
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaHR0cC5zcGVjLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL2xpYi9odHRwLnNwZWMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxJQUFJLE1BQU0sS0FBSyxDQUFDO0FBQ3ZCLE9BQU8sRUFBRSxDQUFDLEVBQUUsTUFBTSxLQUFLLENBQUM7QUFFeEIsT0FBTyxFQUFFLGtCQUFrQixFQUFFLE1BQU0sV0FBVyxDQUFDO0FBQy9DLE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxNQUFNLFFBQVEsQ0FBQztBQUMzQyxPQUFPLEdBQUcsTUFBTSxPQUFPLENBQUM7QUFFeEIsTUFBTSxRQUFRLEdBQUcsSUFBSSxHQUFHLENBQUM7SUFDdkIsSUFBSSxFQUFFLFdBQVc7SUFDakIsSUFBSSxFQUFFLElBQUk7SUFDVixVQUFVLEVBQUUsT0FBTztDQUNwQixDQUFDLENBQUM7QUFFSCxNQUFNLE9BQU8sR0FBRyxJQUFJLGlCQUFpQixDQUFDLFFBQVEsRUFBRSxJQUFJLGtCQUFrQixFQUFFLENBQUMsQ0FBQztBQUUxRSxNQUFNLGFBQWEsR0FBRyxDQUFDLENBQUMsTUFBTSxDQUFDO0lBQzdCLEVBQUUsRUFBRSxDQUFDLENBQUMsTUFBTSxFQUFFLENBQUMsUUFBUSxFQUFFO0lBQ3pCLE9BQU8sRUFBRSxDQUFDLENBQUMsTUFBTSxFQUFFLENBQUMsUUFBUSxFQUFFO0NBQy9CLENBQUMsQ0FBQztBQUlILE1BQU0sU0FBUyxHQUFHLE9BQU8sQ0FBQyxTQUFTLEVBQUUsQ0FBQztBQUN0QyxNQUFNLFVBQVUsR0FBRyxPQUFPLENBQUMsVUFBVSxFQUFFLENBQUM7QUFFeEMsSUFBSSxDQUFDLG9CQUFvQixFQUFFLEtBQUssRUFBRSxDQUFDLEVBQUUsRUFBRTtJQUNyQyxNQUFNLENBQUMsUUFBUSxFQUFFLEtBQUssQ0FBQyxHQUFHLE1BQU0sVUFBVSxDQUFDLElBQUksQ0FDN0MsT0FBTyxFQUNQO1FBQ0UsRUFBRSxFQUFFLENBQUM7UUFDTCxP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
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* MetaData is the metadata associated with a freighter transport request.
|
|
3
|
+
*
|
|
4
|
+
* @property target - The target the request is being issued to.
|
|
5
|
+
* @property protocol - The protocol used to issue the request.
|
|
6
|
+
* @property params - Arbitrary string parameters that can be set by client side
|
|
7
|
+
* middleware and read by server side middleware.
|
|
8
|
+
*/
|
|
9
|
+
export declare type MetaData = {
|
|
10
|
+
target: string;
|
|
11
|
+
protocol: string;
|
|
12
|
+
params: Record<string, string>;
|
|
13
|
+
};
|
|
14
|
+
/** Next executes the next middleware in the chain. */
|
|
15
|
+
export declare type Next = (md: MetaData) => Promise<Error | undefined>;
|
|
16
|
+
/**
|
|
17
|
+
* Middleware represents a general middleware function that can be used to
|
|
18
|
+
* parse/attach metadata to a request or alter its behavior.
|
|
19
|
+
*/
|
|
20
|
+
export declare type Middleware = (md: MetaData, next: Next) => Promise<Error | undefined>;
|
|
21
|
+
/**
|
|
22
|
+
* Finalizer is a middleware that is executed as the last step in the chain.
|
|
23
|
+
* Finalizer middleware should be used to execute the request.
|
|
24
|
+
*/
|
|
25
|
+
declare type Finalizer = (md: MetaData) => Promise<Error | undefined>;
|
|
26
|
+
/**
|
|
27
|
+
* MiddlewareCollector is a class that can be used to collect and execute
|
|
28
|
+
* middleware in order to implement the Transport interface.
|
|
29
|
+
*/
|
|
30
|
+
export declare class MiddlewareCollector {
|
|
31
|
+
middleware: Middleware[];
|
|
32
|
+
/** Implements the Transport interface */
|
|
33
|
+
use(...mw: Middleware[]): void;
|
|
34
|
+
/**
|
|
35
|
+
* Executes middleware in order, passing the the metadata to each middleware
|
|
36
|
+
* until the end of the chain is reached. It then calls the finalizer with the
|
|
37
|
+
* metadata.
|
|
38
|
+
*
|
|
39
|
+
* @param md - The metadata to pass to the middleware.
|
|
40
|
+
* @param finalizer - The finalizer to call with the metadata.
|
|
41
|
+
* @returns An error if one was encountered, otherwise undefined.
|
|
42
|
+
*/
|
|
43
|
+
executeMiddleware(md: MetaData, finalizer: Finalizer): Promise<Error | undefined>;
|
|
44
|
+
}
|
|
45
|
+
export {};
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* MiddlewareCollector is a class that can be used to collect and execute
|
|
3
|
+
* middleware in order to implement the Transport interface.
|
|
4
|
+
*/
|
|
5
|
+
export class MiddlewareCollector {
|
|
6
|
+
middleware = [];
|
|
7
|
+
/** Implements the Transport interface */
|
|
8
|
+
use(...mw) {
|
|
9
|
+
this.middleware.push(...mw);
|
|
10
|
+
}
|
|
11
|
+
/**
|
|
12
|
+
* Executes middleware in order, passing the the metadata to each middleware
|
|
13
|
+
* until the end of the chain is reached. It then calls the finalizer with the
|
|
14
|
+
* metadata.
|
|
15
|
+
*
|
|
16
|
+
* @param md - The metadata to pass to the middleware.
|
|
17
|
+
* @param finalizer - The finalizer to call with the metadata.
|
|
18
|
+
* @returns An error if one was encountered, otherwise undefined.
|
|
19
|
+
*/
|
|
20
|
+
executeMiddleware(md, finalizer) {
|
|
21
|
+
let i = 0;
|
|
22
|
+
const next = (md) => {
|
|
23
|
+
if (i == this.middleware.length)
|
|
24
|
+
return finalizer(md);
|
|
25
|
+
const _mw = this.middleware[i];
|
|
26
|
+
i++;
|
|
27
|
+
return _mw(md, next);
|
|
28
|
+
};
|
|
29
|
+
return next(md);
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWlkZGxld2FyZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9saWIvbWlkZGxld2FyZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFnQ0E7OztHQUdHO0FBQ0gsTUFBTSxPQUFPLG1CQUFtQjtJQUM5QixVQUFVLEdBQWlCLEVBQUUsQ0FBQztJQUU5Qix5Q0FBeUM7SUFDekMsR0FBRyxDQUFDLEdBQUcsRUFBZ0I7UUFDckIsSUFBSSxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsR0FBRyxFQUFFLENBQUMsQ0FBQztJQUM5QixDQUFDO0lBRUQ7Ozs7Ozs7O09BUUc7SUFDSCxpQkFBaUIsQ0FDZixFQUFZLEVBQ1osU0FBb0I7UUFFcEIsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDO1FBQ1YsTUFBTSxJQUFJLEdBQUcsQ0FBQyxFQUFZLEVBQThCLEVBQUU7WUFDeEQsSUFBSSxDQUFDLElBQUksSUFBSSxDQUFDLFVBQVUsQ0FBQyxNQUFNO2dCQUFFLE9BQU8sU0FBUyxDQUFDLEVBQUUsQ0FBQyxDQUFDO1lBQ3RELE1BQU0sR0FBRyxHQUFHLElBQUksQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFDL0IsQ0FBQyxFQUFFLENBQUM7WUFDSixPQUFPLEdBQUcsQ0FBQyxFQUFFLEVBQUUsSUFBSSxDQUFDLENBQUM7UUFDdkIsQ0FBQyxDQUFDO1FBQ0YsT0FBTyxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUM7SUFDbEIsQ0FBQztDQUNGIn0=
|
|
@@ -1,19 +1,21 @@
|
|
|
1
1
|
export var Runtime;
|
|
2
2
|
(function (Runtime) {
|
|
3
|
-
|
|
4
|
-
|
|
3
|
+
Runtime['Browser'] = 'browser';
|
|
4
|
+
Runtime['Node'] = 'node';
|
|
5
5
|
})(Runtime || (Runtime = {}));
|
|
6
6
|
const detectRuntime = () => {
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
console.warn('Freighter unable to safely detect runtime, assuming browser');
|
|
7
|
+
if (
|
|
8
|
+
typeof process !== 'undefined' &&
|
|
9
|
+
process.versions != null &&
|
|
10
|
+
process.versions.node != null
|
|
11
|
+
) {
|
|
12
|
+
return Runtime.Node;
|
|
13
|
+
}
|
|
14
|
+
if (typeof window !== 'undefined' && typeof window.document !== 'undefined') {
|
|
16
15
|
return Runtime.Browser;
|
|
16
|
+
}
|
|
17
|
+
console.warn('Freighter unable to safely detect runtime, assuming browser');
|
|
18
|
+
return Runtime.Browser;
|
|
17
19
|
};
|
|
18
20
|
export const RUNTIME = detectRuntime();
|
|
19
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicnVudGltZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9saWIvcnVudGltZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxNQUFNLENBQU4sSUFBWSxPQUdYO0FBSEQsV0FBWSxPQUFPO0lBQ2pCLDhCQUFtQixDQUFBO0lBQ25CLHdCQUFhLENBQUE7QUFDZixDQUFDLEVBSFcsT0FBTyxLQUFQLE9BQU8sUUFHbEI7QUFFRCxNQUFNLGFBQWEsR0FBRyxHQUFZLEVBQUU7SUFDbEMsSUFDRSxPQUFPLE9BQU8sS0FBSyxXQUFXO1FBQzlCLE9BQU8sQ0FBQyxRQUFRLElBQUksSUFBSTtRQUN4QixPQUFPLENBQUMsUUFBUSxDQUFDLElBQUksSUFBSSxJQUFJLEVBQzdCO1FBQ0EsT0FBTyxPQUFPLENBQUMsSUFBSSxDQUFDO0tBQ3JCO0lBRUQsSUFBSSxPQUFPLE1BQU0sS0FBSyxXQUFXLElBQUksT0FBTyxNQUFNLENBQUMsUUFBUSxLQUFLLFdBQVcsRUFBRTtRQUMzRSxPQUFPLE9BQU8sQ0FBQyxPQUFPLENBQUM7S0FDeEI7SUFFRCxPQUFPLENBQUMsSUFBSSxDQUFDLDZEQUE2RCxDQUFDLENBQUM7SUFDNUUsT0FBTyxPQUFPLENBQUMsT0FBTyxDQUFDO0FBQ3pCLENBQUMsQ0FBQztBQUVGLE1BQU0sQ0FBQyxNQUFNLE9BQU8sR0FBRyxhQUFhLEVBQUUsQ0FBQyJ9
|
|
21
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicnVudGltZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9saWIvcnVudGltZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxNQUFNLENBQU4sSUFBWSxPQUdYO0FBSEQsV0FBWSxPQUFPO0lBQ2pCLDhCQUFtQixDQUFBO0lBQ25CLHdCQUFhLENBQUE7QUFDZixDQUFDLEVBSFcsT0FBTyxLQUFQLE9BQU8sUUFHbEI7QUFFRCxNQUFNLGFBQWEsR0FBRyxHQUFZLEVBQUU7SUFDbEMsSUFDRSxPQUFPLE9BQU8sS0FBSyxXQUFXO1FBQzlCLE9BQU8sQ0FBQyxRQUFRLElBQUksSUFBSTtRQUN4QixPQUFPLENBQUMsUUFBUSxDQUFDLElBQUksSUFBSSxJQUFJLEVBQzdCO1FBQ0EsT0FBTyxPQUFPLENBQUMsSUFBSSxDQUFDO0tBQ3JCO0lBRUQsSUFBSSxPQUFPLE1BQU0sS0FBSyxXQUFXLElBQUksT0FBTyxNQUFNLENBQUMsUUFBUSxLQUFLLFdBQVcsRUFBRTtRQUMzRSxPQUFPLE9BQU8sQ0FBQyxPQUFPLENBQUM7S0FDeEI7SUFFRCxPQUFPLENBQUMsSUFBSSxDQUFDLDZEQUE2RCxDQUFDLENBQUM7SUFDNUUsT0FBTyxPQUFPLENBQUMsT0FBTyxDQUFDO0FBQ3pCLENBQUMsQ0FBQztBQUVGLE1BQU0sQ0FBQyxNQUFNLE9BQU8sR0FBRyxhQUFhLEVBQUUsQ0FBQyJ9
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import { ZodSchema } from 'zod';
|
|
2
|
+
import { Transport } from './transport';
|
|
2
3
|
/**
|
|
3
4
|
* Interface for an entity that receives a stream of responses.
|
|
4
5
|
*/
|
|
@@ -59,7 +60,7 @@ export interface Stream<RQ, RS> extends StreamSenderCloser<RQ>, StreamReceiver<R
|
|
|
59
60
|
/**
|
|
60
61
|
* Interface for a bidirectional stream between a client and a server.
|
|
61
62
|
*/
|
|
62
|
-
export interface StreamClient {
|
|
63
|
+
export interface StreamClient extends Transport {
|
|
63
64
|
/**
|
|
64
65
|
* Dials the target and returns a stream that can be used to issue requests
|
|
65
66
|
* and receive responses
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import { Middleware } from './middleware';
|
|
2
|
+
/**
|
|
3
|
+
* Transport is a based interface that represents a general transport for
|
|
4
|
+
* exchanging messages between a client and a server.
|
|
5
|
+
*/
|
|
6
|
+
export interface Transport {
|
|
7
|
+
/**
|
|
8
|
+
* Use registers middleware that will be executed in order when the transport
|
|
9
|
+
*
|
|
10
|
+
* @param mw - The middleware to register.
|
|
11
|
+
*/
|
|
12
|
+
use(...mw: Middleware[]): void;
|
|
13
|
+
}
|
|
@@ -1,9 +1,10 @@
|
|
|
1
1
|
import { ZodSchema } from 'zod';
|
|
2
|
+
import { Transport } from './transport';
|
|
2
3
|
/**
|
|
3
4
|
* An interface for an entity that implements a simple request-response
|
|
4
5
|
* transport between two entities.
|
|
5
6
|
*/
|
|
6
|
-
export interface UnaryClient {
|
|
7
|
+
export interface UnaryClient extends Transport {
|
|
7
8
|
/**
|
|
8
9
|
* Sends a request to the target server and waits until a response is received.
|
|
9
10
|
* @param target - The target server to send the request to.
|
|
@@ -1,37 +1,38 @@
|
|
|
1
1
|
declare type URLProps = {
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
2
|
+
host: string;
|
|
3
|
+
port: number;
|
|
4
|
+
protocol?: string;
|
|
5
|
+
pathPrefix?: string;
|
|
6
|
+
params?: string;
|
|
6
7
|
};
|
|
7
8
|
/**
|
|
8
9
|
* URL is a simple class for building and extending URLs.
|
|
9
10
|
*/
|
|
10
11
|
export default class URL {
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
12
|
+
protocol: string;
|
|
13
|
+
host: string;
|
|
14
|
+
port: number;
|
|
15
|
+
path: string;
|
|
16
|
+
/**
|
|
17
|
+
* @param host - The hostname or IP address of the server.
|
|
18
|
+
* @param port - The port number of the server.
|
|
19
|
+
* @param protocol - The protocol to use for all requests. Defaults to "".
|
|
20
|
+
* @param pathPrefix - A path prefix to use for all requests. Defaults to "".
|
|
21
|
+
*/
|
|
22
|
+
constructor({ host, port, protocol, pathPrefix }: URLProps);
|
|
23
|
+
/**
|
|
24
|
+
* Replaces creates a new URL with the specified properties replaced.
|
|
25
|
+
* @param props - The properties to replace.
|
|
26
|
+
* @returns a new URL.
|
|
27
|
+
*/
|
|
28
|
+
replace(props: Partial<URLProps>): URL;
|
|
29
|
+
/**
|
|
30
|
+
* Creates a new url with the given path appended to the current path.
|
|
31
|
+
* @param path - the path to append to the URL.
|
|
32
|
+
* @returns a new URL.
|
|
33
|
+
*/
|
|
34
|
+
child(path: string): URL;
|
|
35
|
+
/** @returns a string representation of the url */
|
|
36
|
+
stringify(): string;
|
|
36
37
|
}
|
|
37
38
|
export {};
|
package/build/module/lib/url.js
CHANGED
|
@@ -2,60 +2,64 @@
|
|
|
2
2
|
* URL is a simple class for building and extending URLs.
|
|
3
3
|
*/
|
|
4
4
|
export default class URL {
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
5
|
+
protocol;
|
|
6
|
+
host;
|
|
7
|
+
port;
|
|
8
|
+
path;
|
|
9
|
+
/**
|
|
10
|
+
* @param host - The hostname or IP address of the server.
|
|
11
|
+
* @param port - The port number of the server.
|
|
12
|
+
* @param protocol - The protocol to use for all requests. Defaults to "".
|
|
13
|
+
* @param pathPrefix - A path prefix to use for all requests. Defaults to "".
|
|
14
|
+
*/
|
|
15
|
+
constructor({ host, port, protocol = '', pathPrefix = '' }) {
|
|
16
|
+
this.protocol = protocol;
|
|
17
|
+
this.host = host;
|
|
18
|
+
this.port = port;
|
|
19
|
+
this.path = formatPath(pathPrefix);
|
|
20
|
+
}
|
|
21
|
+
/**
|
|
22
|
+
* Replaces creates a new URL with the specified properties replaced.
|
|
23
|
+
* @param props - The properties to replace.
|
|
24
|
+
* @returns a new URL.
|
|
25
|
+
*/
|
|
26
|
+
replace(props) {
|
|
27
|
+
return new URL({
|
|
28
|
+
host: props.host || this.host,
|
|
29
|
+
port: props.port || this.port,
|
|
30
|
+
protocol: props.protocol || this.protocol,
|
|
31
|
+
pathPrefix: props.pathPrefix || this.path,
|
|
32
|
+
});
|
|
33
|
+
}
|
|
34
|
+
/**
|
|
35
|
+
* Creates a new url with the given path appended to the current path.
|
|
36
|
+
* @param path - the path to append to the URL.
|
|
37
|
+
* @returns a new URL.
|
|
38
|
+
*/
|
|
39
|
+
child(path) {
|
|
40
|
+
return new URL({
|
|
41
|
+
...this,
|
|
42
|
+
pathPrefix: joinPaths(this.path, path),
|
|
43
|
+
});
|
|
44
|
+
}
|
|
45
|
+
/** @returns a string representation of the url */
|
|
46
|
+
stringify() {
|
|
47
|
+
return removeTrailingSlash(
|
|
48
|
+
`${this.protocol}://${this.host}:${this.port}/${this.path}`
|
|
49
|
+
);
|
|
50
|
+
}
|
|
49
51
|
}
|
|
50
52
|
// joinPath joins the two paths, ensuring there is a single slash between them.
|
|
51
53
|
const joinPaths = (...paths) => {
|
|
52
|
-
|
|
54
|
+
return paths.map(formatPath).join('');
|
|
53
55
|
};
|
|
54
56
|
const formatPath = (path) => {
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
path = path.slice(1);
|
|
59
|
-
return path;
|
|
57
|
+
if (!path.endsWith('/')) path += '/';
|
|
58
|
+
if (path.startsWith('/')) path = path.slice(1);
|
|
59
|
+
return path;
|
|
60
60
|
};
|
|
61
|
-
|
|
61
|
+
const removeTrailingSlash = (path) => {
|
|
62
|
+
if (path.endsWith('/')) path = path.slice(0, -1);
|
|
63
|
+
return path;
|
|
64
|
+
};
|
|
65
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidXJsLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL2xpYi91cmwudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBUUE7O0dBRUc7QUFDSCxNQUFNLENBQUMsT0FBTyxPQUFPLEdBQUc7SUFDdEIsUUFBUSxDQUFTO0lBQ2pCLElBQUksQ0FBUztJQUNiLElBQUksQ0FBUztJQUNiLElBQUksQ0FBUztJQUViOzs7OztPQUtHO0lBQ0gsWUFBWSxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsUUFBUSxHQUFHLEVBQUUsRUFBRSxVQUFVLEdBQUcsRUFBRSxFQUFZO1FBQ2xFLElBQUksQ0FBQyxRQUFRLEdBQUcsUUFBUSxDQUFDO1FBQ3pCLElBQUksQ0FBQyxJQUFJLEdBQUcsSUFBSSxDQUFDO1FBQ2pCLElBQUksQ0FBQyxJQUFJLEdBQUcsSUFBSSxDQUFDO1FBQ2pCLElBQUksQ0FBQyxJQUFJLEdBQUcsVUFBVSxDQUFDLFVBQVUsQ0FBQyxDQUFDO0lBQ3JDLENBQUM7SUFFRDs7OztPQUlHO0lBQ0gsT0FBTyxDQUFDLEtBQXdCO1FBQzlCLE9BQU8sSUFBSSxHQUFHLENBQUM7WUFDYixJQUFJLEVBQUUsS0FBSyxDQUFDLElBQUksSUFBSSxJQUFJLENBQUMsSUFBSTtZQUM3QixJQUFJLEVBQUUsS0FBSyxDQUFDLElBQUksSUFBSSxJQUFJLENBQUMsSUFBSTtZQUM3QixRQUFRLEVBQUUsS0FBSyxDQUFDLFFBQVEsSUFBSSxJQUFJLENBQUMsUUFBUTtZQUN6QyxVQUFVLEVBQUUsS0FBSyxDQUFDLFVBQVUsSUFBSSxJQUFJLENBQUMsSUFBSTtTQUMxQyxDQUFDLENBQUM7SUFDTCxDQUFDO0lBRUQ7Ozs7T0FJRztJQUNILEtBQUssQ0FBQyxJQUFZO1FBQ2hCLE9BQU8sSUFBSSxHQUFHLENBQUM7WUFDYixHQUFHLElBQUk7WUFDUCxVQUFVLEVBQUUsU0FBUyxDQUFDLElBQUksQ0FBQyxJQUFJLEVBQUUsSUFBSSxDQUFDO1NBQ3ZDLENBQUMsQ0FBQztJQUNMLENBQUM7SUFFRCxrREFBa0Q7SUFDbEQsU0FBUztRQUNQLE9BQU8sbUJBQW1CLENBQ3hCLEdBQUcsSUFBSSxDQUFDLFFBQVEsTUFBTSxJQUFJLENBQUMsSUFBSSxJQUFJLElBQUksQ0FBQyxJQUFJLElBQUksSUFBSSxDQUFDLElBQUksRUFBRSxDQUM1RCxDQUFDO0lBQ0osQ0FBQztDQUNGO0FBRUQsK0VBQStFO0FBQy9FLE1BQU0sU0FBUyxHQUFHLENBQUMsR0FBRyxLQUFlLEVBQVUsRUFBRTtJQUMvQyxPQUFPLEtBQUssQ0FBQyxHQUFHLENBQUMsVUFBVSxDQUFDLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDO0FBQ3hDLENBQUMsQ0FBQztBQUVGLE1BQU0sVUFBVSxHQUFHLENBQUMsSUFBWSxFQUFVLEVBQUU7SUFDMUMsSUFBSSxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsR0FBRyxDQUFDO1FBQUUsSUFBSSxJQUFJLEdBQUcsQ0FBQztJQUNyQyxJQUFJLElBQUksQ0FBQyxVQUFVLENBQUMsR0FBRyxDQUFDO1FBQUUsSUFBSSxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDL0MsT0FBTyxJQUFJLENBQUM7QUFDZCxDQUFDLENBQUM7QUFFRixNQUFNLG1CQUFtQixHQUFHLENBQUMsSUFBWSxFQUFVLEVBQUU7SUFDbkQsSUFBSSxJQUFJLENBQUMsUUFBUSxDQUFDLEdBQUcsQ0FBQztRQUFFLElBQUksR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQ2pELE9BQU8sSUFBSSxDQUFDO0FBQ2QsQ0FBQyxDQUFDIn0=
|
|
@@ -1,31 +1,34 @@
|
|
|
1
1
|
import test from 'ava';
|
|
2
2
|
import URL from './url';
|
|
3
3
|
test('URL - child', (t) => {
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
4
|
+
const endpoint = new URL({
|
|
5
|
+
host: 'localhost',
|
|
6
|
+
port: 8080,
|
|
7
|
+
protocol: 'http',
|
|
8
|
+
pathPrefix: 'api',
|
|
9
|
+
});
|
|
10
|
+
t.is(endpoint.child('test').stringify(), 'http://localhost:8080/api/test');
|
|
11
11
|
});
|
|
12
12
|
test('URL - child with trailing slash', (t) => {
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
13
|
+
const endpoint = new URL({
|
|
14
|
+
host: 'localhost',
|
|
15
|
+
port: 8080,
|
|
16
|
+
protocol: 'http',
|
|
17
|
+
pathPrefix: 'api',
|
|
18
|
+
});
|
|
19
|
+
const child = endpoint.child('test/');
|
|
20
|
+
t.is(child.stringify(), 'http://localhost:8080/api/test');
|
|
21
21
|
});
|
|
22
22
|
test('URL - replacing protocol', (t) => {
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
23
|
+
const endpoint = new URL({
|
|
24
|
+
host: 'localhost',
|
|
25
|
+
port: 8080,
|
|
26
|
+
protocol: 'http',
|
|
27
|
+
pathPrefix: 'api',
|
|
28
|
+
});
|
|
29
|
+
t.is(
|
|
30
|
+
endpoint.child('test').replace({ protocol: 'https' }).stringify(),
|
|
31
|
+
'https://localhost:8080/api/test'
|
|
32
|
+
);
|
|
30
33
|
});
|
|
31
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
34
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidXJsLnNwZWMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvbGliL3VybC5zcGVjLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sSUFBSSxNQUFNLEtBQUssQ0FBQztBQUV2QixPQUFPLEdBQUcsTUFBTSxPQUFPLENBQUM7QUFFeEIsSUFBSSxDQUFDLGFBQWEsRUFBRSxDQUFDLENBQUMsRUFBRSxFQUFFO0lBQ3hCLE1BQU0sUUFBUSxHQUFHLElBQUksR0FBRyxDQUFDO1FBQ3ZCLElBQUksRUFBRSxXQUFXO1FBQ2pCLElBQUksRUFBRSxJQUFJO1FBQ1YsUUFBUSxFQUFFLE1BQU07UUFDaEIsVUFBVSxFQUFFLEtBQUs7S0FDbEIsQ0FBQyxDQUFDO0lBQ0gsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FBQyxDQUFDLFNBQVMsRUFBRSxFQUFFLGdDQUFnQyxDQUFDLENBQUM7QUFDN0UsQ0FBQyxDQUFDLENBQUM7QUFFSCxJQUFJLENBQUMsaUNBQWlDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsRUFBRTtJQUM1QyxNQUFNLFFBQVEsR0FBRyxJQUFJLEdBQUcsQ0FBQztRQUN2QixJQUFJLEVBQUUsV0FBVztRQUNqQixJQUFJLEVBQUUsSUFBSTtRQUNWLFFBQVEsRUFBRSxNQUFNO1FBQ2hCLFVBQVUsRUFBRSxLQUFLO0tBQ2xCLENBQUMsQ0FBQztJQUNILE1BQU0sS0FBSyxHQUFHLFFBQVEsQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLENBQUM7SUFDdEMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxLQUFLLENBQUMsU0FBUyxFQUFFLEVBQUUsZ0NBQWdDLENBQUMsQ0FBQztBQUM1RCxDQUFDLENBQUMsQ0FBQztBQUVILElBQUksQ0FBQywwQkFBMEIsRUFBRSxDQUFDLENBQUMsRUFBRSxFQUFFO0lBQ3JDLE1BQU0sUUFBUSxHQUFHLElBQUksR0FBRyxDQUFDO1FBQ3ZCLElBQUksRUFBRSxXQUFXO1FBQ2pCLElBQUksRUFBRSxJQUFJO1FBQ1YsUUFBUSxFQUFFLE1BQU07UUFDaEIsVUFBVSxFQUFFLEtBQUs7S0FDbEIsQ0FBQyxDQUFDO0lBQ0gsQ0FBQyxDQUFDLEVBQUUsQ0FDRixRQUFRLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FBQyxDQUFDLE9BQU8sQ0FBQyxFQUFFLFFBQVEsRUFBRSxPQUFPLEVBQUUsQ0FBQyxDQUFDLFNBQVMsRUFBRSxFQUNqRSxpQ0FBaUMsQ0FDbEMsQ0FBQztBQUNKLENBQUMsQ0FBQyxDQUFDIn0=
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
export const logMiddleware = () => {
|
|
2
|
+
return async (md, next) => {
|
|
3
|
+
console.log(JSON.stringify(md, undefined, 2));
|
|
4
|
+
const err = await next(md);
|
|
5
|
+
if (err) {
|
|
6
|
+
console.log(err);
|
|
7
|
+
}
|
|
8
|
+
return err;
|
|
9
|
+
};
|
|
10
|
+
};
|
|
11
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibG9nLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vc3JjL2xpYi91dGlsL2xvZy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFFQSxNQUFNLENBQUMsTUFBTSxhQUFhLEdBQUcsR0FBZSxFQUFFO0lBQzVDLE9BQU8sS0FBSyxFQUFFLEVBQUUsRUFBRSxJQUFJLEVBQUUsRUFBRTtRQUN4QixPQUFPLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsRUFBRSxFQUFFLFNBQVMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQzlDLE1BQU0sR0FBRyxHQUFHLE1BQU0sSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDO1FBQzNCLElBQUksR0FBRyxFQUFFO1lBQ1AsT0FBTyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQztTQUNsQjtRQUNELE9BQU8sR0FBRyxDQUFDO0lBQ2IsQ0FBQyxDQUFDO0FBQ0osQ0FBQyxDQUFDIn0=
|