diff options
author | Sebastian <sebasjm@gmail.com> | 2022-01-16 17:33:21 -0300 |
---|---|---|
committer | Sebastian <sebasjm@gmail.com> | 2022-01-16 17:54:59 -0300 |
commit | bf0cb6ab135c2a6d58a0684c17a565ed8422d5a4 (patch) | |
tree | 2e25d7e9518a64e0f412a26793ac0ee8a3b34fbc /packages/taler-wallet-core/src/crypto/workers/synchronousWorker.ts | |
parent | 8b0294ee4158f60cd01880eb25b1b8b242346dfd (diff) | |
download | wallet-core-bf0cb6ab135c2a6d58a0684c17a565ed8422d5a4.tar.xz |
splitting syncWorker with the factory so the former do not require nodejs runtime
Diffstat (limited to 'packages/taler-wallet-core/src/crypto/workers/synchronousWorker.ts')
-rw-r--r-- | packages/taler-wallet-core/src/crypto/workers/synchronousWorker.ts | 130 |
1 files changed, 3 insertions, 127 deletions
diff --git a/packages/taler-wallet-core/src/crypto/workers/synchronousWorker.ts b/packages/taler-wallet-core/src/crypto/workers/synchronousWorker.ts index 9de28dbeb..4d341718e 100644 --- a/packages/taler-wallet-core/src/crypto/workers/synchronousWorker.ts +++ b/packages/taler-wallet-core/src/crypto/workers/synchronousWorker.ts @@ -14,135 +14,16 @@ GNU Taler; see the file COPYING. If not, see <http://www.gnu.org/licenses/> */ +import { Logger } from "@gnu-taler/taler-util"; import { CryptoImplementation, - PrimitiveWorker, + PrimitiveWorker } from "./cryptoImplementation.js"; -import { CryptoWorkerFactory } from "./cryptoApi.js"; -import { CryptoWorker } from "./cryptoWorkerInterface.js"; -import child_process from "child_process"; -import type internal from "stream"; -import { OpenedPromise, openPromise } from "../../index.js"; -import { j2s, Logger } from "@gnu-taler/taler-util"; const logger = new Logger("synchronousWorker.ts"); -class MyPrimitiveWorker implements PrimitiveWorker { - proc: child_process.ChildProcessByStdio< - internal.Writable, - internal.Readable, - null - >; - requests: Array<{ - p: OpenedPromise<any>; - req: any; - }> = []; - - constructor() { - const stdoutChunks: Buffer[] = []; - this.proc = child_process.spawn("taler-crypto-worker", { - //stdio: ["pipe", "pipe", "inherit"], - stdio: ["pipe", "pipe", "inherit"], - detached: true, - }); - this.proc.on("close", function (code) { - logger.error("child process exited"); - }); - (this.proc.stdout as any).unref(); - (this.proc.stdin as any).unref(); - this.proc.unref(); - - this.proc.stdout.on("data", (x) => { - // console.log("got chunk", x.toString("utf-8")); - if (x instanceof Buffer) { - const nlIndex = x.indexOf("\n"); - if (nlIndex >= 0) { - const before = x.slice(0, nlIndex); - const after = x.slice(nlIndex + 1); - stdoutChunks.push(after); - const str = Buffer.concat([...stdoutChunks, before]).toString( - "utf-8", - ); - const req = this.requests.shift()!; - if (this.requests.length === 0) { - this.proc.unref(); - } - //logger.info(`got response: ${str}`); - req.p.resolve(JSON.parse(str)); - } else { - stdoutChunks.push(x); - } - } else { - throw Error(`unexpected data chunk type (${typeof x})`); - } - }); - } - - async setupRefreshPlanchet(req: { - transfer_secret: string; - coin_index: number; - }): Promise<{ - coin_pub: string; - coin_priv: string; - blinding_key: string; - }> { - return this.queueRequest({ - op: "setup_refresh_planchet", - args: req, - }); - } - - async queueRequest(req: any): Promise<any> { - const p = openPromise<any>(); - if (this.requests.length === 0) { - this.proc.ref(); - } - this.requests.push({ req, p }); - this.proc.stdin.write(JSON.stringify(req) + "\n"); - return p.promise; - } - - async eddsaVerify(req: { - msg: string; - sig: string; - pub: string; - }): Promise<{ valid: boolean }> { - return this.queueRequest({ - op: "eddsa_verify", - args: req, - }); - } - - async eddsaSign(req: { - msg: string; - priv: string; - }): Promise<{ sig: string }> { - return this.queueRequest({ - op: "eddsa_sign", - args: req, - }); - } -} - -/** - * The synchronous crypto worker produced by this factory doesn't run in the - * background, but actually blocks the caller until the operation is done. - */ -export class SynchronousCryptoWorkerFactory implements CryptoWorkerFactory { - startWorker(): CryptoWorker { - if (typeof require === "undefined") { - throw Error("cannot make worker, require(...) not defined"); - } - return new SynchronousCryptoWorker(); - } - - getConcurrency(): number { - return 1; - } -} - /** * Worker implementation that uses node subprocesses. */ @@ -157,14 +38,9 @@ export class SynchronousCryptoWorker { */ onerror: undefined | ((m: any) => void); - primitiveWorker: PrimitiveWorker; - - constructor() { + constructor(private primitiveWorker?: PrimitiveWorker) { this.onerror = undefined; this.onmessage = undefined; - if (process.env["TALER_WALLET_PRIMITIVE_WORKER"]) { - this.primitiveWorker = new MyPrimitiveWorker(); - } } /** |