@synnaxlabs/freighter 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -0
- package/README.md +3 -0
- package/build/main/index.d.ts +7 -0
- package/build/main/index.js +27 -0
- package/build/main/lib/caseconv.d.ts +2 -0
- package/build/main/lib/caseconv.js +14 -0
- package/build/main/lib/encoder.d.ts +60 -0
- package/build/main/lib/encoder.js +61 -0
- package/build/main/lib/encoder.spec.d.ts +1 -0
- package/build/main/lib/encoder.spec.js +26 -0
- package/build/main/lib/errors.d.ts +77 -0
- package/build/main/lib/errors.js +171 -0
- package/build/main/lib/errors.spec.d.ts +1 -0
- package/build/main/lib/errors.spec.js +76 -0
- package/build/main/lib/http.d.ts +46 -0
- package/build/main/lib/http.js +99 -0
- package/build/main/lib/http.spec.d.ts +1 -0
- package/build/main/lib/http.spec.js +49 -0
- package/build/main/lib/runtime.d.ts +5 -0
- package/build/main/lib/runtime.js +22 -0
- package/build/main/lib/stream.d.ts +75 -0
- package/build/main/lib/stream.js +3 -0
- package/build/main/lib/unary.d.ts +14 -0
- package/build/main/lib/unary.js +3 -0
- package/build/main/lib/url.d.ts +37 -0
- package/build/main/lib/url.js +57 -0
- package/build/main/lib/url.spec.d.ts +1 -0
- package/build/main/lib/url.spec.js +36 -0
- package/build/main/lib/websocket.d.ts +21 -0
- package/build/main/lib/websocket.js +154 -0
- package/build/main/lib/ws.spec.d.ts +1 -0
- package/build/main/lib/ws.spec.js +73 -0
- package/build/module/index.d.ts +7 -0
- package/build/module/index.js +6 -0
- package/build/module/lib/caseconv.d.ts +2 -0
- package/build/module/lib/caseconv.js +9 -0
- package/build/module/lib/encoder.d.ts +60 -0
- package/build/module/lib/encoder.js +51 -0
- package/build/module/lib/encoder.spec.d.ts +1 -0
- package/build/module/lib/encoder.spec.js +21 -0
- package/build/module/lib/errors.d.ts +77 -0
- package/build/module/lib/errors.js +160 -0
- package/build/module/lib/errors.spec.d.ts +1 -0
- package/build/module/lib/errors.spec.js +71 -0
- package/build/module/lib/http.d.ts +46 -0
- package/build/module/lib/http.js +94 -0
- package/build/module/lib/http.spec.d.ts +1 -0
- package/build/module/lib/http.spec.js +44 -0
- package/build/module/lib/runtime.d.ts +5 -0
- package/build/module/lib/runtime.js +19 -0
- package/build/module/lib/stream.d.ts +75 -0
- package/build/module/lib/stream.js +2 -0
- package/build/module/lib/unary.d.ts +14 -0
- package/build/module/lib/unary.js +2 -0
- package/build/module/lib/url.d.ts +37 -0
- package/build/module/lib/url.js +61 -0
- package/build/module/lib/url.spec.d.ts +1 -0
- package/build/module/lib/url.spec.js +31 -0
- package/build/module/lib/websocket.d.ts +21 -0
- package/build/module/lib/websocket.js +160 -0
- package/build/module/lib/ws.spec.d.ts +1 -0
- package/build/module/lib/ws.spec.js +69 -0
- package/package.json +118 -0
|
@@ -0,0 +1,73 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
const ava_1 = __importDefault(require("ava"));
|
|
7
|
+
const zod_1 = require("zod");
|
|
8
|
+
const encoder_1 = require("./encoder");
|
|
9
|
+
const errors_1 = require("./errors");
|
|
10
|
+
const url_1 = __importDefault(require("./url"));
|
|
11
|
+
const websocket_1 = require("./websocket");
|
|
12
|
+
const url = new url_1.default({
|
|
13
|
+
host: '127.0.0.1',
|
|
14
|
+
port: 8080,
|
|
15
|
+
});
|
|
16
|
+
const MessageSchema = zod_1.z.object({
|
|
17
|
+
id: zod_1.z.number().optional(),
|
|
18
|
+
message: zod_1.z.string().optional(),
|
|
19
|
+
});
|
|
20
|
+
const client = new websocket_1.WebSocketClient(new encoder_1.JSONEncoderDecoder(), url);
|
|
21
|
+
class MyCustomError extends errors_1.BaseTypedError {
|
|
22
|
+
constructor(message, code) {
|
|
23
|
+
super(message, 'integration.error');
|
|
24
|
+
this.code = code;
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
const encodeTestError = (err) => {
|
|
28
|
+
if (!(err instanceof MyCustomError)) {
|
|
29
|
+
throw new Error('Unexpected error type');
|
|
30
|
+
}
|
|
31
|
+
return `${err.code},${err.message}`;
|
|
32
|
+
};
|
|
33
|
+
const decodeTestError = (encoded) => {
|
|
34
|
+
const [code, message] = encoded.split(',');
|
|
35
|
+
return new MyCustomError(message, parseInt(code, 10));
|
|
36
|
+
};
|
|
37
|
+
(0, errors_1.registerError)({
|
|
38
|
+
type: 'integration.error',
|
|
39
|
+
encode: encodeTestError,
|
|
40
|
+
decode: decodeTestError,
|
|
41
|
+
});
|
|
42
|
+
(0, ava_1.default)('basic exchange', async (t) => {
|
|
43
|
+
const stream = await client.stream('ws/echo', MessageSchema, MessageSchema);
|
|
44
|
+
for (let i = 0; i < 10; i++) {
|
|
45
|
+
stream.send({ id: i, message: 'hello' });
|
|
46
|
+
const [response, error] = await stream.receive();
|
|
47
|
+
t.is(error, undefined);
|
|
48
|
+
t.is(response === null || response === void 0 ? void 0 : response.id, i + 1);
|
|
49
|
+
t.is(response === null || response === void 0 ? void 0 : response.message, 'hello');
|
|
50
|
+
}
|
|
51
|
+
stream.closeSend();
|
|
52
|
+
const [response, error] = await stream.receive();
|
|
53
|
+
t.deepEqual(error, new errors_1.EOF());
|
|
54
|
+
t.is(response, undefined);
|
|
55
|
+
});
|
|
56
|
+
(0, ava_1.default)('receive message after close', async (t) => {
|
|
57
|
+
const stream = await client.stream('ws/sendMessageAfterClientClose', MessageSchema, MessageSchema);
|
|
58
|
+
await stream.closeSend();
|
|
59
|
+
let [response, error] = await stream.receive();
|
|
60
|
+
t.is(error, undefined);
|
|
61
|
+
t.is(response === null || response === void 0 ? void 0 : response.id, 0);
|
|
62
|
+
t.is(response === null || response === void 0 ? void 0 : response.message, 'Close Acknowledged');
|
|
63
|
+
[response, error] = await stream.receive();
|
|
64
|
+
t.deepEqual(error, new errors_1.EOF());
|
|
65
|
+
});
|
|
66
|
+
(0, ava_1.default)('receive error', async (t) => {
|
|
67
|
+
const stream = await client.stream('ws/receiveAndExitWithErr', MessageSchema, MessageSchema);
|
|
68
|
+
stream.send({ id: 0, message: 'hello' });
|
|
69
|
+
const [response, error] = await stream.receive();
|
|
70
|
+
t.deepEqual(error, new MyCustomError('unexpected error', 1));
|
|
71
|
+
t.is(response, undefined);
|
|
72
|
+
});
|
|
73
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoid3Muc3BlYy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9saWIvd3Muc3BlYy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7OztBQUFBLDhDQUF1QjtBQUN2Qiw2QkFBd0I7QUFFeEIsdUNBQStDO0FBQy9DLHFDQUEwRTtBQUMxRSxnREFBd0I7QUFDeEIsMkNBQThDO0FBRTlDLE1BQU0sR0FBRyxHQUFHLElBQUksYUFBRyxDQUFDO0lBQ2xCLElBQUksRUFBRSxXQUFXO0lBQ2pCLElBQUksRUFBRSxJQUFJO0NBQ1gsQ0FBQyxDQUFDO0FBRUgsTUFBTSxhQUFhLEdBQUcsT0FBQyxDQUFDLE1BQU0sQ0FBQztJQUM3QixFQUFFLEVBQUUsT0FBQyxDQUFDLE1BQU0sRUFBRSxDQUFDLFFBQVEsRUFBRTtJQUN6QixPQUFPLEVBQUUsT0FBQyxDQUFDLE1BQU0sRUFBRSxDQUFDLFFBQVEsRUFBRTtDQUMvQixDQUFDLENBQUM7QUFFSCxNQUFNLE1BQU0sR0FBRyxJQUFJLDJCQUFlLENBQUMsSUFBSSw0QkFBa0IsRUFBRSxFQUFFLEdBQUcsQ0FBQyxDQUFDO0FBRWxFLE1BQU0sYUFBYyxTQUFRLHVCQUFjO0lBR3hDLFlBQVksT0FBZSxFQUFFLElBQVk7UUFDdkMsS0FBSyxDQUFDLE9BQU8sRUFBRSxtQkFBbUIsQ0FBQyxDQUFDO1FBQ3BDLElBQUksQ0FBQyxJQUFJLEdBQUcsSUFBSSxDQUFDO0lBQ25CLENBQUM7Q0FDRjtBQUVELE1BQU0sZUFBZSxHQUFHLENBQUMsR0FBZSxFQUFVLEVBQUU7SUFDbEQsSUFBSSxDQUFDLENBQUMsR0FBRyxZQUFZLGFBQWEsQ0FBQyxFQUFFO1FBQ25DLE1BQU0sSUFBSSxLQUFLLENBQUMsdUJBQXVCLENBQUMsQ0FBQztLQUMxQztJQUNELE9BQU8sR0FBRyxHQUFHLENBQUMsSUFBSSxJQUFJLEdBQUcsQ0FBQyxPQUFPLEVBQUUsQ0FBQztBQUN0QyxDQUFDLENBQUM7QUFFRixNQUFNLGVBQWUsR0FBRyxD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
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
export { WebSocketClient } from './lib/websocket';
|
|
2
|
+
export { MsgpackEncoderDecoder, JSONEncoderDecoder, registerCustomTypeEncoder, ENCODERS, } from './lib/encoder';
|
|
3
|
+
export { StreamClient, Stream } from './lib/stream';
|
|
4
|
+
export { UnaryClient } from './lib/unary';
|
|
5
|
+
export { HTTPClientFactory } from './lib/http';
|
|
6
|
+
export { default as URL } from './lib/url';
|
|
7
|
+
export { encodeError, decodeError, registerError, BaseTypedError, TypedError, ErrorPayload, ErrorPayloadSchema, EOF, StreamClosed, Unreachable, } from './lib/errors';
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
export { WebSocketClient } from './lib/websocket';
|
|
2
|
+
export { MsgpackEncoderDecoder, JSONEncoderDecoder, registerCustomTypeEncoder, ENCODERS, } from './lib/encoder';
|
|
3
|
+
export { HTTPClientFactory } from './lib/http';
|
|
4
|
+
export { default as URL } from './lib/url';
|
|
5
|
+
export { encodeError, decodeError, registerError, BaseTypedError, ErrorPayloadSchema, EOF, StreamClosed, Unreachable, } from './lib/errors';
|
|
6
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQ2xELE9BQU8sRUFDTCxxQkFBcUIsRUFDckIsa0JBQWtCLEVBQ2xCLHlCQUF5QixFQUN6QixRQUFRLEdBQ1QsTUFBTSxlQUFlLENBQUM7QUFHdkIsT0FBTyxFQUFFLGlCQUFpQixFQUFFLE1BQU0sWUFBWSxDQUFDO0FBQy9DLE9BQU8sRUFBRSxPQUFPLElBQUksR0FBRyxFQUFFLE1BQU0sV0FBVyxDQUFDO0FBQzNDLE9BQU8sRUFDTCxXQUFXLEVBQ1gsV0FBVyxFQUNYLGFBQWEsRUFDYixjQUFjLEVBR2Qsa0JBQWtCLEVBQ2xCLEdBQUcsRUFDSCxZQUFZLEVBQ1osV0FBVyxHQUNaLE1BQU0sY0FBYyxDQUFDIn0=
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import { camelKeys as _camelKeys, snakeKeys as _snakeKeys, } from 'js-convert-case';
|
|
2
|
+
const options = {
|
|
3
|
+
recursive: true,
|
|
4
|
+
recursiveInArray: true,
|
|
5
|
+
keepTypesOnRecursion: [Number, String, Uint8Array],
|
|
6
|
+
};
|
|
7
|
+
export const snakeKeys = (entity) => _snakeKeys(entity, options);
|
|
8
|
+
export const camelKeys = (entity) => _camelKeys(entity, options);
|
|
9
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2FzZWNvbnYuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvbGliL2Nhc2Vjb252LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFDTCxTQUFTLElBQUksVUFBVSxFQUN2QixTQUFTLElBQUksVUFBVSxHQUN4QixNQUFNLGlCQUFpQixDQUFDO0FBRXpCLE1BQU0sT0FBTyxHQUFHO0lBQ2QsU0FBUyxFQUFFLElBQUk7SUFDZixnQkFBZ0IsRUFBRSxJQUFJO0lBQ3RCLG9CQUFvQixFQUFFLENBQUMsTUFBTSxFQUFFLE1BQU0sRUFBRSxVQUFVLENBQUM7Q0FDbkQsQ0FBQztBQUVGLE1BQU0sQ0FBQyxNQUFNLFNBQVMsR0FBRyxDQUFDLE1BQWUsRUFBRSxFQUFFLENBQUMsVUFBVSxDQUFDLE1BQU0sRUFBRSxPQUFPLENBQUMsQ0FBQztBQUMxRSxNQUFNLENBQUMsTUFBTSxTQUFTLEdBQUcsQ0FBQyxNQUFlLEVBQUUsRUFBRSxDQUFDLFVBQVUsQ0FBQyxNQUFNLEVBQUUsT0FBTyxDQUFDLENBQUMifQ==
|
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
import { ZodSchema } from 'zod';
|
|
2
|
+
/**
|
|
3
|
+
* CustomTypeEncoder is an interface for a class that needs to transform its
|
|
4
|
+
* value before encoding.
|
|
5
|
+
*/
|
|
6
|
+
interface CustomTypeEncoder {
|
|
7
|
+
/** The Class the custom encoder is set for */
|
|
8
|
+
Class: Function;
|
|
9
|
+
/**
|
|
10
|
+
* The function that transforms the value before encoding;
|
|
11
|
+
* @param instance - The instance of the class to transform.
|
|
12
|
+
* @returns The transformed value.
|
|
13
|
+
*/
|
|
14
|
+
write<P>(instance: P): unknown;
|
|
15
|
+
}
|
|
16
|
+
/**
|
|
17
|
+
* EncoderDecoder is an entity that encodes and decodes messages to and from
|
|
18
|
+
* a binary format.
|
|
19
|
+
*/
|
|
20
|
+
export interface EncoderDecoder {
|
|
21
|
+
/** The HTTP content type of the encoder */
|
|
22
|
+
contentType: string;
|
|
23
|
+
/**
|
|
24
|
+
* Encodes the given payload into a binary representation.
|
|
25
|
+
* @param payload - The payload to encode.
|
|
26
|
+
* @returns an ArrayBuffer containing the encoded payload.
|
|
27
|
+
*/
|
|
28
|
+
encode(payload: unknown): ArrayBuffer;
|
|
29
|
+
/**
|
|
30
|
+
* Decodes the given binary representation into a type checked payload.
|
|
31
|
+
* @param data - The data to decode.
|
|
32
|
+
* @param schema - The schema to decode the data with.
|
|
33
|
+
*/
|
|
34
|
+
decode<P>(data: Uint8Array | ArrayBuffer, schema: ZodSchema<P>): P;
|
|
35
|
+
}
|
|
36
|
+
interface StaticEncoderDecoder {
|
|
37
|
+
registerCustomType(encoder: CustomTypeEncoder): void;
|
|
38
|
+
}
|
|
39
|
+
/***
|
|
40
|
+
* MsgpackEncoderDecoder is a msgpack implementation of EncoderDecoder.
|
|
41
|
+
*/
|
|
42
|
+
export declare class MsgpackEncoderDecoder implements EncoderDecoder {
|
|
43
|
+
contentType: string;
|
|
44
|
+
encode(payload: unknown): ArrayBuffer;
|
|
45
|
+
decode<P>(data: Uint8Array, schema: ZodSchema<P>): P;
|
|
46
|
+
static registerCustomType(encoder: CustomTypeEncoder): void;
|
|
47
|
+
}
|
|
48
|
+
/**
|
|
49
|
+
* JSONEncoderDecoder is a JSON implementation of EncoderDecoder.
|
|
50
|
+
*/
|
|
51
|
+
export declare class JSONEncoderDecoder implements EncoderDecoder {
|
|
52
|
+
contentType: string;
|
|
53
|
+
encode(payload: unknown): ArrayBuffer;
|
|
54
|
+
decode<P>(data: Uint8Array, schema: ZodSchema<P>): P;
|
|
55
|
+
static registerCustomType(): void;
|
|
56
|
+
}
|
|
57
|
+
export declare const ENCODERS: EncoderDecoder[];
|
|
58
|
+
export declare const ENCODER_CLASSES: StaticEncoderDecoder[];
|
|
59
|
+
export declare const registerCustomTypeEncoder: (encoder: CustomTypeEncoder) => void;
|
|
60
|
+
export {};
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
import { addExtension, pack, unpack } from 'msgpackr';
|
|
2
|
+
import { camelKeys, snakeKeys } from './caseconv';
|
|
3
|
+
/***
|
|
4
|
+
* MsgpackEncoderDecoder is a msgpack implementation of EncoderDecoder.
|
|
5
|
+
*/
|
|
6
|
+
export class MsgpackEncoderDecoder {
|
|
7
|
+
contentType = 'application/msgpack';
|
|
8
|
+
encode(payload) {
|
|
9
|
+
return pack(snakeKeys(payload));
|
|
10
|
+
}
|
|
11
|
+
decode(data, schema) {
|
|
12
|
+
return schema.parse(camelKeys(unpack(new Uint8Array(data))));
|
|
13
|
+
}
|
|
14
|
+
static registerCustomType(encoder) {
|
|
15
|
+
addExtension({ type: 0, ...encoder });
|
|
16
|
+
}
|
|
17
|
+
}
|
|
18
|
+
/**
|
|
19
|
+
* JSONEncoderDecoder is a JSON implementation of EncoderDecoder.
|
|
20
|
+
*/
|
|
21
|
+
export class JSONEncoderDecoder {
|
|
22
|
+
contentType = 'application/json';
|
|
23
|
+
encode(payload) {
|
|
24
|
+
const json = JSON.stringify(snakeKeys(payload), (_, v) => {
|
|
25
|
+
if (ArrayBuffer.isView(v))
|
|
26
|
+
return Array.from(v);
|
|
27
|
+
return v;
|
|
28
|
+
});
|
|
29
|
+
return new TextEncoder().encode(json);
|
|
30
|
+
}
|
|
31
|
+
decode(data, schema) {
|
|
32
|
+
return schema.parse(camelKeys(JSON.parse(new TextDecoder().decode(data))));
|
|
33
|
+
}
|
|
34
|
+
static registerCustomType() {
|
|
35
|
+
return;
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
export const ENCODERS = [
|
|
39
|
+
new MsgpackEncoderDecoder(),
|
|
40
|
+
new JSONEncoderDecoder(),
|
|
41
|
+
];
|
|
42
|
+
export const ENCODER_CLASSES = [
|
|
43
|
+
MsgpackEncoderDecoder,
|
|
44
|
+
JSONEncoderDecoder,
|
|
45
|
+
];
|
|
46
|
+
export const registerCustomTypeEncoder = (encoder) => {
|
|
47
|
+
ENCODER_CLASSES.forEach((encoderClass) => {
|
|
48
|
+
encoderClass.registerCustomType(encoder);
|
|
49
|
+
});
|
|
50
|
+
};
|
|
51
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZW5jb2Rlci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9saWIvZW5jb2Rlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsWUFBWSxFQUFFLElBQUksRUFBRSxNQUFNLEVBQUUsTUFBTSxVQUFVLENBQUM7QUFHdEQsT0FBTyxFQUFFLFNBQVMsRUFBRSxTQUFTLEVBQUUsTUFBTSxZQUFZLENBQUM7QUE4Q2xEOztHQUVHO0FBQ0gsTUFBTSxPQUFPLHFCQUFxQjtJQUNoQyxXQUFXLEdBQUcscUJBQXFCLENBQUM7SUFFcEMsTUFBTSxDQUFDLE9BQWdCO1FBQ3JCLE9BQU8sSUFBSSxDQUFDLFNBQVMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDO0lBQ2xDLENBQUM7SUFFRCxNQUFNLENBQUksSUFBZ0IsRUFBRSxNQUFvQjtRQUM5QyxPQUFPLE1BQU0sQ0FBQyxLQUFLLENBQUMsU0FBUyxDQUFDLE1BQU0sQ0FBQyxJQUFJLFVBQVUsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUMvRCxDQUFDO0lBRUQsTUFBTSxDQUFDLGtCQUFrQixDQUFDLE9BQTBCO1FBQ2xELFlBQVksQ0FBQyxFQUFFLElBQUksRUFBRSxDQUFDLEVBQUUsR0FBRyxPQUFPLEVBQUUsQ0FBQyxDQUFDO0lBQ3hDLENBQUM7Q0FDRjtBQUVEOztHQUVHO0FBQ0gsTUFBTSxPQUFPLGtCQUFrQjtJQUM3QixXQUFXLEdBQUcsa0JBQWtCLENBQUM7SUFFakMsTUFBTSxDQUFDLE9BQWdCO1FBQ3JCLE1BQU0sSUFBSSxHQUFHLElBQUksQ0FBQyxTQUFTLENBQUMsU0FBUyxDQUFDLE9BQU8sQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxFQUFFO1lBQ3ZELElBQUksV0FBVyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUM7Z0JBQUUsT0FBTyxLQUFLLENBQUMsSUFBSSxDQUFDLENBQWUsQ0FBQyxDQUFDO1lBQzlELE9BQU8sQ0FBQyxDQUFDO1FBQ1gsQ0FBQyxDQUFDLENBQUM7UUFDSCxPQUFPLElBQUksV0FBVyxFQUFFLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxDQUFDO0lBQ3hDLENBQUM7SUFFRCxNQUFNLENBQUksSUFBZ0IsRUFBRSxNQUFvQjtRQUM5QyxPQUFPLE1BQU0sQ0FBQyxLQUFLLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxXQUFXLEVBQUUsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDN0UsQ0FBQztJQUVELE1BQU0sQ0FBQyxrQkFBa0I7UUFDdkIsT0FBTztJQUNULENBQUM7Q0FDRjtBQUVELE1BQU0sQ0FBQyxNQUFNLFFBQVEsR0FBcUI7SUFDeEMsSUFBSSxxQkFBcUIsRUFBRTtJQUMzQixJQUFJLGtCQUFrQixFQUFFO0NBQ3pCLENBQUM7QUFFRixNQUFNLENBQUMsTUFBTSxlQUFlLEdBQTJCO0lBQ3JELHFCQUFxQjtJQUNyQixrQkFBa0I7Q0FDbkIsQ0FBQztBQUVGLE1BQU0sQ0FBQyxNQUFNLHlCQUF5QixHQUFHLENBQUMsT0FBMEIsRUFBUSxFQUFFO0lBQzVFLGVBQWUsQ0FBQyxPQUFPLENBQUMsQ0FBQyxZQUFZLEVBQUUsRUFBRTtRQUN2QyxZQUFZLENBQUMsa0JBQWtCLENBQUMsT0FBTyxDQUFDLENBQUM7SUFDM0MsQ0FBQyxDQUFDLENBQUM7QUFDTCxDQUFDLENBQUMifQ==
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import test from 'ava';
|
|
2
|
+
import { z } from 'zod';
|
|
3
|
+
import { ENCODERS } from './encoder';
|
|
4
|
+
const SampleSchema = z.object({
|
|
5
|
+
channelKey: z.string(),
|
|
6
|
+
timeStamp: z.number(),
|
|
7
|
+
value: z.unknown(),
|
|
8
|
+
});
|
|
9
|
+
ENCODERS.forEach((encoder) => {
|
|
10
|
+
test(`encoder ${encoder.contentType}`, (t) => {
|
|
11
|
+
const sample = {
|
|
12
|
+
channelKey: 'test',
|
|
13
|
+
timeStamp: 123,
|
|
14
|
+
value: new Uint8Array([1, 2, 3]),
|
|
15
|
+
};
|
|
16
|
+
const encoded = encoder.encode(sample);
|
|
17
|
+
const decoded = encoder.decode(encoded, SampleSchema);
|
|
18
|
+
t.deepEqual(decoded, decoded);
|
|
19
|
+
});
|
|
20
|
+
});
|
|
21
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZW5jb2Rlci5zcGVjLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL2xpYi9lbmNvZGVyLnNwZWMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxJQUFJLE1BQU0sS0FBSyxDQUFDO0FBQ3ZCLE9BQU8sRUFBRSxDQUFDLEVBQUUsTUFBTSxLQUFLLENBQUM7QUFFeEIsT0FBTyxFQUFFLFFBQVEsRUFBRSxNQUFNLFdBQVcsQ0FBQztBQUVyQyxNQUFNLFlBQVksR0FBRyxDQUFDLENBQUMsTUFBTSxDQUFDO0lBQzVCLFVBQVUsRUFBRSxDQUFDLENBQUMsTUFBTSxFQUFFO0lBQ3RCLFNBQVMsRUFBRSxDQUFDLENBQUMsTUFBTSxFQUFFO0lBQ3JCLEtBQUssRUFBRSxDQUFDLENBQUMsT0FBTyxFQUFFO0NBQ25CLENBQUMsQ0FBQztBQUVILFFBQVEsQ0FBQyxPQUFPLENBQUMsQ0FBQyxPQUFPLEVBQUUsRUFBRTtJQUMzQixJQUFJLENBQUMsV0FBVyxPQUFPLENBQUMsV0FBVyxFQUFFLEVBQUUsQ0FBQyxDQUFDLEVBQUUsRUFBRTtRQUMzQyxNQUFNLE1BQU0sR0FBRztZQUNiLFVBQVUsRUFBRSxNQUFNO1lBQ2xCLFNBQVMsRUFBRSxHQUFHO1lBQ2QsS0FBSyxFQUFFLElBQUksVUFBVSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQztTQUNqQyxDQUFDO1FBQ0YsTUFBTSxPQUFPLEdBQUcsT0FBTyxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsQ0FBQztRQUN2QyxNQUFNLE9BQU8sR0FBRyxPQUFPLENBQUMsTUFBTSxDQUFDLE9BQU8sRUFBRSxZQUFZLENBQUMsQ0FBQztRQUN0RCxDQUFDLENBQUMsU0FBUyxDQUFDLE9BQU8sRUFBRSxPQUFPLENBQUMsQ0FBQztJQUNoQyxDQUFDLENBQUMsQ0FBQztBQUNMLENBQUMsQ0FBQyxDQUFDIn0=
|
|
@@ -0,0 +1,77 @@
|
|
|
1
|
+
import { z } from 'zod';
|
|
2
|
+
export interface TypedError extends Error {
|
|
3
|
+
discriminator: 'FreighterError';
|
|
4
|
+
/**
|
|
5
|
+
* @description Returns a unique type identifier for the error. Freighter uses this to
|
|
6
|
+
* determine the correct decoder to use on the other end of the freighter.
|
|
7
|
+
*/
|
|
8
|
+
type: string;
|
|
9
|
+
}
|
|
10
|
+
export declare class BaseTypedError extends Error implements TypedError {
|
|
11
|
+
discriminator: 'FreighterError';
|
|
12
|
+
type: string;
|
|
13
|
+
constructor(message: string, type: string);
|
|
14
|
+
}
|
|
15
|
+
declare type ErrorDecoder = (encoded: string) => Error | undefined;
|
|
16
|
+
declare type ErrorEncoder = (error: TypedError) => string;
|
|
17
|
+
export declare const isTypedError: (error: unknown) => error is TypedError;
|
|
18
|
+
export declare const assertErrorType: <T>(type: string, error?: Error) => T;
|
|
19
|
+
export declare const UNKNOWN = "unknown";
|
|
20
|
+
export declare const NONE = "nil";
|
|
21
|
+
export declare const FREIGHTER = "freighter";
|
|
22
|
+
export declare const ErrorPayloadSchema: z.ZodObject<{
|
|
23
|
+
type: z.ZodString;
|
|
24
|
+
data: z.ZodString;
|
|
25
|
+
}, "strip", z.ZodTypeAny, {
|
|
26
|
+
type: string;
|
|
27
|
+
data: string;
|
|
28
|
+
}, {
|
|
29
|
+
type: string;
|
|
30
|
+
data: string;
|
|
31
|
+
}>;
|
|
32
|
+
export declare type ErrorPayload = z.infer<typeof ErrorPayloadSchema>;
|
|
33
|
+
/**
|
|
34
|
+
* Registers a custom error type with the error registry, which allows it to be
|
|
35
|
+
* encoded/decoded and sent over the network.
|
|
36
|
+
*
|
|
37
|
+
* @param type - A unique string identifier for the error type.
|
|
38
|
+
* @param encode - A function that encodes the error into a string.
|
|
39
|
+
* @param decode - A function that decodes the error from a string.
|
|
40
|
+
*/
|
|
41
|
+
export declare const registerError: ({ type, encode, decode, }: {
|
|
42
|
+
type: string;
|
|
43
|
+
encode: ErrorEncoder;
|
|
44
|
+
decode: ErrorDecoder;
|
|
45
|
+
}) => void;
|
|
46
|
+
/**
|
|
47
|
+
* Encodes an error into a payload that can be sent between a freighter server
|
|
48
|
+
* and client.
|
|
49
|
+
* @param error - The error to encode.
|
|
50
|
+
* @returns The encoded error.
|
|
51
|
+
*/
|
|
52
|
+
export declare const encodeError: (error: unknown) => ErrorPayload;
|
|
53
|
+
/**
|
|
54
|
+
* Decodes an error payload into an exception. If a custom decoder can be found
|
|
55
|
+
* for the error type, it will be used. Otherwise, a generic Error containing
|
|
56
|
+
* the error data is returned.
|
|
57
|
+
*
|
|
58
|
+
* @param payload - The encoded error payload.
|
|
59
|
+
* @returns The decoded error.
|
|
60
|
+
*/
|
|
61
|
+
export declare const decodeError: (payload: ErrorPayload) => Error | undefined;
|
|
62
|
+
export declare class UnknownError extends BaseTypedError implements TypedError {
|
|
63
|
+
constructor(message: string);
|
|
64
|
+
}
|
|
65
|
+
/** Thrown/returned when a stream closed normally. */
|
|
66
|
+
export declare class EOF extends BaseTypedError implements TypedError {
|
|
67
|
+
constructor();
|
|
68
|
+
}
|
|
69
|
+
/** Thrown/returned when a stream is closed abnormally. */
|
|
70
|
+
export declare class StreamClosed extends BaseTypedError implements TypedError {
|
|
71
|
+
constructor();
|
|
72
|
+
}
|
|
73
|
+
/** Thrown when a target is unreachable. */
|
|
74
|
+
export declare class Unreachable extends BaseTypedError implements TypedError {
|
|
75
|
+
constructor();
|
|
76
|
+
}
|
|
77
|
+
export {};
|
|
@@ -0,0 +1,160 @@
|
|
|
1
|
+
import { z } from 'zod';
|
|
2
|
+
export class BaseTypedError extends Error {
|
|
3
|
+
discriminator = 'FreighterError';
|
|
4
|
+
type;
|
|
5
|
+
constructor(message, type) {
|
|
6
|
+
super(message);
|
|
7
|
+
this.type = type;
|
|
8
|
+
}
|
|
9
|
+
}
|
|
10
|
+
export const isTypedError = (error) => {
|
|
11
|
+
if (!error || typeof error !== 'object') {
|
|
12
|
+
return false;
|
|
13
|
+
}
|
|
14
|
+
const typedError = error;
|
|
15
|
+
if (typedError.discriminator !== 'FreighterError') {
|
|
16
|
+
return false;
|
|
17
|
+
}
|
|
18
|
+
if (!('type' in typedError)) {
|
|
19
|
+
throw new Error(`Freighter error is missing its type property: ${typedError}`);
|
|
20
|
+
}
|
|
21
|
+
return true;
|
|
22
|
+
};
|
|
23
|
+
export const assertErrorType = (type, error) => {
|
|
24
|
+
if (!error) {
|
|
25
|
+
throw new Error(`Expected error of type ${type} but got nothing instead`);
|
|
26
|
+
}
|
|
27
|
+
if (!isTypedError(error)) {
|
|
28
|
+
throw new Error(`Expected a typed error, got: ${error}`);
|
|
29
|
+
}
|
|
30
|
+
if (error.type !== type) {
|
|
31
|
+
throw new Error(`Expected error of type ${type}, got ${error.type}: ${error}`);
|
|
32
|
+
}
|
|
33
|
+
return error;
|
|
34
|
+
};
|
|
35
|
+
export const UNKNOWN = 'unknown';
|
|
36
|
+
export const NONE = 'nil';
|
|
37
|
+
export const FREIGHTER = 'freighter';
|
|
38
|
+
export const ErrorPayloadSchema = z.object({
|
|
39
|
+
type: z.string(),
|
|
40
|
+
data: z.string(),
|
|
41
|
+
});
|
|
42
|
+
class Registry {
|
|
43
|
+
entries;
|
|
44
|
+
constructor() {
|
|
45
|
+
this.entries = {};
|
|
46
|
+
}
|
|
47
|
+
register(_type, provider) {
|
|
48
|
+
if (this.entries[_type]) {
|
|
49
|
+
throw new Error(`Error type ${_type} is already registered`);
|
|
50
|
+
}
|
|
51
|
+
this.entries[_type] = provider;
|
|
52
|
+
}
|
|
53
|
+
encode(error) {
|
|
54
|
+
if (!error) {
|
|
55
|
+
return { type: NONE, data: '' };
|
|
56
|
+
}
|
|
57
|
+
if (isTypedError(error) && this.entries[error.type]) {
|
|
58
|
+
return { type: error.type, data: this.entries[error.type].encode(error) };
|
|
59
|
+
}
|
|
60
|
+
return { type: UNKNOWN, data: JSON.stringify(error) };
|
|
61
|
+
}
|
|
62
|
+
decode(payload) {
|
|
63
|
+
if (payload.type === NONE) {
|
|
64
|
+
return undefined;
|
|
65
|
+
}
|
|
66
|
+
if (payload.type === UNKNOWN) {
|
|
67
|
+
return new UnknownError(payload.data);
|
|
68
|
+
}
|
|
69
|
+
const provider = this.entries[payload.type];
|
|
70
|
+
if (!provider) {
|
|
71
|
+
return new UnknownError(payload.data);
|
|
72
|
+
}
|
|
73
|
+
return provider.decode(payload.data);
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
const REGISTRY = new Registry();
|
|
77
|
+
/**
|
|
78
|
+
* Registers a custom error type with the error registry, which allows it to be
|
|
79
|
+
* encoded/decoded and sent over the network.
|
|
80
|
+
*
|
|
81
|
+
* @param type - A unique string identifier for the error type.
|
|
82
|
+
* @param encode - A function that encodes the error into a string.
|
|
83
|
+
* @param decode - A function that decodes the error from a string.
|
|
84
|
+
*/
|
|
85
|
+
export const registerError = ({ type, encode, decode, }) => {
|
|
86
|
+
REGISTRY.register(type, { encode, decode });
|
|
87
|
+
};
|
|
88
|
+
/**
|
|
89
|
+
* Encodes an error into a payload that can be sent between a freighter server
|
|
90
|
+
* and client.
|
|
91
|
+
* @param error - The error to encode.
|
|
92
|
+
* @returns The encoded error.
|
|
93
|
+
*/
|
|
94
|
+
export const encodeError = (error) => {
|
|
95
|
+
return REGISTRY.encode(error);
|
|
96
|
+
};
|
|
97
|
+
/**
|
|
98
|
+
* Decodes an error payload into an exception. If a custom decoder can be found
|
|
99
|
+
* for the error type, it will be used. Otherwise, a generic Error containing
|
|
100
|
+
* the error data is returned.
|
|
101
|
+
*
|
|
102
|
+
* @param payload - The encoded error payload.
|
|
103
|
+
* @returns The decoded error.
|
|
104
|
+
*/
|
|
105
|
+
export const decodeError = (payload) => {
|
|
106
|
+
return REGISTRY.decode(payload);
|
|
107
|
+
};
|
|
108
|
+
export class UnknownError extends BaseTypedError {
|
|
109
|
+
constructor(message) {
|
|
110
|
+
super(message, UNKNOWN);
|
|
111
|
+
}
|
|
112
|
+
}
|
|
113
|
+
/** Thrown/returned when a stream closed normally. */
|
|
114
|
+
export class EOF extends BaseTypedError {
|
|
115
|
+
constructor() {
|
|
116
|
+
super('EOF', FREIGHTER);
|
|
117
|
+
}
|
|
118
|
+
}
|
|
119
|
+
/** Thrown/returned when a stream is closed abnormally. */
|
|
120
|
+
export class StreamClosed extends BaseTypedError {
|
|
121
|
+
constructor() {
|
|
122
|
+
super('StreamClosed', FREIGHTER);
|
|
123
|
+
}
|
|
124
|
+
}
|
|
125
|
+
/** Thrown when a target is unreachable. */
|
|
126
|
+
export class Unreachable extends BaseTypedError {
|
|
127
|
+
constructor() {
|
|
128
|
+
super('Unreachable', FREIGHTER);
|
|
129
|
+
}
|
|
130
|
+
}
|
|
131
|
+
const freighterErrorEncoder = (error) => {
|
|
132
|
+
if (error instanceof EOF) {
|
|
133
|
+
return 'EOF';
|
|
134
|
+
}
|
|
135
|
+
if (error instanceof StreamClosed) {
|
|
136
|
+
return 'StreamClosed';
|
|
137
|
+
}
|
|
138
|
+
if (error instanceof Unreachable) {
|
|
139
|
+
return 'Unreachable';
|
|
140
|
+
}
|
|
141
|
+
throw new Error(`Unknown error type: ${error}`);
|
|
142
|
+
};
|
|
143
|
+
const freighterErrorDecoder = (encoded) => {
|
|
144
|
+
switch (encoded) {
|
|
145
|
+
case 'EOF':
|
|
146
|
+
return new EOF();
|
|
147
|
+
case 'StreamClosed':
|
|
148
|
+
return new StreamClosed();
|
|
149
|
+
case 'Unreachable':
|
|
150
|
+
return new Unreachable();
|
|
151
|
+
default:
|
|
152
|
+
throw new Error(`Unknown error type: ${encoded}`);
|
|
153
|
+
}
|
|
154
|
+
};
|
|
155
|
+
registerError({
|
|
156
|
+
type: FREIGHTER,
|
|
157
|
+
encode: freighterErrorEncoder,
|
|
158
|
+
decode: freighterErrorDecoder,
|
|
159
|
+
});
|
|
160
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZXJyb3JzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL2xpYi9lcnJvcnMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLENBQUMsRUFBRSxNQUFNLEtBQUssQ0FBQztBQVd4QixNQUFNLE9BQU8sY0FBZSxTQUFRLEtBQUs7SUFDdkMsYUFBYSxHQUFxQixnQkFBZ0IsQ0FBQztJQUNuRCxJQUFJLENBQVM7SUFFYixZQUFZLE9BQWUsRUFBRSxJQUFZO1FBQ3ZDLEtBQUssQ0FBQyxPQUFPLENBQUMsQ0FBQztRQUNmLElBQUksQ0FBQyxJQUFJLEdBQUcsSUFBSSxDQUFDO0lBQ25CLENBQUM7Q0FDRjtBQUtELE1BQU0sQ0FBQyxNQUFNLFlBQVksR0FBRyxDQUFDLEtBQWMsRUFBdUIsRUFBRTtJQUNsRSxJQUFJLENBQUMsS0FBSyxJQUFJLE9BQU8sS0FBSyxLQUFLLFFBQVEsRUFBRTtRQUN2QyxPQUFPLEtBQUssQ0FBQztLQUNkO0lBQ0QsTUFBTSxVQUFVLEdBQUcsS0FBbUIsQ0FBQztJQUN2QyxJQUFJLFVBQVUsQ0FBQyxhQUFhLEtBQUssZ0JBQWdCLEVBQUU7UUFDakQsT0FBTyxLQUFLLENBQUM7S0FDZDtJQUNELElBQUksQ0FBQyxDQUFDLE1BQU0sSUFBSSxVQUFVLENBQUMsRUFBRTtRQUMzQixNQUFNLElBQUksS0FBSyxDQUNiLGlEQUFpRCxVQUFVLEVBQUUsQ0FDOUQsQ0FBQztLQUNIO0lBQ0QsT0FBTyxJQUFJLENBQUM7QUFDZCxDQUFDLENBQUM7QUFFRixNQUFNLENBQUMsTUFBTSxlQUFlLEdBQUcsQ0FBSSxJQUFZLEVBQUUsS0FBYSxFQUFLLEVBQUU7SUFDbkUsSUFBSSxDQUFDLEtBQUssRUFBRTtRQUNWLE1BQU0sSUFBSSxLQUFLLENBQUMsMEJBQTBCLElBQUksMEJBQTBCLENBQUMsQ0FBQztLQUMzRTtJQUNELElBQUksQ0FBQyxZQUFZLENBQUMsS0FBSyxDQUFDLEVBQUU7UUFDeEIsTUFBTSxJ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
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1,71 @@
|
|
|
1
|
+
import test from 'ava';
|
|
2
|
+
import { assertErrorType, BaseTypedError, decodeError, encodeError, EOF, FREIGHTER, isTypedError, NONE, registerError, StreamClosed, UNKNOWN, UnknownError, Unreachable, } from './errors';
|
|
3
|
+
class MyCustomError extends BaseTypedError {
|
|
4
|
+
constructor(message) {
|
|
5
|
+
super(message, 'MyCustomError');
|
|
6
|
+
}
|
|
7
|
+
}
|
|
8
|
+
const myCustomErrorEncoder = (error) => {
|
|
9
|
+
return error.message;
|
|
10
|
+
};
|
|
11
|
+
const myCustomErrorDecoder = (encoded) => {
|
|
12
|
+
return new MyCustomError(encoded);
|
|
13
|
+
};
|
|
14
|
+
test('isTypedError', (t) => {
|
|
15
|
+
const error = new MyCustomError('test');
|
|
16
|
+
const fError = isTypedError(error);
|
|
17
|
+
t.is(fError, true);
|
|
18
|
+
t.is(error.type, 'MyCustomError');
|
|
19
|
+
});
|
|
20
|
+
test('encoding and decoding a custom error through registry', (t) => {
|
|
21
|
+
registerError({
|
|
22
|
+
type: 'MyCustomError',
|
|
23
|
+
encode: myCustomErrorEncoder,
|
|
24
|
+
decode: myCustomErrorDecoder,
|
|
25
|
+
});
|
|
26
|
+
const error = new MyCustomError('test');
|
|
27
|
+
const encoded = encodeError(error);
|
|
28
|
+
t.is(encoded.type, 'MyCustomError');
|
|
29
|
+
t.is(encoded.data, 'test');
|
|
30
|
+
const decoded = assertErrorType('MyCustomError', decodeError(encoded));
|
|
31
|
+
t.is(decoded.message, 'test');
|
|
32
|
+
});
|
|
33
|
+
test('encoding and decoding a null error', (t) => {
|
|
34
|
+
const encoded = encodeError(null);
|
|
35
|
+
t.is(encoded.type, NONE);
|
|
36
|
+
t.is(encoded.data, '');
|
|
37
|
+
const decoded = decodeError(encoded);
|
|
38
|
+
t.is(decoded, undefined);
|
|
39
|
+
});
|
|
40
|
+
test('encoding and decoding an unrecognized error', (t) => {
|
|
41
|
+
const error = new Error('test');
|
|
42
|
+
const encoded = encodeError(error);
|
|
43
|
+
t.is(encoded.type, UNKNOWN);
|
|
44
|
+
t.is(encoded.data, '{}');
|
|
45
|
+
const decoded = decodeError(encoded);
|
|
46
|
+
t.deepEqual(decoded, new UnknownError('{}'));
|
|
47
|
+
});
|
|
48
|
+
test('registering duplicate error should throw', (t) => {
|
|
49
|
+
registerError({
|
|
50
|
+
type: 'MyDuplicateError',
|
|
51
|
+
encode: myCustomErrorEncoder,
|
|
52
|
+
decode: myCustomErrorDecoder,
|
|
53
|
+
});
|
|
54
|
+
t.throws(() => {
|
|
55
|
+
registerError({
|
|
56
|
+
type: 'MyDuplicateError',
|
|
57
|
+
encode: myCustomErrorEncoder,
|
|
58
|
+
decode: myCustomErrorDecoder,
|
|
59
|
+
});
|
|
60
|
+
});
|
|
61
|
+
});
|
|
62
|
+
test('encoding and decoding freighter errors', (t) => {
|
|
63
|
+
[new EOF(), new StreamClosed(), new Unreachable()].forEach((error) => {
|
|
64
|
+
const encoded = encodeError(error);
|
|
65
|
+
t.is(encoded.type, FREIGHTER);
|
|
66
|
+
t.is(encoded.data, error.message);
|
|
67
|
+
const decoded = decodeError(encoded);
|
|
68
|
+
t.deepEqual(decoded, error);
|
|
69
|
+
});
|
|
70
|
+
});
|
|
71
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZXJyb3JzLnNwZWMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvbGliL2Vycm9ycy5zcGVjLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sSUFBSSxNQUFNLEtBQUssQ0FBQztBQUV2QixPQUFPLEVBQ0wsZUFBZSxFQUNmLGNBQWMsRUFDZCxXQUFXLEVBQ1gsV0FBVyxFQUNYLEdBQUcsRUFDSCxTQUFTLEVBQ1QsWUFBWSxFQUNaLElBQUksRUFDSixhQUFhLEVBQ2IsWUFBWSxFQUVaLE9BQU8sRUFDUCxZQUFZLEVBQ1osV0FBVyxHQUNaLE1BQU0sVUFBVSxDQUFDO0FBRWxCLE1BQU0sYUFBYyxTQUFRLGNBQWM7SUFDeEMsWUFBWSxPQUFlO1FBQ3pCLEtBQUssQ0FBQyxPQUFPLEVBQUUsZUFBZSxDQUFDLENBQUM7SUFDbEMsQ0FBQztDQUNGO0FBRUQsTUFBTSxvQkFBb0IsR0FBRyxDQUFDLEtBQW9CLEVBQVUsRUFBRTtJQUM1RCxPQUFPLEtBQUssQ0FBQyxPQUFPLENBQUM7QUFDdkIsQ0FBQyxDQUFDO0FBRUYsTUFBTSxvQkFBb0IsR0FBRyxDQUFDLE9BQWUsRUFBYyxFQUFFO0lBQzNELE9BQU8sSUFBSSxhQUFhLENBQUMsT0FBTyxDQUFDLENBQUM7QUFDcEMsQ0FBQyxDQUFDO0FBRUYsSUFBSSxDQUFDLGNBQWMsRUFBRSxDQUFDLENBQUMsRUFBRSxFQUFFO0lBQ3pCLE1BQU0sS0FBSyxHQUFHLElBQUksYUFBYSxDQUFDLE1BQU0sQ0FBQyxDQUFDO0lBQ3hDLE1BQU0sTUFBTSxHQUFHLFlBQVksQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUNuQyxDQUFDLENBQUMsRUFBRSxDQUFDLE1BQU0sRUFBRSxJQUFJLENBQUMsQ0FBQztJQUNuQixDQUFDLENBQUMsRUFBRSxDQUFDLEtBQUssQ0FBQyxJQUFJLEVBQUUsZUFBZSxDQUFDLENBQUM7QUFDcEMsQ0FBQyxDQUFDLENBQUM7QUFFSCxJQUFJLENBQUMsdURBQXVELEVBQUUsQ0FBQyxDQUFDLEVBQUUsRUFBRTtJQUNsRSxhQUFhLENBQUM7UUFDWixJQUFJLEVBQUUsZUFBZTtRQUNyQixNQUFNLEVBQUUsb0JBQW9CO1FBQzVCLE1BQU0sRUFBRSxvQkFBb0I7S0FDN0IsQ0FBQyxDQUFDO0lBQ0gsTUFBTSxLQUFLLEdBQUcsSUFBSSxhQUFhLENBQUMsTUFBTSxDQUFDLENBQUM7SUFDeEMsTUFBTSxPQUFPLEdBQUcsV0FBVyxDQUFDLEtBQUssQ0FBQyxDQUFDO0lBQ25DLENBQUMsQ0FBQyxFQUFFLENBQUMsT0FBTyxDQUFDLElBQUksRUFBRSxlQUFlLENBQUMsQ0FBQztJQUNwQyxDQUFDLENBQUMsRUFBRSxDQUFDLE9BQU8sQ0FBQyxJQUFJLEVBQUUsTUFBTSxDQUFDLENBQUM7SUFDM0IsTUFBTSxPQUFPLEdBQUcsZUFBZSxDQUM3QixlQUFlLEVBQ2YsV0FBVyxDQUFDLE9BQU8sQ0FBQyxDQUNyQixDQUFDO0lBQ0YsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxPQUFPLENBQUMsT0FBTyxFQUFFLE1BQU0sQ0FBQyxDQUFDO0FBQ2hDLENBQUMsQ0FBQyxDQUFDO0FBRUgsSUFBSSxDQUFDLG9DQUFvQyxFQUFFLENBQUMsQ0FBQyxFQUFFLEVBQUU7SUFDL0MsTUFBTSxPQUFPLEdBQUcsV0FBVyxDQUFDLElBQUksQ0FBQyxDQUFDO0lBQ2xDLENBQUMsQ0FBQyxFQUFFLENBQUMsT0FBTyxDQUFDLElBQUksRUFBRSxJQUFJLENBQUMsQ0FBQztJQUN6QixDQUFDLENBQUMsRUFBRSxDQUFDLE9BQU8sQ0FBQyxJQUFJLEVBQUUsRUFBRSxDQUFDLENBQUM7SUFDdkIsTUFBTSxPQUFPLEdBQUcsV0FBVyxDQUFDLE9BQU8sQ0FBQyxDQUFDO0lBQ3JDLENBQUMsQ0FBQyxFQUFFLENBQUMsT0FBTyxFQUFFLFNBQVMsQ0FBQyxDQUFDO0FBQzNCLENBQUMsQ0FBQyxDQUFDO0FBRUgsSUFBSSxDQUFDLDZDQUE2QyxFQUFFLENBQUMsQ0FBQyxFQUFFLEVBQUU7SUFDeEQsTUFBTSxLQUFLLEdBQUcsSUFBSSxLQUFLLENBQUMsTUFBTSxDQUFDLENBQUM7SUFDaEMsTUFBTSxPQUFPLEdBQUcsV0FBVyxDQUFDLEtBQUssQ0FBQyxDQUFDO0lBQ25DLENBQUMsQ0FBQyxFQUFFLENBQUMsT0FBTyxDQUFDLElBQUksRUFBRSxPQUFPLENBQUMsQ0FBQztJQUM1QixDQUFDLENBQUMsRUFBRSxDQUFDLE9BQU8sQ0FBQyxJQUFJLEVBQUUsSUFBSSxDQUFDLENBQUM7SUFDekIsTUFBTSxPQUFPLEdBQUcsV0FBVyxDQUFDLE9BQU8sQ0FBQyxDQUFDO0lBQ3JDLENBQUMsQ0FBQyxTQUFTLENBQUMsT0FBTyxFQUFFLElBQUksWUFBWSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUM7QUFDL0MsQ0FBQyxDQUFDLENBQUM7QUFFSCxJQUFJLENBQUMsMENBQTBDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsRUFBRTtJQUNyRCxhQUFhLENBQUM7UUFDWixJQUFJLEVBQUUsa0JBQWtCO1FBQ3hCLE1BQU0sRUFBRSxvQkFBb0I7UUFDNUIsTUFBTSxFQUFFLG9CQUFvQjtLQUM3QixDQUFDLENBQUM7SUFDSCxDQUFDLENBQUMsTUFBTSxDQUFDLEdBQUcsRUFBRTtRQUNaLGFBQWEsQ0FBQztZQUNaLElBQUksRUFBRSxrQkFBa0I7WUFDeEIsTUFBTSxFQUFFLG9CQUFvQjtZQUM1QixNQUFNLEVBQUUsb0JBQW9CO1NBQzdCLENBQUMsQ0FBQztJQUNMLENBQUMsQ0FBQyxDQUFDO0FBQ0wsQ0FBQyxDQUFDLENBQUM7QUFFSCxJQUFJLENBQUMsd0NBQXdDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsRUFBRTtJQUNuRCxDQUFDLElBQUksR0FBRyxFQUFFLEVBQUUsSUFBSSxZQUFZLEVBQUUsRUFBRSxJQUFJLFdBQVcsRUFBRSxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsS0FBSyxFQUFFLEVBQUU7UUFDbkUsTUFBTSxPQUFPLEdBQUcsV0FBVyxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQ25DLENBQUMsQ0FBQyxFQUFFLENBQUMsT0FBTyxDQUFDLElBQUksRUFBRSxTQUFTLENBQUMsQ0FBQztRQUM5QixDQUFDLENBQUMsRUFBRSxDQUFDLE9BQU8sQ0FBQyxJQUFJLEVBQUUsS0FBSyxDQUFDLE9BQU8sQ0FBQyxDQUFDO1FBQ2xDLE1BQU0sT0FBTyxHQUFHLFdBQVcsQ0FBQyxPQUFPLENBQUMsQ0FBQztRQUNyQyxDQUFDLENBQUMsU0FBUyxDQUFDLE9BQU8sRUFBRSxLQUFLLENBQUMsQ0FBQztJQUM5QixDQUFDLENBQUMsQ0FBQztBQUNMLENBQUMsQ0FBQyxDQUFDIn0=
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
import { AxiosRequestConfig } from 'axios';
|
|
2
|
+
import { ZodSchema } from 'zod';
|
|
3
|
+
import { EncoderDecoder } from './encoder';
|
|
4
|
+
import { UnaryClient } from './unary';
|
|
5
|
+
import URL from './url';
|
|
6
|
+
/**
|
|
7
|
+
* HTTPClientFactory provides a POST and GET implementation of the Unary protocol.
|
|
8
|
+
*
|
|
9
|
+
* @param url - The base URL of the API.
|
|
10
|
+
* @param encoder - The encoder/decoder to use for the request/response.
|
|
11
|
+
*/
|
|
12
|
+
export declare class HTTPClientFactory {
|
|
13
|
+
endpoint: URL;
|
|
14
|
+
encoder: EncoderDecoder;
|
|
15
|
+
constructor(endpoint: URL, encoder: EncoderDecoder);
|
|
16
|
+
getClient(): GETClient;
|
|
17
|
+
postClient(): POSTClient;
|
|
18
|
+
}
|
|
19
|
+
declare class Core {
|
|
20
|
+
endpoint: URL;
|
|
21
|
+
encoder: EncoderDecoder;
|
|
22
|
+
private static ERROR_ENCODING_HEADER_KEY;
|
|
23
|
+
private static ERROR_ENCODING_HEADER_VALUE;
|
|
24
|
+
private static CONTENT_TYPE_HEADER_KEY;
|
|
25
|
+
constructor(endpoint: URL, encoder: EncoderDecoder);
|
|
26
|
+
get headers(): {
|
|
27
|
+
[x: string]: string;
|
|
28
|
+
};
|
|
29
|
+
requestConfig(): AxiosRequestConfig;
|
|
30
|
+
execute<RS>(request: AxiosRequestConfig, resSchema: ZodSchema<RS>): Promise<[RS | undefined, Error | undefined]>;
|
|
31
|
+
}
|
|
32
|
+
/**
|
|
33
|
+
* Implementation of the UnaryClient protocol backed by HTTP GET requests. It
|
|
34
|
+
* should not be instantiated directly, but through the HTTPClientFactory.
|
|
35
|
+
*/
|
|
36
|
+
export declare class GETClient extends Core implements UnaryClient {
|
|
37
|
+
send<RQ, RS>(target: string, req: RQ, resSchema: ZodSchema<RS>): Promise<[RS | undefined, Error | undefined]>;
|
|
38
|
+
}
|
|
39
|
+
/**
|
|
40
|
+
* Implementation of the UnaryClient protocol backed by HTTP POST requests. It
|
|
41
|
+
* should not be instantiated directly, but through the HTTPClientFactory.
|
|
42
|
+
*/
|
|
43
|
+
export declare class POSTClient extends Core implements UnaryClient {
|
|
44
|
+
send<RQ, RS>(target: string, req: RQ, resSchema: ZodSchema<RS>): Promise<[RS | undefined, Error | undefined]>;
|
|
45
|
+
}
|
|
46
|
+
export {};
|