Make the generated code compatible with nodejs natives modules

This commit is contained in:
Fabian Stamm
2025-12-09 18:02:28 +01:00
parent ef8e97b15a
commit 4c7084563f
4 changed files with 115 additions and 100 deletions

4
Cargo.lock generated
View File

@ -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",

View File

@ -1,7 +1,7 @@
[package]
edition = "2021"
name = "jrpc-cli"
version = "0.1.3"
version = "0.1.5"
[workspace]
resolver = "2"

View File

@ -1,6 +1,6 @@
[package]
name = "libjrpc"
version = "0.1.0"
version = "0.1.5"
edition = "2021"
[features]

View File

@ -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<string, Service>();
requests = new Map<string, ResponseListener | undefined>();
services = new Map<string, Service>();
requests = new Map<string, ResponseListener | undefined>();
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));
};