From 4c7084563f082283213d1ccd180fcf489d630099 Mon Sep 17 00:00:00 2001 From: Fabian Stamm Date: Tue, 9 Dec 2025 18:02:28 +0100 Subject: [PATCH] Make the generated code compatible with nodejs natives modules --- Cargo.lock | 4 +- Cargo.toml | 2 +- libjrpc/Cargo.toml | 2 +- .../templates/TypeScript/ts_service_client.ts | 207 ++++++++++-------- 4 files changed, 115 insertions(+), 100 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index f6bac48..99db32a 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -561,7 +561,7 @@ checksum = "49f1f14873335454500d59611f1cf4a4b0f786f9ac11f4312a78e4cf2566695b" [[package]] name = "jrpc-cli" -version = "0.1.3" +version = "0.1.5" dependencies = [ "anyhow", "clap", @@ -607,7 +607,7 @@ checksum = "561d97a539a36e26a9a5fad1ea11a3039a67714694aaa379433e580854bc3dc5" [[package]] name = "libjrpc" -version = "0.1.0" +version = "0.1.5" dependencies = [ "anyhow", "lazy_static", diff --git a/Cargo.toml b/Cargo.toml index 3aa514c..9a34052 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -1,7 +1,7 @@ [package] edition = "2021" name = "jrpc-cli" -version = "0.1.3" +version = "0.1.5" [workspace] resolver = "2" diff --git a/libjrpc/Cargo.toml b/libjrpc/Cargo.toml index a1ec0b2..31ca4e0 100644 --- a/libjrpc/Cargo.toml +++ b/libjrpc/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "libjrpc" -version = "0.1.0" +version = "0.1.5" edition = "2021" [features] diff --git a/libjrpc/templates/TypeScript/ts_service_client.ts b/libjrpc/templates/TypeScript/ts_service_client.ts index 90f49af..d1da781 100644 --- a/libjrpc/templates/TypeScript/ts_service_client.ts +++ b/libjrpc/templates/TypeScript/ts_service_client.ts @@ -2,127 +2,142 @@ import { VerificationError } from "./ts_base"; //@template-ignore import { - //@template-ignore - type RequestObject, - //@template-ignore - type ResponseObject, - //@template-ignore - Logging, - //@template-ignore + //@template-ignore + type RequestObject, + //@template-ignore + type ResponseObject, + //@template-ignore + Logging, + //@template-ignore } from "./ts_service_base"; export type IMessageCallback = (data: any) => void; export type ResponseListener = { - ok: (response: any) => void; - err: (error: Error) => void; + ok: (response: any) => void; + err: (error: Error) => void; }; export class Service { - public _name: string = null as any; + public _name: string = null as any; - constructor( - protected _provider: ServiceProvider, - name: string, - ) { - this._name = name; - this._provider.services.set(name, this); - } + constructor( + protected _provider: ServiceProvider, + name: string, + ) { + this._name = name; + this._provider.services.set(name, this); + } } export class ServiceProvider { - services = new Map(); - requests = new Map(); + services = new Map(); + requests = new Map(); - constructor(private sendPacket: IMessageCallback) {} + constructor(private sendPacket: IMessageCallback) {} - onPacket(msg: RequestObject | ResponseObject) { - Logging.log("CLIENT: Received message:", msg); - if ("method" in msg) { - if (msg.id) { - Logging.log("CLIENT: Determined type is Request"); - // Request, which are not supported by client, so ignore - return; - } else { - Logging.log("CLIENT: Determined type is Notification"); - //Notification. Send to Notification handler - const [srvName, fncName] = msg.method.split("."); - let service = this.services.get(srvName); - if (!service) { - Logging.log( - "CLIENT: Did not find Service wanted by Notification!", - srvName, - ); + onPacket(msg: RequestObject | ResponseObject) { + Logging.log("CLIENT: Received message:", msg); + if ("method" in msg) { + if (msg.id) { + Logging.log("CLIENT: Determined type is Request"); + // Request, which are not supported by client, so ignore + return; + } else { + Logging.log("CLIENT: Determined type is Notification"); + //Notification. Send to Notification handler + const [srvName, fncName] = msg.method.split("."); + let service = this.services.get(srvName); + if (!service) { + Logging.log( + "CLIENT: Did not find Service wanted by Notification!", + srvName, + ); + } else { + //TODO: Implement Event thingy (or so :)) + } + } } else { - //TODO: Implement Event thingy (or so :)) + Logging.log("CLIENT: Determined type is Response"); + // Response + let resListener = this.requests.get(msg.id); + if (!resListener) return; // Ignore wrong responses + if (msg.error) { + if ( + msg.error.data && + msg.error.data.$ == "verification_error" + ) { + resListener.err( + new VerificationError( + msg.error.data.type, + msg.error.data.field, + msg.error.data.value, + ), + ); + } else { + resListener.err(new Error(msg.error.message)); + } + } else { + resListener.ok(msg.result); + } } - } - } else { - Logging.log("CLIENT: Determined type is Response"); - // Response - let resListener = this.requests.get(msg.id); - if (!resListener) return; // Ignore wrong responses - if (msg.error) { - if (msg.error.data && msg.error.data.$ == "verification_error") { - resListener.err( - new VerificationError( - msg.error.data.type, - msg.error.data.field, - msg.error.data.value, - ), - ); - } else { - resListener.err(new Error(msg.error.message)); - } - } else { - resListener.ok(msg.result); - } } - } - sendNotification(method: string, params: any[]) { - Logging.log("CLIENT: Sending Notification", method, params); - this.sendPacket({ - jsonrpc: "2.0", - method, - params, - }); - } + sendNotification(method: string, params: any[]) { + Logging.log("CLIENT: Sending Notification", method, params); + this.sendPacket({ + jsonrpc: "2.0", + method, + params, + }); + } - sendRequest(method: string, params: any[], res?: ResponseListener) { - Logging.log("CLIENT: Sending Request", method, params); - const id = getRandomID(16); - this.requests.set(id, res); - this.sendPacket({ - jsonrpc: "2.0", - method, - params, - id, - }); - } + sendRequest(method: string, params: any[], res?: ResponseListener) { + Logging.log("CLIENT: Sending Request", method, params); + const id = getRandomID(16); + this.requests.set(id, res); + this.sendPacket({ + jsonrpc: "2.0", + method, + params, + id, + }); + } } declare var require: any; export const getRandomBytes = ( - typeof self !== "undefined" && (self.crypto || (self as any).msCrypto) - ? function () { - // Browsers - var crypto = self.crypto || (self as any).msCrypto; - var QUOTA = 65536; - return function (n: number) { - var a = new Uint8Array(n); - for (var i = 0; i < n; i += QUOTA) { - crypto.getRandomValues(a.subarray(i, i + Math.min(n - i, QUOTA))); + typeof self !== "undefined" && (self.crypto || (self as any).msCrypto) + ? function () { + // Browsers + var crypto = self.crypto || (self as any).msCrypto; + var QUOTA = 65536; + return function (n: number) { + var a = new Uint8Array(n); + for (var i = 0; i < n; i += QUOTA) { + crypto.getRandomValues( + a.subarray(i, i + Math.min(n - i, QUOTA)), + ); + } + return a; + }; + } + : function () { + // Node + if (typeof require !== "undefined") { + return require("crypto").randomBytes; + } else { + return (n: number) => { + let a = new Uint8Array(n); + for (let i = 0; i < n; i++) { + a[i] = Math.floor(Math.random() * 256); + } + return a; + }; + } } - return a; - }; - } - : function () { - // Node - return require("crypto").randomBytes; - } )() as (cnt: number) => Uint8Array; export const getRandomID = (length: number) => { - return btoa(String.fromCharCode.apply(null, getRandomBytes(length) as any)); + return btoa(String.fromCharCode.apply(null, getRandomBytes(length) as any)); };