@actyx/sdk
Version:
Actyx SDK
77 lines • 2.97 kB
JavaScript
;
/*
* Actyx SDK: Functions for writing distributed apps
* deployed on peer-to-peer networks, without any servers.
*
* Copyright (C) 2021 Actyx AG
*/
Object.defineProperty(exports, "__esModule", { value: true });
exports.mkConfig = exports.MultiplexedWebsocket = exports.ResponseMessage = void 0;
const t = require("io-ts");
const globals = require("../globals");
const multiplexedWebSocket_1 = require("../internal_common/multiplexedWebSocket");
const util_1 = require("../util");
const rxjs_1 = require("../../node_modules/rxjs");
const Either_1 = require("fp-ts/lib/Either");
const error_1 = require("../util/error");
const utils_1 = require("./utils");
const activeRequestInternals = globals.activeRequests[utils_1.GlobalInternalSymbol];
const NextMessage = t.readonly(t.type({
type: t.literal("next" /* Next */),
requestId: multiplexedWebSocket_1.RequestId,
payload: t.array(t.unknown),
}));
const CompleteMessage = t.readonly(t.type({
type: t.literal("complete" /* Complete */),
requestId: multiplexedWebSocket_1.RequestId,
}));
const ErrorMessage = t.readonly(t.type({
type: t.literal("error" /* Error */),
requestId: multiplexedWebSocket_1.RequestId,
// TODO refine, we have the following on the Rust side:
// UnknownEndpoint { endpoint: String },
// InternalError,
// BadRequest,
// ServiceError { value: Value },
kind: t.unknown,
}));
exports.ResponseMessage = t.union([NextMessage, CompleteMessage, ErrorMessage]);
class MultiplexedWebsocket {
constructor(config, redialAfter = 2000) {
this.ws = new multiplexedWebSocket_1.MultiplexedWebsocket(config, redialAfter);
}
request(serviceId, payload) {
const sym = Symbol();
const request = this.ws.request(serviceId, payload).pipe((0, rxjs_1.finalize)(() => activeRequestInternals.unregister(sym)), (0, rxjs_1.concatMap)((msg) => msg.payload), (0, rxjs_1.catchError)((err) => {
const e = ErrorMessage.decode(err);
return (0, Either_1.isRight)(e)
? (0, rxjs_1.throwError)(() => new Error((0, error_1.stringifyError)(e.right.kind)))
: (0, rxjs_1.throwError)(() => err);
}));
activeRequestInternals.register(sym, {
serviceId,
payload,
time: new Date(),
});
return request;
}
close() {
this.ws.close();
}
errors() {
return this.ws.errors;
}
}
exports.MultiplexedWebsocket = MultiplexedWebsocket;
const serializer = (msg) => {
// rxjs websocket only has one type, but we know that we serialize only requests
return JSON.stringify(multiplexedWebSocket_1.RequestMessage.encode(msg));
};
const deserializer = (msg) => (0, util_1.validateOrThrow)(exports.ResponseMessage)(JSON.parse(msg.data));
const mkConfig = (url) => ({
url,
serializer,
deserializer,
});
exports.mkConfig = mkConfig;
//# sourceMappingURL=multiplexedWebsocket.js.map