@synnaxlabs/freighter 0.2.0 → 0.4.1
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/.eslintrc.cjs +18 -0
- package/LICENSE +4 -21
- package/dist/alamos.d.ts +3 -0
- package/{build/module/lib → dist}/errors.d.ts +35 -40
- package/dist/freighter.cjs.js +11828 -0
- package/dist/freighter.cjs.js.map +1 -0
- package/dist/freighter.es.js +11828 -0
- package/dist/freighter.es.js.map +1 -0
- package/dist/http.d.ts +20 -0
- package/dist/index.d.ts +8 -0
- package/{build/module/lib → dist}/middleware.d.ts +11 -8
- package/{build/main/lib → dist}/stream.d.ts +11 -11
- package/{build/main/lib → dist}/transport.d.ts +2 -2
- package/dist/unary.d.ts +16 -0
- package/dist/websocket.d.ts +24 -0
- package/package.json +30 -98
- package/src/alamos.ts +40 -0
- package/src/errors.spec.ts +94 -0
- package/src/errors.ts +205 -0
- package/src/http.spec.ts +67 -0
- package/src/http.ts +115 -0
- package/src/index.ts +21 -20
- package/src/{lib/middleware.ts → middleware.ts} +29 -19
- package/src/{lib/stream.ts → stream.ts} +23 -14
- package/src/transport.ts +23 -0
- package/src/unary.ts +44 -0
- package/src/websocket.spec.ts +119 -0
- package/src/websocket.ts +203 -0
- package/tsconfig.json +5 -42
- package/tsconfig.vite.json +4 -0
- package/vite.config.ts +16 -0
- package/.editorconfig +0 -15
- package/.eslintrc.json +0 -33
- package/.gitignore +0 -9
- package/.nyc_output/3238f10e-9572-49ec-ab9d-28cbcaa6152a.json +0 -1
- package/.nyc_output/4e78a5c9-c0ca-4664-aa04-f478522608eb.json +0 -1
- package/.nyc_output/6a2244f2-5aea-45c7-8eeb-e14b454f0096.json +0 -1
- package/.nyc_output/dd1075a0-827b-4154-a75e-9bc90a4e16d0.json +0 -1
- package/.nyc_output/f829ad27-9bcd-4604-ae57-aae8c6f28d51.json +0 -1
- package/.nyc_output/fabc60f1-8fc5-4a1e-bea0-dc1fbcc31c9c.json +0 -1
- package/.nyc_output/processinfo/3238f10e-9572-49ec-ab9d-28cbcaa6152a.json +0 -1
- package/.nyc_output/processinfo/4e78a5c9-c0ca-4664-aa04-f478522608eb.json +0 -1
- package/.nyc_output/processinfo/6a2244f2-5aea-45c7-8eeb-e14b454f0096.json +0 -1
- package/.nyc_output/processinfo/dd1075a0-827b-4154-a75e-9bc90a4e16d0.json +0 -1
- package/.nyc_output/processinfo/f829ad27-9bcd-4604-ae57-aae8c6f28d51.json +0 -1
- package/.nyc_output/processinfo/fabc60f1-8fc5-4a1e-bea0-dc1fbcc31c9c.json +0 -1
- package/.nyc_output/processinfo/index.json +0 -1
- package/.prettierignore +0 -2
- package/.prettierrc +0 -3
- package/.vscode/settings.json +0 -4
- package/build/main/index.d.ts +0 -9
- package/build/main/index.js +0 -29
- package/build/main/lib/caseconv.d.ts +0 -2
- package/build/main/lib/caseconv.js +0 -14
- package/build/main/lib/encoder.d.ts +0 -59
- package/build/main/lib/encoder.js +0 -57
- package/build/main/lib/encoder.spec.d.ts +0 -1
- package/build/main/lib/encoder.spec.js +0 -26
- package/build/main/lib/errors.d.ts +0 -87
- package/build/main/lib/errors.js +0 -189
- package/build/main/lib/errors.spec.js +0 -88
- package/build/main/lib/http.d.ts +0 -50
- package/build/main/lib/http.js +0 -114
- package/build/main/lib/http.spec.js +0 -59
- package/build/main/lib/middleware.d.ts +0 -45
- package/build/main/lib/middleware.js +0 -38
- package/build/main/lib/runtime.d.ts +0 -5
- package/build/main/lib/runtime.js +0 -24
- package/build/main/lib/stream.js +0 -3
- package/build/main/lib/transport.js +0 -3
- package/build/main/lib/unary.d.ts +0 -15
- package/build/main/lib/unary.js +0 -3
- package/build/main/lib/url.d.ts +0 -38
- package/build/main/lib/url.js +0 -65
- package/build/main/lib/url.spec.d.ts +0 -1
- package/build/main/lib/url.spec.js +0 -41
- package/build/main/lib/util/log.d.ts +0 -2
- package/build/main/lib/util/log.js +0 -15
- package/build/main/lib/websocket.d.ts +0 -25
- package/build/main/lib/websocket.js +0 -172
- package/build/main/lib/websocket.spec.js +0 -86
- package/build/main/lib/ws.spec.d.ts +0 -1
- package/build/main/lib/ws.spec.js +0 -115
- package/build/module/index.d.ts +0 -9
- package/build/module/index.js +0 -7
- package/build/module/lib/caseconv.d.ts +0 -2
- package/build/module/lib/caseconv.js +0 -12
- package/build/module/lib/encoder.d.ts +0 -59
- package/build/module/lib/encoder.js +0 -47
- package/build/module/lib/encoder.spec.d.ts +0 -1
- package/build/module/lib/encoder.spec.js +0 -21
- package/build/module/lib/errors.js +0 -164
- package/build/module/lib/errors.spec.d.ts +0 -1
- package/build/module/lib/errors.spec.js +0 -85
- package/build/module/lib/http.d.ts +0 -50
- package/build/module/lib/http.js +0 -108
- package/build/module/lib/http.spec.d.ts +0 -1
- package/build/module/lib/http.spec.js +0 -54
- package/build/module/lib/middleware.js +0 -32
- package/build/module/lib/runtime.d.ts +0 -5
- package/build/module/lib/runtime.js +0 -21
- package/build/module/lib/stream.d.ts +0 -76
- package/build/module/lib/stream.js +0 -2
- package/build/module/lib/transport.d.ts +0 -13
- package/build/module/lib/transport.js +0 -2
- package/build/module/lib/unary.d.ts +0 -15
- package/build/module/lib/unary.js +0 -2
- package/build/module/lib/url.d.ts +0 -38
- package/build/module/lib/url.js +0 -65
- package/build/module/lib/url.spec.d.ts +0 -1
- package/build/module/lib/url.spec.js +0 -34
- package/build/module/lib/util/log.d.ts +0 -2
- package/build/module/lib/util/log.js +0 -11
- package/build/module/lib/websocket.d.ts +0 -25
- package/build/module/lib/websocket.js +0 -181
- package/build/module/lib/websocket.spec.d.ts +0 -1
- package/build/module/lib/websocket.spec.js +0 -82
- package/build/module/lib/ws.spec.d.ts +0 -1
- package/build/module/lib/ws.spec.js +0 -94
- package/build/tsconfig.module.tsbuildinfo +0 -1
- package/build/tsconfig.tsbuildinfo +0 -1
- package/coverage/base.css +0 -224
- package/coverage/block-navigation.js +0 -87
- package/coverage/caseconv.ts.html +0 -124
- package/coverage/encoder.ts.html +0 -403
- package/coverage/errors.ts.html +0 -727
- package/coverage/favicon.png +0 -0
- package/coverage/http.ts.html +0 -532
- package/coverage/index.html +0 -221
- package/coverage/lcov-report/base.css +0 -224
- package/coverage/lcov-report/block-navigation.js +0 -87
- package/coverage/lcov-report/caseconv.ts.html +0 -124
- package/coverage/lcov-report/encoder.ts.html +0 -403
- package/coverage/lcov-report/errors.ts.html +0 -727
- package/coverage/lcov-report/favicon.png +0 -0
- package/coverage/lcov-report/http.ts.html +0 -532
- package/coverage/lcov-report/index.html +0 -221
- package/coverage/lcov-report/middleware.ts.html +0 -286
- package/coverage/lcov-report/prettify.css +0 -1
- package/coverage/lcov-report/prettify.js +0 -2
- package/coverage/lcov-report/runtime.ts.html +0 -154
- package/coverage/lcov-report/sort-arrow-sprite.png +0 -0
- package/coverage/lcov-report/sorter.js +0 -196
- package/coverage/lcov-report/url.ts.html +0 -322
- package/coverage/lcov-report/websocket.ts.html +0 -760
- package/coverage/lcov.info +0 -552
- package/coverage/middleware.ts.html +0 -286
- package/coverage/prettify.css +0 -1
- package/coverage/prettify.js +0 -2
- package/coverage/runtime.ts.html +0 -154
- package/coverage/sort-arrow-sprite.png +0 -0
- package/coverage/sorter.js +0 -196
- package/coverage/url.ts.html +0 -322
- package/coverage/websocket.ts.html +0 -760
- package/src/lib/caseconv.ts +0 -13
- package/src/lib/encoder.spec.ts +0 -23
- package/src/lib/encoder.ts +0 -105
- package/src/lib/errors.spec.ts +0 -98
- package/src/lib/errors.ts +0 -214
- package/src/lib/http.spec.ts +0 -85
- package/src/lib/http.ts +0 -149
- package/src/lib/runtime.ts +0 -23
- package/src/lib/transport.ts +0 -14
- package/src/lib/unary.ts +0 -21
- package/src/lib/url.spec.ts +0 -37
- package/src/lib/url.ts +0 -79
- package/src/lib/util/log.ts +0 -12
- package/src/lib/websocket.spec.ts +0 -106
- package/src/lib/websocket.ts +0 -225
- package/src/types/example.d.ts +0 -24
- package/tsconfig.module.json +0 -9
- package/yarn.lock +0 -5878
- /package/{build/main/lib → dist}/errors.spec.d.ts +0 -0
- /package/{build/main/lib → dist}/http.spec.d.ts +0 -0
- /package/{build/main/lib → dist}/websocket.spec.d.ts +0 -0
|
@@ -1,164 +0,0 @@
|
|
|
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(
|
|
20
|
-
`Freighter error is missing its type property: ${typedError}`
|
|
21
|
-
);
|
|
22
|
-
}
|
|
23
|
-
return true;
|
|
24
|
-
};
|
|
25
|
-
export const assertErrorType = (type, error) => {
|
|
26
|
-
if (!error) {
|
|
27
|
-
throw new Error(`Expected error of type ${type} but got nothing instead`);
|
|
28
|
-
}
|
|
29
|
-
if (!isTypedError(error)) {
|
|
30
|
-
throw new Error(`Expected a typed error, got: ${error}`);
|
|
31
|
-
}
|
|
32
|
-
if (error.type !== type) {
|
|
33
|
-
throw new Error(
|
|
34
|
-
`Expected error of type ${type}, got ${error.type}: ${error}`
|
|
35
|
-
);
|
|
36
|
-
}
|
|
37
|
-
return error;
|
|
38
|
-
};
|
|
39
|
-
export const UNKNOWN = 'unknown';
|
|
40
|
-
export const NONE = 'nil';
|
|
41
|
-
export const FREIGHTER = 'freighter';
|
|
42
|
-
export const ErrorPayloadSchema = z.object({
|
|
43
|
-
type: z.string(),
|
|
44
|
-
data: z.string(),
|
|
45
|
-
});
|
|
46
|
-
class Registry {
|
|
47
|
-
entries;
|
|
48
|
-
constructor() {
|
|
49
|
-
this.entries = {};
|
|
50
|
-
}
|
|
51
|
-
register(_type, provider) {
|
|
52
|
-
if (this.entries[_type]) {
|
|
53
|
-
throw new Error(`Error type ${_type} is already registered`);
|
|
54
|
-
}
|
|
55
|
-
this.entries[_type] = provider;
|
|
56
|
-
}
|
|
57
|
-
encode(error) {
|
|
58
|
-
if (!error) {
|
|
59
|
-
return { type: NONE, data: '' };
|
|
60
|
-
}
|
|
61
|
-
if (isTypedError(error) && this.entries[error.type]) {
|
|
62
|
-
return { type: error.type, data: this.entries[error.type].encode(error) };
|
|
63
|
-
}
|
|
64
|
-
return { type: UNKNOWN, data: JSON.stringify(error) };
|
|
65
|
-
}
|
|
66
|
-
decode(payload) {
|
|
67
|
-
if (payload.type === NONE) {
|
|
68
|
-
return undefined;
|
|
69
|
-
}
|
|
70
|
-
if (payload.type === UNKNOWN) {
|
|
71
|
-
return new UnknownError(payload.data);
|
|
72
|
-
}
|
|
73
|
-
const provider = this.entries[payload.type];
|
|
74
|
-
if (!provider) {
|
|
75
|
-
return new UnknownError(payload.data);
|
|
76
|
-
}
|
|
77
|
-
return provider.decode(payload.data);
|
|
78
|
-
}
|
|
79
|
-
}
|
|
80
|
-
const REGISTRY = new Registry();
|
|
81
|
-
/**
|
|
82
|
-
* Registers a custom error type with the error registry, which allows it to be
|
|
83
|
-
* encoded/decoded and sent over the network.
|
|
84
|
-
*
|
|
85
|
-
* @param type - A unique string identifier for the error type.
|
|
86
|
-
* @param encode - A function that encodes the error into a string.
|
|
87
|
-
* @param decode - A function that decodes the error from a string.
|
|
88
|
-
*/
|
|
89
|
-
export const registerError = ({ type, encode, decode }) => {
|
|
90
|
-
REGISTRY.register(type, { encode, decode });
|
|
91
|
-
};
|
|
92
|
-
/**
|
|
93
|
-
* Encodes an error into a payload that can be sent between a freighter server
|
|
94
|
-
* and client.
|
|
95
|
-
* @param error - The error to encode.
|
|
96
|
-
* @returns The encoded error.
|
|
97
|
-
*/
|
|
98
|
-
export const encodeError = (error) => {
|
|
99
|
-
return REGISTRY.encode(error);
|
|
100
|
-
};
|
|
101
|
-
/**
|
|
102
|
-
* Decodes an error payload into an exception. If a custom decoder can be found
|
|
103
|
-
* for the error type, it will be used. Otherwise, a generic Error containing
|
|
104
|
-
* the error data is returned.
|
|
105
|
-
*
|
|
106
|
-
* @param payload - The encoded error payload.
|
|
107
|
-
* @returns The decoded error.
|
|
108
|
-
*/
|
|
109
|
-
export const decodeError = (payload) => {
|
|
110
|
-
return REGISTRY.decode(payload);
|
|
111
|
-
};
|
|
112
|
-
export class UnknownError extends BaseTypedError {
|
|
113
|
-
constructor(message) {
|
|
114
|
-
super(message, UNKNOWN);
|
|
115
|
-
}
|
|
116
|
-
}
|
|
117
|
-
/** Thrown/returned when a stream closed normally. */
|
|
118
|
-
export class EOF extends BaseTypedError {
|
|
119
|
-
constructor() {
|
|
120
|
-
super('EOF', FREIGHTER);
|
|
121
|
-
}
|
|
122
|
-
}
|
|
123
|
-
/** Thrown/returned when a stream is closed abnormally. */
|
|
124
|
-
export class StreamClosed extends BaseTypedError {
|
|
125
|
-
constructor() {
|
|
126
|
-
super('StreamClosed', FREIGHTER);
|
|
127
|
-
}
|
|
128
|
-
}
|
|
129
|
-
/** Thrown when a target is unreachable. */
|
|
130
|
-
export class Unreachable extends BaseTypedError {
|
|
131
|
-
constructor() {
|
|
132
|
-
super('Unreachable', FREIGHTER);
|
|
133
|
-
}
|
|
134
|
-
}
|
|
135
|
-
const freighterErrorEncoder = (error) => {
|
|
136
|
-
if (error instanceof EOF) {
|
|
137
|
-
return 'EOF';
|
|
138
|
-
}
|
|
139
|
-
if (error instanceof StreamClosed) {
|
|
140
|
-
return 'StreamClosed';
|
|
141
|
-
}
|
|
142
|
-
if (error instanceof Unreachable) {
|
|
143
|
-
return 'Unreachable';
|
|
144
|
-
}
|
|
145
|
-
throw new Error(`Unknown error type: ${error}`);
|
|
146
|
-
};
|
|
147
|
-
const freighterErrorDecoder = (encoded) => {
|
|
148
|
-
switch (encoded) {
|
|
149
|
-
case 'EOF':
|
|
150
|
-
return new EOF();
|
|
151
|
-
case 'StreamClosed':
|
|
152
|
-
return new StreamClosed();
|
|
153
|
-
case 'Unreachable':
|
|
154
|
-
return new Unreachable();
|
|
155
|
-
default:
|
|
156
|
-
throw new Error(`Unknown error type: ${encoded}`);
|
|
157
|
-
}
|
|
158
|
-
};
|
|
159
|
-
registerError({
|
|
160
|
-
type: FREIGHTER,
|
|
161
|
-
encode: freighterErrorEncoder,
|
|
162
|
-
decode: freighterErrorDecoder,
|
|
163
|
-
});
|
|
164
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZXJyb3JzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL2xpYi9lcnJvcnMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLENBQUMsRUFBRSxNQUFNLEtBQUssQ0FBQztBQVd4QixNQUFNLE9BQU8sY0FBZSxTQUFRLEtBQUs7SUFDdkMsYUFBYSxHQUFxQixnQkFBZ0IsQ0FBQztJQUNuRCxJQUFJLENBQVM7SUFFYixZQUFZLE9BQWUsRUFBRSxJQUFZO1FBQ3ZDLEtBQUssQ0FBQyxPQUFPLENBQUMsQ0FBQztRQUNmLElBQUksQ0FBQyxJQUFJLEdBQUcsSUFBSSxDQUFDO0lBQ25CLENBQUM7Q0FDRjtBQUtELE1BQU0sQ0FBQyxNQUFNLFlBQVksR0FBRyxDQUFDLEtBQWMsRUFBdUIsRUFBRTtJQUNsRSxJQUFJLENBQUMsS0FBSyxJQUFJLE9BQU8sS0FBSyxLQUFLLFFBQVEsRUFBRTtRQUN2QyxPQUFPLEtBQUssQ0FBQztLQUNkO0lBQ0QsTUFBTSxVQUFVLEdBQUcsS0FBbUIsQ0FBQztJQUN2QyxJQUFJLFVBQVUsQ0FBQyxhQUFhLEtBQUssZ0JBQWdCLEVBQUU7UUFDakQsT0FBTyxLQUFLLENBQUM7S0FDZDtJQUNELElBQUksQ0FBQyxDQUFDLE1BQU0sSUFBSSxVQUFVLENBQUMsRUFBRTtRQUMzQixNQUFNLElBQUksS0FBSyxDQUNiLGlEQUFpRCxVQUFVLEVBQUUsQ0FDOUQsQ0FBQztLQUNIO0lBQ0QsT0FBTyxJQUFJLENBQUM7QUFDZCxDQUFDLENBQUM7QUFFRixNQUFNLENBQUMsTUFBTSxlQUFlLEdBQUcsQ0FBSSxJQUFZLEVBQUUsS0FBYSxFQUFLLEVBQUU7SUFDbkUsSUFBSSxDQUFDLEtBQUssRUFBRTtRQUNWLE1BQU0sSUFBSSxLQUFLLENBQUMsMEJBQTBCLElBQUksMEJBQTBCLENBQUMsQ0FBQztLQUMzRTtJQUNELElBQUksQ0FBQyxZQUFZLENBQUMsS0FBSyxDQUFDLEVBQUU7UUFDeEIsTUFBTSxJ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
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
export {};
|
|
@@ -1,85 +0,0 @@
|
|
|
1
|
-
import test from 'ava';
|
|
2
|
-
import {
|
|
3
|
-
assertErrorType,
|
|
4
|
-
BaseTypedError,
|
|
5
|
-
decodeError,
|
|
6
|
-
encodeError,
|
|
7
|
-
EOF,
|
|
8
|
-
FREIGHTER,
|
|
9
|
-
isTypedError,
|
|
10
|
-
NONE,
|
|
11
|
-
registerError,
|
|
12
|
-
StreamClosed,
|
|
13
|
-
UNKNOWN,
|
|
14
|
-
UnknownError,
|
|
15
|
-
Unreachable,
|
|
16
|
-
} from './errors';
|
|
17
|
-
class MyCustomError extends BaseTypedError {
|
|
18
|
-
constructor(message) {
|
|
19
|
-
super(message, 'MyCustomError');
|
|
20
|
-
}
|
|
21
|
-
}
|
|
22
|
-
const myCustomErrorEncoder = (error) => {
|
|
23
|
-
return error.message;
|
|
24
|
-
};
|
|
25
|
-
const myCustomErrorDecoder = (encoded) => {
|
|
26
|
-
return new MyCustomError(encoded);
|
|
27
|
-
};
|
|
28
|
-
test('isTypedError', (t) => {
|
|
29
|
-
const error = new MyCustomError('test');
|
|
30
|
-
const fError = isTypedError(error);
|
|
31
|
-
t.is(fError, true);
|
|
32
|
-
t.is(error.type, 'MyCustomError');
|
|
33
|
-
});
|
|
34
|
-
test('encoding and decoding a custom error through registry', (t) => {
|
|
35
|
-
registerError({
|
|
36
|
-
type: 'MyCustomError',
|
|
37
|
-
encode: myCustomErrorEncoder,
|
|
38
|
-
decode: myCustomErrorDecoder,
|
|
39
|
-
});
|
|
40
|
-
const error = new MyCustomError('test');
|
|
41
|
-
const encoded = encodeError(error);
|
|
42
|
-
t.is(encoded.type, 'MyCustomError');
|
|
43
|
-
t.is(encoded.data, 'test');
|
|
44
|
-
const decoded = assertErrorType('MyCustomError', decodeError(encoded));
|
|
45
|
-
t.is(decoded.message, 'test');
|
|
46
|
-
});
|
|
47
|
-
test('encoding and decoding a null error', (t) => {
|
|
48
|
-
const encoded = encodeError(null);
|
|
49
|
-
t.is(encoded.type, NONE);
|
|
50
|
-
t.is(encoded.data, '');
|
|
51
|
-
const decoded = decodeError(encoded);
|
|
52
|
-
t.is(decoded, undefined);
|
|
53
|
-
});
|
|
54
|
-
test('encoding and decoding an unrecognized error', (t) => {
|
|
55
|
-
const error = new Error('test');
|
|
56
|
-
const encoded = encodeError(error);
|
|
57
|
-
t.is(encoded.type, UNKNOWN);
|
|
58
|
-
t.is(encoded.data, '{}');
|
|
59
|
-
const decoded = decodeError(encoded);
|
|
60
|
-
t.deepEqual(decoded, new UnknownError('{}'));
|
|
61
|
-
});
|
|
62
|
-
test('registering duplicate error should throw', (t) => {
|
|
63
|
-
registerError({
|
|
64
|
-
type: 'MyDuplicateError',
|
|
65
|
-
encode: myCustomErrorEncoder,
|
|
66
|
-
decode: myCustomErrorDecoder,
|
|
67
|
-
});
|
|
68
|
-
t.throws(() => {
|
|
69
|
-
registerError({
|
|
70
|
-
type: 'MyDuplicateError',
|
|
71
|
-
encode: myCustomErrorEncoder,
|
|
72
|
-
decode: myCustomErrorDecoder,
|
|
73
|
-
});
|
|
74
|
-
});
|
|
75
|
-
});
|
|
76
|
-
test('encoding and decoding freighter errors', (t) => {
|
|
77
|
-
[new EOF(), new StreamClosed(), new Unreachable()].forEach((error) => {
|
|
78
|
-
const encoded = encodeError(error);
|
|
79
|
-
t.is(encoded.type, FREIGHTER);
|
|
80
|
-
t.is(encoded.data, error.message);
|
|
81
|
-
const decoded = decodeError(encoded);
|
|
82
|
-
t.deepEqual(decoded, error);
|
|
83
|
-
});
|
|
84
|
-
});
|
|
85
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZXJyb3JzLnNwZWMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvbGliL2Vycm9ycy5zcGVjLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sSUFBSSxNQUFNLEtBQUssQ0FBQztBQUV2QixPQUFPLEVBQ0wsZUFBZSxFQUNmLGNBQWMsRUFDZCxXQUFXLEVBQ1gsV0FBVyxFQUNYLEdBQUcsRUFDSCxTQUFTLEVBQ1QsWUFBWSxFQUNaLElBQUksRUFDSixhQUFhLEVBQ2IsWUFBWSxFQUVaLE9BQU8sRUFDUCxZQUFZLEVBQ1osV0FBVyxHQUNaLE1BQU0sVUFBVSxDQUFDO0FBRWxCLE1BQU0sYUFBYyxTQUFRLGNBQWM7SUFDeEMsWUFBWSxPQUFlO1FBQ3pCLEtBQUssQ0FBQyxPQUFPLEVBQUUsZUFBZSxDQUFDLENBQUM7SUFDbEMsQ0FBQztDQUNGO0FBRUQsTUFBTSxvQkFBb0IsR0FBRyxDQUFDLEtBQW9CLEVBQVUsRUFBRTtJQUM1RCxPQUFPLEtBQUssQ0FBQyxPQUFPLENBQUM7QUFDdkIsQ0FBQyxDQUFDO0FBRUYsTUFBTSxvQkFBb0IsR0FBRyxDQUFDLE9BQWUsRUFBYyxFQUFFO0lBQzNELE9BQU8sSUFBSSxhQUFhLENBQUMsT0FBTyxDQUFDLENBQUM7QUFDcEMsQ0FBQyxDQUFDO0FBRUYsSUFBSSxDQUFDLGNBQWMsRUFBRSxDQUFDLENBQUMsRUFBRSxFQUFFO0lBQ3pCLE1BQU0sS0FBSyxHQUFHLElBQUksYUFBYSxDQUFDLE1BQU0sQ0FBQyxDQUFDO0lBQ3hDLE1BQU0sTUFBTSxHQUFHLFlBQVksQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUNuQyxDQUFDLENBQUMsRUFBRSxDQUFDLE1BQU0sRUFBRSxJQUFJLENBQUMsQ0FBQztJQUNuQixDQUFDLENBQUMsRUFBRSxDQUFDLEtBQUssQ0FBQyxJQUFJLEVBQUUsZUFBZSxDQUFDLENBQUM7QUFDcEMsQ0FBQyxDQUFDLENBQUM7QUFFSCxJQUFJLENBQUMsdURBQXVELEVB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
|
|
@@ -1,50 +0,0 @@
|
|
|
1
|
-
import { AxiosRequestConfig } from 'axios';
|
|
2
|
-
import { ZodSchema } from 'zod';
|
|
3
|
-
import { EncoderDecoder } from './encoder';
|
|
4
|
-
import { MiddlewareCollector } from './middleware';
|
|
5
|
-
import { UnaryClient } from './unary';
|
|
6
|
-
import URL from './url';
|
|
7
|
-
/**
|
|
8
|
-
* HTTPClientFactory provides a POST and GET implementation of the Unary
|
|
9
|
-
* protocol.
|
|
10
|
-
*
|
|
11
|
-
* @param url - The base URL of the API.
|
|
12
|
-
* @param encoder - The encoder/decoder to use for the request/response.
|
|
13
|
-
*/
|
|
14
|
-
export declare class HTTPClientFactory extends MiddlewareCollector {
|
|
15
|
-
endpoint: URL;
|
|
16
|
-
encoder: EncoderDecoder;
|
|
17
|
-
constructor(endpoint: URL, encoder: EncoderDecoder);
|
|
18
|
-
getClient(): GETClient;
|
|
19
|
-
postClient(): POSTClient;
|
|
20
|
-
}
|
|
21
|
-
export declare const CONTENT_TYPE_HEADER_KEY = "Content-Type";
|
|
22
|
-
declare class Core extends MiddlewareCollector {
|
|
23
|
-
endpoint: URL;
|
|
24
|
-
encoder: EncoderDecoder;
|
|
25
|
-
constructor(endpoint: URL, encoder: EncoderDecoder);
|
|
26
|
-
get headers(): {
|
|
27
|
-
"Content-Type": 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 declare const buildQueryString: ({ request, prefix, }: {
|
|
47
|
-
request: Record<string, unknown>;
|
|
48
|
-
prefix?: string | undefined;
|
|
49
|
-
}) => string;
|
|
50
|
-
export {};
|
package/build/module/lib/http.js
DELETED
|
@@ -1,108 +0,0 @@
|
|
|
1
|
-
import axios from 'axios';
|
|
2
|
-
import { decodeError, ErrorPayloadSchema } from './errors';
|
|
3
|
-
import { MiddlewareCollector } from './middleware';
|
|
4
|
-
/**
|
|
5
|
-
* HTTPClientFactory provides a POST and GET implementation of the Unary
|
|
6
|
-
* protocol.
|
|
7
|
-
*
|
|
8
|
-
* @param url - The base URL of the API.
|
|
9
|
-
* @param encoder - The encoder/decoder to use for the request/response.
|
|
10
|
-
*/
|
|
11
|
-
export class HTTPClientFactory extends MiddlewareCollector {
|
|
12
|
-
endpoint;
|
|
13
|
-
encoder;
|
|
14
|
-
constructor(endpoint, encoder) {
|
|
15
|
-
super();
|
|
16
|
-
this.endpoint = endpoint;
|
|
17
|
-
this.encoder = encoder;
|
|
18
|
-
}
|
|
19
|
-
getClient() {
|
|
20
|
-
const gc = new GETClient(this.endpoint, this.encoder);
|
|
21
|
-
gc.use(...this.middleware);
|
|
22
|
-
return gc;
|
|
23
|
-
}
|
|
24
|
-
postClient() {
|
|
25
|
-
const pc = new POSTClient(this.endpoint, this.encoder);
|
|
26
|
-
pc.use(...this.middleware);
|
|
27
|
-
return pc;
|
|
28
|
-
}
|
|
29
|
-
}
|
|
30
|
-
export const CONTENT_TYPE_HEADER_KEY = 'Content-Type';
|
|
31
|
-
class Core extends MiddlewareCollector {
|
|
32
|
-
endpoint;
|
|
33
|
-
encoder;
|
|
34
|
-
constructor(endpoint, encoder) {
|
|
35
|
-
super();
|
|
36
|
-
this.endpoint = endpoint.replace({ protocol: 'http' });
|
|
37
|
-
this.encoder = encoder;
|
|
38
|
-
}
|
|
39
|
-
get headers() {
|
|
40
|
-
return {
|
|
41
|
-
[CONTENT_TYPE_HEADER_KEY]: this.encoder.contentType,
|
|
42
|
-
};
|
|
43
|
-
}
|
|
44
|
-
requestConfig() {
|
|
45
|
-
return {
|
|
46
|
-
headers: this.headers,
|
|
47
|
-
responseType: 'arraybuffer',
|
|
48
|
-
withCredentials: false,
|
|
49
|
-
validateStatus: () => true,
|
|
50
|
-
};
|
|
51
|
-
}
|
|
52
|
-
async execute(request, resSchema) {
|
|
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
|
-
}
|
|
67
|
-
}
|
|
68
|
-
rs = this.encoder.decode(httpRes.data, resSchema);
|
|
69
|
-
return undefined;
|
|
70
|
-
});
|
|
71
|
-
return [rs, err];
|
|
72
|
-
}
|
|
73
|
-
}
|
|
74
|
-
/**
|
|
75
|
-
* Implementation of the UnaryClient protocol backed by HTTP GET requests. It
|
|
76
|
-
* should not be instantiated directly, but through the HTTPClientFactory.
|
|
77
|
-
*/
|
|
78
|
-
export class GETClient extends Core {
|
|
79
|
-
async send(target, req, resSchema) {
|
|
80
|
-
const request = this.requestConfig();
|
|
81
|
-
request.method = 'GET';
|
|
82
|
-
request.url =
|
|
83
|
-
this.endpoint.child(target).stringify() +
|
|
84
|
-
buildQueryString({ request: req });
|
|
85
|
-
return await this.execute(request, resSchema);
|
|
86
|
-
}
|
|
87
|
-
}
|
|
88
|
-
/**
|
|
89
|
-
* Implementation of the UnaryClient protocol backed by HTTP POST requests. It
|
|
90
|
-
* should not be instantiated directly, but through the HTTPClientFactory.
|
|
91
|
-
*/
|
|
92
|
-
export class POSTClient extends Core {
|
|
93
|
-
async send(target, req, resSchema) {
|
|
94
|
-
const url = this.endpoint.child(target).stringify();
|
|
95
|
-
const request = this.requestConfig();
|
|
96
|
-
request.method = 'POST';
|
|
97
|
-
request.url = url;
|
|
98
|
-
request.data = this.encoder.encode(req);
|
|
99
|
-
return await this.execute(request, resSchema);
|
|
100
|
-
}
|
|
101
|
-
}
|
|
102
|
-
export const buildQueryString = ({ request, prefix = '', }) => {
|
|
103
|
-
return ('?' +
|
|
104
|
-
Object.keys(request)
|
|
105
|
-
.map((key) => `${prefix}${key}=${request[key]}`)
|
|
106
|
-
.join('&'));
|
|
107
|
-
};
|
|
108
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaHR0cC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9saWIvaHR0cC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEtBQTZCLE1BQU0sT0FBTyxDQUFDO0FBSWxELE9BQU8sRUFBRSxXQUFXLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSxVQUFVLENBQUM7QUFDM0QsT0FBTyxFQUFZLG1CQUFtQixFQUFFLE1BQU0sY0FBYyxDQUFDO0FBSTdEOzs7Ozs7R0FNRztBQUNILE1BQU0sT0FBTyxpQkFBa0IsU0FBUSxtQkFBbUI7SUFDeEQsUUFBUSxDQUFNO0lBQ2QsT0FBTyxDQUFpQjtJQUV4QixZQUFZLFFBQWEsRUFBRSxPQUF1QjtRQUNoRCxLQUFLLEVBQUUsQ0FBQztRQUNSLElBQUksQ0FBQyxRQUFRLEdBQUcsUUFBUSxDQUFDO1FBQ3pCLElBQUksQ0FBQyxPQUFPLEdBQUcsT0FBTyxDQUFDO0lBQ3pCLENBQUM7SUFFRCxTQUFTO1FBQ1AsTUFBTSxFQUFFLEdBQUcsSUFBSSxTQUFTLENBQUMsSUFBSSxDQUFDLFFBQVEsRUFBRSxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUM7UUFDdEQsRUFBRSxDQUFDLEdBQUcsQ0FBQyxHQUFHLElBQUksQ0FBQyxVQUFVLENBQUMsQ0FBQztRQUMzQixPQUFPLEVBQUUsQ0FBQztJQUNaLENBQUM7SUFFRCxVQUFVO1FBQ1IsTUFBTSxFQUFFLEdBQUcsSUFBSSxVQUFVLENBQUMsSUFBSSxDQUFDLFFBQVEsRUFBRSxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUM7UUFDdkQsRUFBRSxDQUFDLEdBQUcsQ0FBQyxHQUFHLElBQUksQ0FBQyxVQUFVLENBQUMsQ0FBQztRQUMzQixPQUFPLEVBQUUsQ0FBQztJQUNaLENBQUM7Q0FDRjtBQUVELE1BQU0sQ0FBQyxNQUFNLHVCQUF1QixHQUFHLGNBQWMsQ0FBQztBQUV0RCxNQUFNLElBQUssU0FBUSxtQkFBbUI7SUFDcEMsUUFBUSxDQUFNO0lBQ2QsT0FB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
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
export {};
|
|
@@ -1,54 +0,0 @@
|
|
|
1
|
-
import test from 'ava';
|
|
2
|
-
import { z } from 'zod';
|
|
3
|
-
import { JSONEncoderDecoder } from './encoder';
|
|
4
|
-
import { HTTPClientFactory } from './http';
|
|
5
|
-
import URL from './url';
|
|
6
|
-
const ENDPOINT = new URL({
|
|
7
|
-
host: '127.0.0.1',
|
|
8
|
-
port: 8080,
|
|
9
|
-
pathPrefix: 'unary',
|
|
10
|
-
});
|
|
11
|
-
const factory = new HTTPClientFactory(ENDPOINT, new JSONEncoderDecoder());
|
|
12
|
-
const MessageSchema = z.object({
|
|
13
|
-
id: z.number().optional(),
|
|
14
|
-
message: z.string().optional(),
|
|
15
|
-
});
|
|
16
|
-
const getClient = factory.getClient();
|
|
17
|
-
const postClient = factory.postClient();
|
|
18
|
-
test('[http] - post echo', async (t) => {
|
|
19
|
-
const [response, error] = await postClient.send('/echo', {
|
|
20
|
-
id: 1,
|
|
21
|
-
message: 'hello',
|
|
22
|
-
}, MessageSchema);
|
|
23
|
-
t.is(error, undefined);
|
|
24
|
-
t.deepEqual(response, { id: 2, message: 'hello' });
|
|
25
|
-
});
|
|
26
|
-
test('[http] - get echo', async (t) => {
|
|
27
|
-
const [response, error] = await getClient.send('/echo', {
|
|
28
|
-
id: 1,
|
|
29
|
-
message: 'hello',
|
|
30
|
-
}, MessageSchema);
|
|
31
|
-
t.is(error, undefined);
|
|
32
|
-
t.deepEqual(response, { id: 2, message: 'hello' });
|
|
33
|
-
});
|
|
34
|
-
test('[http] - get not found', async (t) => {
|
|
35
|
-
const [response, error] = await getClient.send('/not-found', {}, MessageSchema);
|
|
36
|
-
t.is(error?.message, 'Cannot GET /unary/not-found');
|
|
37
|
-
t.is(response, undefined);
|
|
38
|
-
});
|
|
39
|
-
test('[http] - post not found', async (t) => {
|
|
40
|
-
const [response, error] = await postClient.send('/not-found', {}, MessageSchema);
|
|
41
|
-
t.is(error?.message, 'Cannot POST /unary/not-found');
|
|
42
|
-
t.is(response, undefined);
|
|
43
|
-
});
|
|
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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
|
|
@@ -1,32 +0,0 @@
|
|
|
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,21 +0,0 @@
|
|
|
1
|
-
export var Runtime;
|
|
2
|
-
(function (Runtime) {
|
|
3
|
-
Runtime['Browser'] = 'browser';
|
|
4
|
-
Runtime['Node'] = 'node';
|
|
5
|
-
})(Runtime || (Runtime = {}));
|
|
6
|
-
const detectRuntime = () => {
|
|
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') {
|
|
15
|
-
return Runtime.Browser;
|
|
16
|
-
}
|
|
17
|
-
console.warn('Freighter unable to safely detect runtime, assuming browser');
|
|
18
|
-
return Runtime.Browser;
|
|
19
|
-
};
|
|
20
|
-
export const RUNTIME = detectRuntime();
|
|
21
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicnVudGltZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9saWIvcnVudGltZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxNQUFNLENBQU4sSUFBWSxPQUdYO0FBSEQsV0FBWSxPQUFPO0lBQ2pCLDhCQUFtQixDQUFBO0lBQ25CLHdCQUFhLENBQUE7QUFDZixDQUFDLEVBSFcsT0FBTyxLQUFQLE9BQU8sUUFHbEI7QUFFRCxNQUFNLGFBQWEsR0FBRyxHQUFZLEVBQUU7SUFDbEMsSUFDRSxPQUFPLE9BQU8sS0FBSyxXQUFXO1FBQzlCLE9BQU8sQ0FBQyxRQUFRLElBQUksSUFBSTtRQUN4QixPQUFPLENBQUMsUUFBUSxDQUFDLElBQUksSUFBSSxJQUFJLEVBQzdCO1FBQ0EsT0FBTyxPQUFPLENBQUMsSUFBSSxDQUFDO0tBQ3JCO0lBRUQsSUFBSSxPQUFPLE1BQU0sS0FBSyxXQUFXLElBQUksT0FBTyxNQUFNLENBQUMsUUFBUSxLQUFLLFdBQVcsRUFBRTtRQUMzRSxPQUFPLE9BQU8sQ0FBQyxPQUFPLENBQUM7S0FDeEI7SUFFRCxPQUFPLENBQUMsSUFBSSxDQUFDLDZEQUE2RCxDQUFDLENBQUM7SUFDNUUsT0FBTyxPQUFPLENBQUMsT0FBTyxDQUFDO0FBQ3pCLENBQUMsQ0FBQztBQUVGLE1BQU0sQ0FBQyxNQUFNLE9BQU8sR0FBRyxhQUFhLEVBQUUsQ0FBQyJ9
|
|
@@ -1,76 +0,0 @@
|
|
|
1
|
-
import { ZodSchema } from 'zod';
|
|
2
|
-
import { Transport } from './transport';
|
|
3
|
-
/**
|
|
4
|
-
* Interface for an entity that receives a stream of responses.
|
|
5
|
-
*/
|
|
6
|
-
export interface StreamReceiver<RS> {
|
|
7
|
-
/**
|
|
8
|
-
* Receives a response from the stream. It's not safe to call receive
|
|
9
|
-
* concurrently.
|
|
10
|
-
*
|
|
11
|
-
* @returns freighter.EOF: if the server closed the stream nominally.
|
|
12
|
-
* @returns Error: if the server closed the stream abnormally,
|
|
13
|
-
* returns the error the server returned.
|
|
14
|
-
* @raises Error: if the transport fails.
|
|
15
|
-
*/
|
|
16
|
-
receive(): Promise<[RS | undefined, Error | undefined]>;
|
|
17
|
-
/**
|
|
18
|
-
* @returns true if the stream has received a response
|
|
19
|
-
*/
|
|
20
|
-
received(): boolean;
|
|
21
|
-
}
|
|
22
|
-
/**
|
|
23
|
-
* Interface for an entity that sends a stream of requests.
|
|
24
|
-
*/
|
|
25
|
-
export interface StreamSender<RQ> {
|
|
26
|
-
/**
|
|
27
|
-
* Sends a request to the stream. It is not safe to call send concurrently
|
|
28
|
-
* with closeSend or send.
|
|
29
|
-
|
|
30
|
-
* @param req - the request to send.
|
|
31
|
-
* @returns freighter.EOF: if the server closed the stream. The caller
|
|
32
|
-
* can discover the error returned by the server by calling receive().
|
|
33
|
-
* @returns undefined: if the message was sent successfully.
|
|
34
|
-
* @raises freighter.StreamClosed: if the client called close_send()
|
|
35
|
-
* @raises Error: if the transport fails.
|
|
36
|
-
*/
|
|
37
|
-
send(req: RQ): Error | undefined;
|
|
38
|
-
}
|
|
39
|
-
/**
|
|
40
|
-
* Extension of the StreamSender interface that allows the client to close the sending
|
|
41
|
-
* direction of the stream when finished issuing requrest.
|
|
42
|
-
*/
|
|
43
|
-
export interface StreamSenderCloser<RQ> extends StreamSender<RQ> {
|
|
44
|
-
/**
|
|
45
|
-
* Lets the server know no more messages will be sent. If the client attempts
|
|
46
|
-
* to call send() after calling closeSend(), a freighter.StreamClosed
|
|
47
|
-
* exception will be raised. close_send is idempotent. If the server has
|
|
48
|
-
* already closed the stream, close_send will do nothing.
|
|
49
|
-
|
|
50
|
-
* After calling close_send, the client is responsible for calling receive()
|
|
51
|
-
* to successfully receive the server's acknowledgement.
|
|
52
|
-
*/
|
|
53
|
-
closeSend(): void;
|
|
54
|
-
}
|
|
55
|
-
/**
|
|
56
|
-
* Interface for a bidirectional stream between a client and a server.
|
|
57
|
-
*/
|
|
58
|
-
export interface Stream<RQ, RS> extends StreamSenderCloser<RQ>, StreamReceiver<RS> {
|
|
59
|
-
}
|
|
60
|
-
/**
|
|
61
|
-
* Interface for a bidirectional stream between a client and a server.
|
|
62
|
-
*/
|
|
63
|
-
export interface StreamClient extends Transport {
|
|
64
|
-
/**
|
|
65
|
-
* Dials the target and returns a stream that can be used to issue requests
|
|
66
|
-
* and receive responses
|
|
67
|
-
*
|
|
68
|
-
* @param target - The target to dial. In some implementations, this may be
|
|
69
|
-
* an endpoint path, or in others, a complete hostname or URL.
|
|
70
|
-
* @param reqSchema - The schema for the request type. This is used to
|
|
71
|
-
* validate the request before sending it.
|
|
72
|
-
* @param resSchema - The schema for the response type. This is used to
|
|
73
|
-
* validate the response before returning it.
|
|
74
|
-
*/
|
|
75
|
-
stream<RQ, RS>(target: string, reqSchema: ZodSchema<RQ>, resSchema: ZodSchema<RS>): Promise<Stream<RQ, RS>>;
|
|
76
|
-
}
|
|
@@ -1,13 +0,0 @@
|
|
|
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
|
-
}
|