awesomerpc 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.
Files changed (53) hide show
  1. package/README.md +59 -0
  2. package/lib/error.d.ts +29 -0
  3. package/lib/error.d.ts.map +1 -0
  4. package/lib/error.js +43 -0
  5. package/lib/error.js.map +1 -0
  6. package/lib/index.d.ts +5 -0
  7. package/lib/index.d.ts.map +1 -0
  8. package/lib/index.js +5 -0
  9. package/lib/index.js.map +1 -0
  10. package/lib/integration.test.d.ts +2 -0
  11. package/lib/integration.test.d.ts.map +1 -0
  12. package/lib/integration.test.js +90 -0
  13. package/lib/integration.test.js.map +1 -0
  14. package/lib/protocol.d.ts +30 -0
  15. package/lib/protocol.d.ts.map +1 -0
  16. package/lib/protocol.js +140 -0
  17. package/lib/protocol.js.map +1 -0
  18. package/lib/proxy.d.ts +13 -0
  19. package/lib/proxy.d.ts.map +1 -0
  20. package/lib/proxy.js +16 -0
  21. package/lib/proxy.js.map +1 -0
  22. package/lib/rpc.d.ts +43 -0
  23. package/lib/rpc.d.ts.map +1 -0
  24. package/lib/rpc.js +395 -0
  25. package/lib/rpc.js.map +1 -0
  26. package/lib/serve/hono.d.ts +7 -0
  27. package/lib/serve/hono.d.ts.map +1 -0
  28. package/lib/serve/hono.js +31 -0
  29. package/lib/serve/hono.js.map +1 -0
  30. package/lib/transport.d.ts +63 -0
  31. package/lib/transport.d.ts.map +1 -0
  32. package/lib/transport.js +151 -0
  33. package/lib/transport.js.map +1 -0
  34. package/lib/types.d.ts +84 -0
  35. package/lib/types.d.ts.map +1 -0
  36. package/lib/types.js +135 -0
  37. package/lib/types.js.map +1 -0
  38. package/lib/util.d.ts +13 -0
  39. package/lib/util.d.ts.map +1 -0
  40. package/lib/util.js +21 -0
  41. package/lib/util.js.map +1 -0
  42. package/package.json +38 -0
  43. package/src/error.ts +44 -0
  44. package/src/index.ts +6 -0
  45. package/src/integration.test.ts +110 -0
  46. package/src/protocol.ts +155 -0
  47. package/src/proxy.ts +28 -0
  48. package/src/rpc.ts +453 -0
  49. package/src/serve/hono.ts +51 -0
  50. package/src/transport.ts +200 -0
  51. package/src/types.ts +217 -0
  52. package/src/util.ts +32 -0
  53. package/tsconfig.json +45 -0
