jsonrpc: make event loop in ts client optional (#4347)

* jsonrpc: make event loop in ts client optional

* jsonrpc: ts: fix tests and make specifying `startEventLoop` mandatory

* add changelog entry

* Update CHANGELOG.md
This commit is contained in:
Simon Laux
2023-04-24 23:18:55 +02:00
committed by GitHub
parent 514074de8b
commit 1b8bfef441
4 changed files with 20 additions and 10 deletions

View File

@@ -7,6 +7,7 @@
This better corresponds to JSON-RPC 2.0 server-client distinction This better corresponds to JSON-RPC 2.0 server-client distinction
and is expected to simplify writing new bindings and is expected to simplify writing new bindings
because dispatching events can be done on higher level. because dispatching events can be done on higher level.
- JSON-RPC: TS: Client now has a mandatory argument whether you want to start listening for events.
### Fixes ### Fixes
- JSON-RPC: do not print to stdout on failure to find an account. - JSON-RPC: do not print to stdout on failure to find an account.

View File

@@ -36,12 +36,15 @@ export class BaseDeltaChat<
account?: T.Account; account?: T.Account;
private contextEmitters: { [key: number]: TinyEmitter<ContextEvents> } = {}; private contextEmitters: { [key: number]: TinyEmitter<ContextEvents> } = {};
//@ts-ignore
private eventTask: Promise<void>; private eventTask: Promise<void>;
constructor(public transport: Transport) { constructor(public transport: Transport, startEventLoop: boolean) {
super(); super();
this.rpc = new RawClient(this.transport); this.rpc = new RawClient(this.transport);
this.eventTask = this.eventLoop(); if (startEventLoop) {
this.eventTask = this.eventLoop();
}
} }
async eventLoop(): Promise<void> { async eventLoop(): Promise<void> {
@@ -77,10 +80,12 @@ export class BaseDeltaChat<
export type Opts = { export type Opts = {
url: string; url: string;
startEventLoop: boolean;
}; };
export const DEFAULT_OPTS: Opts = { export const DEFAULT_OPTS: Opts = {
url: "ws://localhost:20808/ws", url: "ws://localhost:20808/ws",
startEventLoop: true,
}; };
export class DeltaChat extends BaseDeltaChat<WebsocketTransport> { export class DeltaChat extends BaseDeltaChat<WebsocketTransport> {
opts: Opts; opts: Opts;
@@ -88,20 +93,24 @@ export class DeltaChat extends BaseDeltaChat<WebsocketTransport> {
this.transport.close(); this.transport.close();
} }
constructor(opts?: Opts | string) { constructor(opts?: Opts | string) {
if (typeof opts === "string") opts = { url: opts }; if (typeof opts === "string") {
if (opts) opts = { ...DEFAULT_OPTS, ...opts }; opts = { ...DEFAULT_OPTS, url: opts };
else opts = { ...DEFAULT_OPTS }; } else if (opts) {
opts = { ...DEFAULT_OPTS, ...opts };
} else {
opts = { ...DEFAULT_OPTS };
}
const transport = new WebsocketTransport(opts.url); const transport = new WebsocketTransport(opts.url);
super(transport); super(transport, opts.startEventLoop);
this.opts = opts; this.opts = opts;
} }
} }
export class StdioDeltaChat extends BaseDeltaChat<StdioTransport> { export class StdioDeltaChat extends BaseDeltaChat<StdioTransport> {
close() {} close() {}
constructor(input: any, output: any) { constructor(input: any, output: any, startEventLoop: boolean) {
const transport = new StdioTransport(input, output); const transport = new StdioTransport(input, output);
super(transport); super(transport, startEventLoop);
} }
} }

View File

@@ -12,7 +12,7 @@ describe("basic tests", () => {
before(async () => { before(async () => {
serverHandle = await startServer(); serverHandle = await startServer();
dc = new DeltaChat(serverHandle.stdin, serverHandle.stdout); dc = new DeltaChat(serverHandle.stdin, serverHandle.stdout, true);
// dc.on("ALL", (event) => { // dc.on("ALL", (event) => {
//console.log("event", event); //console.log("event", event);
// }); // });

View File

@@ -27,7 +27,7 @@ describe("online tests", function () {
this.skip(); this.skip();
} }
serverHandle = await startServer(); serverHandle = await startServer();
dc = new DeltaChat(serverHandle.stdin, serverHandle.stdout); dc = new DeltaChat(serverHandle.stdin, serverHandle.stdout, true);
dc.on("ALL", (contextId, { type }) => { dc.on("ALL", (contextId, { type }) => {
if (type !== "Info") console.log(contextId, type); if (type !== "Info") console.log(contextId, type);