package/lib/rpc.js ADDED
@@ -0,0 +1,395 @@
1
+ import { BehaviorSubject, Subject, Subscription } from "rxjs";
2
+ import {} from "reflect-types";
3
+ import { isPlainObject, Deferred } from "./util.js";
4
+ import { decodeEvent, decodeObservableComplete, decodeObservableEvent, decodeRequest, decodeRespondError, decodeRespondOk, decodeStreamElement, decodeStreamFinish, MSGID_EVENT, MSGID_OBSERVABLE_CLOSE, MSGID_OBSERVABLE_COMPLETE, MSGID_OBSERVABLE_ERROR, MSGID_OBSERVABLE_EVENT, MSGID_REQUEST, MSGID_RESPOND_ERROR, MSGID_RESPOND_OK, MSGID_STREAM_ELEMENT, MSGID_STREAM_FINISH, TYPE_ARRAY, TYPE_ASYNC_GENERATOR, TYPE_BEHAVIORSUBJECT, TYPE_OBJECT, TYPE_PRIMITIVE, TYPE_SUBJECT, TYPE_UNDEFINED, } from "./protocol.js";
5
+ import { EventNotFoundError, MethodNotFoundError, ProtocolError, RemoteError, RPCError, FailedValidationError } from "./error.js";
6
+ import { which } from "bun";
7
+ export class Resource {
8
+ value;
9
+ close;
10
+ constructor(value, close) {
11
+ this.value = value;
12
+ this.close = close;
13
+ }
14
+ }
15
+ export function isResource(value) {
16
+ return value instanceof Resource;
17
+ }
18
+ function isPrimitive(value) {
19
+ return value == null
20
+ || typeof (value) === 'boolean'
21
+ || typeof (value) === 'number'
22
+ || typeof (value) === 'string';
23
+ }
24
+ export class RPC {
25
+ transport;
26
+ local;
27
+ remote;
28
+ state;
29
+ // For sending data
30
+ nextMessageId = 0;
31
+ nextStreamId = 0;
32
+ nextSubjectId = 0;
33
+ sendSubscriptions = new Map();
34
+ // For receiving data
35
+ recvSubjects = new Map();
36
+ pending = new Map();
37
+ asyncGenerators = new Map();
38
+ events = Object.create(null);
39
+ // Internal resources
40
+ readerSubscription;
41
+ constructor(transport, local, remote, state) {
42
+ this.transport = transport;
43
+ this.local = local;
44
+ this.remote = remote;
45
+ this.state = state;
46
+ // Process incoming messages
47
+ this.readerSubscription = transport.input.subscribe(data => {
48
+ try {
49
+ this.processMessage(data);
50
+ }
51
+ catch (error) {
52
+ if (error instanceof RPCError) {
53
+ console.warn(`[RPC] ${error}`);
54
+ }
55
+ else {
56
+ console.error(error);
57
+ }
58
+ }
59
+ });
60
+ }
61
+ getEvent(name) {
62
+ if (!this.local.spec.hasEvent(name)) {
63
+ return;
64
+ }
65
+ if (this.events[name] === undefined) {
66
+ return this.events[name] = new Subject();
67
+ }
68
+ return this.events[name];
69
+ }
70
+ async notify(eventName, value) {
71
+ await this.transport.write(JSON.stringify([MSGID_EVENT, eventName, this.encode(value)]));
72
+ }
73
+ hasMethod(name) {
74
+ return this.local.spec.hasMethod(name);
75
+ }
76
+ async callMethod(name, args) {
77
+ const id = this.nextMessageId++;
78
+ console.log(`send REQUEST ${id}`);
79
+ const deferred = new Deferred();
80
+ this.pending.set(id, { name, deferred });
81
+ const encodedArgs = args.map(this.encode.bind(this));
82
+ await this.transport.write(JSON.stringify([MSGID_REQUEST, id, name, encodedArgs]));
83
+ return deferred.promise;
84
+ }
85
+ encode(value) {
86
+ if (value === undefined) {
87
+ return [TYPE_UNDEFINED];
88
+ }
89
+ if (isPrimitive(value)) {
90
+ return [TYPE_PRIMITIVE, value];
91
+ }
92
+ if (value instanceof BehaviorSubject) {
93
+ const id = this.nextSubjectId++;
94
+ this.sendSubscriptions.set(id, value.subscribe({
95
+ next: val => {
96
+ this.transport.write(JSON.stringify([MSGID_OBSERVABLE_EVENT, id, this.encode(val)]));
97
+ },
98
+ error: err => {
99
+ this.transport.write(JSON.stringify([MSGID_OBSERVABLE_ERROR, id, err.toString()]));
100
+ },
101
+ complete: () => {
102
+ this.transport.write(JSON.stringify([MSGID_OBSERVABLE_COMPLETE, id]));
103
+ },
104
+ }));
105
+ return [TYPE_BEHAVIORSUBJECT, id, this.encode(value.value)];
106
+ }
107
+ if (value instanceof Subject) {
108
+ const id = this.nextSubjectId++;
109
+ this.sendSubscriptions.set(id, value.subscribe({
110
+ next: val => {
111
+ this.transport.write(JSON.stringify([MSGID_OBSERVABLE_EVENT, id, this.encode(val)]));
112
+ },
113
+ error: err => {
114
+ this.transport.write(JSON.stringify([MSGID_OBSERVABLE_ERROR, id, err.toString()]));
115
+ },
116
+ complete: () => {
117
+ this.transport.write(JSON.stringify([MSGID_OBSERVABLE_COMPLETE, id]));
118
+ },
119
+ }));
120
+ return [TYPE_SUBJECT, id];
121
+ }
122
+ if (value[Symbol.asyncIterator] !== undefined) {
123
+ const id = this.nextStreamId++;
124
+ (async () => {
125
+ const iter = value[Symbol.asyncIterator]();
126
+ for (;;) {
127
+ // TODO implement back-pressure
128
+ // TODO expose next() as an RPC call
129
+ const { done, value } = await iter.next();
130
+ if (done) {
131
+ this.transport.write(JSON.stringify([MSGID_STREAM_FINISH, id, this.encode(value)]));
132
+ break;
133
+ }
134
+ this.transport.write(JSON.stringify([MSGID_STREAM_ELEMENT, id, this.encode(value)]));
135
+ }
136
+ })();
137
+ return [TYPE_ASYNC_GENERATOR, id];
138
+ }
139
+ if (Array.isArray(value)) {
140
+ return [TYPE_ARRAY, value.map(this.encode.bind(this))];
141
+ }
142
+ if (isPlainObject(value)) {
143
+ const mapped = {};
144
+ for (const [k, v] of Object.entries(value)) {
145
+ mapped[k] = this.encode(v);
146
+ }
147
+ return [TYPE_OBJECT, mapped];
148
+ }
149
+ throw new RPCError(`Could not encode value ${value}`);
150
+ }
151
+ decode(value) {
152
+ if (!Array.isArray(value)) {
153
+ throw new ProtocolError(`Could not decode value: received value is not a tagged array.`);
154
+ }
155
+ switch (value[0]) {
156
+ case TYPE_UNDEFINED:
157
+ return undefined;
158
+ case TYPE_PRIMITIVE:
159
+ return value[1];
160
+ case TYPE_ARRAY:
161
+ {
162
+ if (!Array.isArray(value[1])) {
163
+ throw new ProtocolError(`Trying to decode an array but the argument is not an array.`);
164
+ }
165
+ return value[1].map(this.decode.bind(this));
166
+ }
167
+ case TYPE_OBJECT:
168
+ {
169
+ if (!isPlainObject(value[1])) {
170
+ throw new ProtocolError(`Trying to decode an object but the argument is not an object.`);
171
+ }
172
+ const mapped = {};
173
+ for (const [k, v] of Object.entries(value[1])) {
174
+ mapped[k] = this.decode(v);
175
+ }
176
+ return mapped;
177
+ }
178
+ case TYPE_ASYNC_GENERATOR:
179
+ {
180
+ if (typeof (value[1]) !== 'number') {
181
+ throw new Error(`Could not decode value: stream ID not a number.`);
182
+ }
183
+ const id = value[1];
184
+ const buffer = [];
185
+ let deferred = new Deferred();
186
+ const generator = {
187
+ buffer,
188
+ deferred,
189
+ };
190
+ this.asyncGenerators.set(id, generator);
191
+ return {
192
+ [Symbol.asyncIterator]() {
193
+ return this;
194
+ },
195
+ async next() {
196
+ if (generator.buffer.length === 0) {
197
+ await generator.deferred.promise;
198
+ generator.deferred = new Deferred;
199
+ }
200
+ return generator.buffer.shift();
201
+ }
202
+ };
203
+ }
204
+ case TYPE_SUBJECT:
205
+ case TYPE_BEHAVIORSUBJECT:
206
+ {
207
+ if (value.length !== 3) {
208
+ throw new Error(`Expected message with 3 elements but got ${value.length}.`);
209
+ }
210
+ if (typeof (value[1]) !== 'number') {
211
+ throw new Error(`Could not decode value: observable ID not a number.`);
212
+ }
213
+ const id = value[1];
214
+ let subject;
215
+ if (value[0] === TYPE_BEHAVIORSUBJECT) {
216
+ const initValue = this.decode(value[2]);
217
+ subject = new BehaviorSubject(initValue);
218
+ }
219
+ else {
220
+ subject = new Subject();
221
+ }
222
+ this.recvSubjects.set(id, subject);
223
+ // // We monkey-patch complete() because there seems to be no way to pass in a custom finalizer
224
+ // const self = this;
225
+ // const origComplete = subject.complete;
226
+ // subject.complete = function() {
227
+ // self.writer(JSON.stringify([ OBSERVABLE_COMPLETE, id ]));
228
+ // origComplete.call(this);
229
+ // }
230
+ const close = () => {
231
+ this.transport.write(JSON.stringify([MSGID_OBSERVABLE_CLOSE, id]));
232
+ };
233
+ return new Resource(subject, close);
234
+ }
235
+ }
236
+ }
237
+ processMessage(data) {
238
+ const msg = JSON.parse(data);
239
+ if (!Array.isArray(msg)) {
240
+ throw new Error(`Expected message to be a JSON array.`);
241
+ }
242
+ if (msg.length === 0) {
243
+ throw new ProtocolError(`Expected message to be a JSON array with at least one element.`);
244
+ }
245
+ const type = msg[0];
246
+ if (typeof (type) !== 'number') {
247
+ throw new ProtocolError(`Expected message type to be a number.`);
248
+ }
249
+ switch (type) {
250
+ case MSGID_EVENT:
251
+ {
252
+ const [name, rawValue] = decodeEvent(msg);
253
+ console.log(`recv EVENT ${name}`);
254
+ const subject = this.getEvent(name);
255
+ if (subject === undefined) {
256
+ throw new EventNotFoundError(name);
257
+ }
258
+ const value = this.decode(rawValue);
259
+ const coerced = this.local.spec.validateEventValue(name, value);
260
+ subject.next(coerced);
261
+ break;
262
+ }
263
+ case MSGID_REQUEST:
264
+ {
265
+ const [id, name, encodedArgs] = decodeRequest(msg);
266
+ console.log(`recv REQUEST ${id} (${name})`);
267
+ try {
268
+ const args = encodedArgs.map(this.decode.bind(this));
269
+ const method = this.local.getHandler(name);
270
+ if (method === undefined) {
271
+ throw new MethodNotFoundError(name);
272
+ }
273
+ const validArgs = this.local.spec.validateArgs(name, args);
274
+ Promise.resolve(method(this.state, ...validArgs))
275
+ .then(value => this.transport.write(JSON.stringify([MSGID_RESPOND_OK, id, this.encode(value)])))
276
+ .catch(error => this.transport.write(JSON.stringify([MSGID_RESPOND_ERROR, id, error.message])));
277
+ }
278
+ catch (error) {
279
+ if (error instanceof RemoteError) {
280
+ this.transport.write(JSON.stringify([MSGID_RESPOND_ERROR, id, error.message]));
281
+ break;
282
+ }
283
+ throw error;
284
+ }
285
+ break;
286
+ }
287
+ case MSGID_STREAM_ELEMENT:
288
+ {
289
+ const [id, rawValue] = decodeStreamElement(msg);
290
+ const element = this.decode(rawValue);
291
+ const stream = this.asyncGenerators.get(id);
292
+ if (stream === undefined) {
293
+ throw new RemoteError(`Stream with ID ${id} not found.`);
294
+ }
295
+ stream.buffer.push({ done: false, value: element });
296
+ stream.deferred.accept();
297
+ break;
298
+ }
299
+ case MSGID_STREAM_FINISH:
300
+ {
301
+ const [id, rawValue] = decodeStreamFinish(msg);
302
+ const generator = this.asyncGenerators.get(id);
303
+ if (generator === undefined) {
304
+ throw new RemoteError(`Async generator with ID ${id} not found.`);
305
+ }
306
+ generator.buffer.push({ done: true, value: this.decode(rawValue) });
307
+ generator.deferred.accept();
308
+ this.asyncGenerators.delete(id);
309
+ break;
310
+ }
311
+ case MSGID_OBSERVABLE_EVENT:
312
+ {
313
+ const [id, rawValue] = decodeObservableEvent(msg);
314
+ console.log(`recv OBSERVABLE_EVENT ${id}`);
315
+ const sub = this.recvSubjects.get(id);
316
+ if (sub === undefined) {
317
+ throw new RemoteError(`Observable with ID ${id} not found.`);
318
+ }
319
+ sub.next(this.decode(rawValue));
320
+ break;
321
+ }
322
+ case MSGID_OBSERVABLE_COMPLETE:
323
+ {
324
+ const [id] = decodeObservableComplete(msg);
325
+ console.log(`recv OBSERVABLE_COMPLETE ${id}`);
326
+ const subscriber = this.recvSubjects.get(id);
327
+ if (subscriber === undefined) {
328
+ throw new Error(`Observable with ID ${id} not found.`);
329
+ }
330
+ subscriber.complete();
331
+ this.recvSubjects.delete(id);
332
+ break;
333
+ }
334
+ case MSGID_OBSERVABLE_CLOSE:
335
+ {
336
+ const [id] = msg[1];
337
+ console.log(`recv OBSERVABLE_CLOSE ${id}`);
338
+ const sub = this.sendSubscriptions.get(id);
339
+ if (sub === undefined) {
340
+ throw new RemoteError(`Could not find subscription with ID ${id}`);
341
+ }
342
+ sub.unsubscribe();
343
+ this.sendSubscriptions.delete(id);
344
+ break;
345
+ }
346
+ case MSGID_RESPOND_OK:
347
+ {
348
+ const [id, value] = decodeRespondOk(msg);
349
+ console.log(`recv RESPOND_OK ${id}`);
350
+ const result = this.pending.get(id);
351
+ if (result === undefined) {
352
+ throw new RemoteError(`Pending request with ID ${id} not found.`);
353
+ }
354
+ const { name, deferred } = result;
355
+ this.pending.delete(id);
356
+ const decoded = this.decode(value);
357
+ let coerced;
358
+ try {
359
+ coerced = this.remote.validateReturns(name, decoded);
360
+ }
361
+ catch (error) {
362
+ if (error instanceof FailedValidationError) {
363
+ deferred.reject(error);
364
+ break;
365
+ }
366
+ throw error;
367
+ }
368
+ deferred.accept(coerced);
369
+ break;
370
+ }
371
+ case MSGID_RESPOND_ERROR:
372
+ {
373
+ const [id, message] = decodeRespondError(msg);
374
+ console.log(`recv RESPOND_ERROR ${id}`);
375
+ const result = this.pending.get(id);
376
+ if (result === undefined) {
377
+ throw new RemoteError(`Pending request with ID ${id} not found for error response`);
378
+ }
379
+ const { deferred } = result;
380
+ deferred.reject(new Error(message));
381
+ this.pending.delete(id);
382
+ break;
383
+ }
384
+ default:
385
+ throw new ProtocolError(`Invalid type code (${type}).`);
386
+ }
387
+ }
388
+ close() {
389
+ this.readerSubscription.unsubscribe();
390
+ }
391
+ }
392
+ export function connect(local, remote, transport, state) {
393
+ return new RPC(transport, local, remote, state);
394
+ }
395
+ //# sourceMappingURL=rpc.js.map
package/lib/rpc.js.map ADDED
@@ -0,0 +1 @@
1
+ {"version":3,"file":"rpc.js","sourceRoot":"","sources":["../src/rpc.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,7 @@
1
+ import type { WSContext } from "hono/ws";
2
+ import type { Context } from "hono";
3
+ import type { Impl } from "../types.js";
4
+ export default function honoServe<L extends Impl>(local: L, createState: (ctx: Context, ws: WSContext) => L['state']): import("hono").MiddlewareHandler<any, string, {
5
+ outputFormat: "ws";
6
+ }>;
7
+ //# sourceMappingURL=hono.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"hono.d.ts","sourceRoot":"","sources":["../../src/serve/hono.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,SAAS,CAAC;AACzC,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,MAAM,CAAC;AAIpC,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,aAAa,CAAC;AAKxC,MAAM,CAAC,OAAO,UAAU,SAAS,CAAC,CAAC,SAAS,IAAI,EAAE,KAAK,EAAE,CAAC,EAAE,WAAW,EAAE,CAAC,GAAG,EAAE,OAAO,EAAE,EAAE,EAAE,SAAS,KAAK,CAAC,CAAC,OAAO,CAAC;;GAuCnH"}
@@ -0,0 +1,31 @@
1
+ import { upgradeWebSocket } from "hono/bun";
2
+ import { RPC } from "../rpc.js";
3
+ import { RawTransport } from "../transport.js";
4
+ import { anyContract } from "../types.js";
5
+ const KEY_WEBSOCKET_DATA = 'awesomerpc';
6
+ export default function honoServe(local, createState) {
7
+ const remote = anyContract();
8
+ function getData(ws) {
9
+ return ws.raw.data[KEY_WEBSOCKET_DATA];
10
+ }
11
+ return upgradeWebSocket(ctx => {
12
+ return {
13
+ onOpen(_evt, ws) {
14
+ const state = createState(ctx, ws);
15
+ const sws = ws.raw;
16
+ const transport = new RawTransport(data => ws.send(data));
17
+ const rpc = new RPC(transport, local, remote, state);
18
+ sws.data[KEY_WEBSOCKET_DATA] = { rpc, transport };
19
+ },
20
+ onMessage(evt, ws) {
21
+ getData(ws).transport.feed(evt.data.toString());
22
+ },
23
+ onClose(_evt, ws) {
24
+ const data = getData(ws);
25
+ data.rpc.close();
26
+ data.transport.close();
27
+ },
28
+ };
29
+ });
30
+ }
31
+ //# sourceMappingURL=hono.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"hono.js","sourceRoot":"","sources":["../../src/serve/hono.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gBAAgB,EAAE,MAAM,UAAU,CAAC;AAI5C,OAAO,EAAE,GAAG,EAAE,MAAM,WAAW,CAAA;AAC/B,OAAO,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAC;AAE/C,OAAO,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAE1C,MAAM,kBAAkB,GAAG,YAAY,CAAA;AAEvC,MAAM,CAAC,OAAO,UAAU,SAAS,CAAiB,KAAQ,EAAE,WAAwD;IAElH,MAAM,MAAM,GAAG,WAAW,EAAE,CAAC;IAO7B,SAAS,OAAO,CAAC,EAAa;QAC5B,OAAQ,EAAE,CAAC,GAAgC,CAAC,IAAI,CAAC,kBAAkB,CAAgB,CAAC;IACtF,CAAC;IAED,OAAO,gBAAgB,CAAC,GAAG,CAAC,EAAE;QAC5B,OAAO;YACL,MAAM,CAAC,IAAI,EAAE,EAAE;gBACb,MAAM,KAAK,GAAG,WAAW,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC;gBACnC,MAAM,GAAG,GAAG,EAAE,CAAC,GAA+B,CAAC;gBAC/C,MAAM,SAAS,GAAG,IAAI,YAAY,CAChC,IAAI,CAAC,EAAE,CAAC,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC,CACtB,CAAC;gBACF,MAAM,GAAG,GAAG,IAAI,GAAG,CACjB,SAAS,EACT,KAAK,EACL,MAAM,EACN,KAAK,CACN,CAAC;gBACF,GAAG,CAAC,IAAI,CAAC,kBAAkB,CAAC,GAAG,EAAE,GAAG,EAAE,SAAS,EAAE,CAAC;YACpD,CAAC;YACD,SAAS,CAAC,GAAG,EAAE,EAAE;gBACf,OAAO,CAAC,EAAE,CAAC,CAAC,SAAS,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,QAAQ,EAAE,CAAC,CAAC;YAClD,CAAC;YACD,OAAO,CAAC,IAAI,EAAE,EAAE;gBACd,MAAM,IAAI,GAAG,OAAO,CAAC,EAAE,CAAC,CAAC;gBACzB,IAAI,CAAC,GAAG,CAAC,KAAK,EAAE,CAAC;gBACjB,IAAI,CAAC,SAAS,CAAC,KAAK,EAAE,CAAC;YACzB,CAAC;SACF,CAAA;IACH,CAAC,CAAC,CAAC;AACL,CAAC"}
@@ -0,0 +1,63 @@
1
+ import { Subject } from "rxjs";
2
+ type WriteFn = (data: string) => Promise<void> | void;
3
+ export interface Transport {
4
+ write: WriteFn;
5
+ open(): Promise<void>;
6
+ close(): Promise<void>;
7
+ readonly input: Subject<string>;
8
+ }
9
+ export declare class DummyTransport implements Transport {
10
+ input: Subject<string>;
11
+ output: Subject<string>;
12
+ constructor(input: Subject<string>, output: Subject<string>);
13
+ write(data: string): Promise<void>;
14
+ open(): Promise<void>;
15
+ close(): Promise<void>;
16
+ }
17
+ export declare function createDuplex(): [Transport, Transport];
18
+ export declare class RawTransport implements Transport {
19
+ write: WriteFn;
20
+ readonly input: Subject<string>;
21
+ constructor(write: WriteFn);
22
+ feed(data: string): void;
23
+ open(): Promise<void>;
24
+ close(): Promise<void>;
25
+ }
26
+ export declare class WebSocketError extends Error {
27
+ }
28
+ export declare class OpenWebSocketError extends WebSocketError {
29
+ }
30
+ export declare class TimeoutReachedWebSocketError extends OpenWebSocketError {
31
+ constructor();
32
+ }
33
+ export declare class GenericOpenWebSocketError extends OpenWebSocketError {
34
+ constructor();
35
+ }
36
+ export declare class GenericWebSocketError extends WebSocketError {
37
+ constructor();
38
+ }
39
+ export declare class WebSocketTransport implements Transport {
40
+ url: string;
41
+ ws?: WebSocket;
42
+ readonly input: Subject<string>;
43
+ timeout: number;
44
+ constructor(url: string, { timeout }?: {
45
+ timeout?: number | undefined;
46
+ });
47
+ private onError;
48
+ open(): Promise<void>;
49
+ close(): Promise<void>;
50
+ write(data: string): Promise<void>;
51
+ }
52
+ export declare class StableTransport implements Transport {
53
+ private factory;
54
+ readonly input: Subject<string>;
55
+ private active?;
56
+ private buffer;
57
+ constructor(factory: () => Transport);
58
+ write(data: string): Promise<void>;
59
+ open(): Promise<void>;
60
+ close(): Promise<void>;
61
+ }
62
+ export {};
63
+ //# sourceMappingURL=transport.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"transport.d.ts","sourceRoot":"","sources":["../src/transport.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,OAAO,EAAE,MAAM,MAAM,CAAC;AAE/B,KAAK,OAAO,GAAG,CAAC,IAAI,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC;AAEtD,MAAM,WAAW,SAAS;IACxB,KAAK,EAAE,OAAO,CAAC;IACf,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;IACtB,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;IACvB,QAAQ,CAAC,KAAK,EAAE,OAAO,CAAC,MAAM,CAAC,CAAC;CACjC;AAED,qBAAa,cAAe,YAAW,SAAS;IAGrC,KAAK,EAAE,OAAO,CAAC,MAAM,CAAC;IACtB,MAAM,EAAE,OAAO,CAAC,MAAM,CAAC;gBADvB,KAAK,EAAE,OAAO,CAAC,MAAM,CAAC,EACtB,MAAM,EAAE,OAAO,CAAC,MAAM,CAAC;IAKnB,KAAK,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAIlC,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;IAIrB,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;CAIpC;AAED,wBAAgB,YAAY,IAAI,CAAC,SAAS,EAAE,SAAS,CAAC,CAOrD;AAED,qBAAa,YAAa,YAAW,SAAS;IAKnC,KAAK,EAAE,OAAO;IAHvB,SAAgB,KAAK,kBAAyB;gBAGrC,KAAK,EAAE,OAAO;IAKhB,IAAI,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI;IAIlB,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;IAIrB,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;CAIpC;AAED,qBAAa,cAAe,SAAQ,KAAK;CACxC;AAED,qBAAa,kBAAmB,SAAQ,cAAc;CACrD;AAED,qBAAa,4BAA6B,SAAQ,kBAAkB;;CAInE;AAED,qBAAa,yBAA0B,SAAQ,kBAAkB;;CAIhE;AAED,qBAAa,qBAAsB,SAAQ,cAAc;;CAIxD;AAID,qBAAa,kBAAmB,YAAW,SAAS;IASxB,GAAG,EAAE,MAAM;IAPrC,EAAE,CAAC,EAAE,SAAS,CAAC;IAEf,QAAQ,CAAC,KAAK,kBAAyB;IAGvC,OAAO,EAAE,MAAM,CAAC;gBAEU,GAAG,EAAE,MAAM,EAAE,EAAE,OAAmC,EAAE;;KAAK;IAInF,OAAO,CAAC,OAAO,CAEd;IAEM,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;IA4BrB,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IAiBhB,KAAK,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;CAIhD;AAED,qBAAa,eAAgB,YAAW,SAAS;IAQ5B,OAAO,CAAC,OAAO;IANlC,QAAQ,CAAC,KAAK,kBAAyB;IAEvC,OAAO,CAAC,MAAM,CAAC,CAAkD;IAEjE,OAAO,CAAC,MAAM,CAAgB;gBAEH,OAAO,EAAE,MAAM,SAAS;IAItC,KAAK,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IASlC,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;IASrB,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;CAOpC"}