From 65299c7a1eab4a6181e33741d64006cff32eea20 Mon Sep 17 00:00:00 2001 From: Gregory Schier Date: Mon, 20 Jan 2025 09:25:36 -0800 Subject: [PATCH] Switch back to NodeJS plugin runtime --- package-lock.json | 103 +++----- package.json | 2 +- .../src/bindings/events.ts | 4 +- packages/plugin-runtime/package.json | 10 +- packages/plugin-runtime/src/PluginHandle.ts | 13 +- packages/plugin-runtime/src/index.ts | 24 +- packages/plugin-runtime/src/index.worker.ts | 232 ++++++++---------- scripts/{vendor-deno.cjs => vendor-node.cjs} | 38 +-- src-tauri/src/lib.rs | 26 +- src-tauri/tauri.conf.json | 2 +- .../vendored/plugins/auth-jwt/build/index.js | 73 +++--- src-tauri/yaak-plugins/bindings/events.ts | 4 +- src-tauri/yaak-plugins/src/events.rs | 9 + src-tauri/yaak-plugins/src/nodejs.rs | 17 +- src-tauri/yaak-sync/bindings/sync.ts | 4 +- 15 files changed, 263 insertions(+), 298 deletions(-) rename scripts/{vendor-deno.cjs => vendor-node.cjs} (58%) diff --git a/package-lock.json b/package-lock.json index 377ee86a..d1598323 100644 --- a/package-lock.json +++ b/package-lock.json @@ -3068,13 +3068,6 @@ "dev": true, "license": "MIT" }, - "node_modules/@types/intercept-stdout": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/@types/intercept-stdout/-/intercept-stdout-0.1.3.tgz", - "integrity": "sha512-5qWSvqohM5rRKsF58LBWJeyu+lUlZwYKSnTcnXGfvFyMYIjvhpfniQRJNiyE/Gcru3jwVr2pHedsKTGLtzZqNA==", - "dev": true, - "license": "MIT" - }, "node_modules/@types/js-cookie": { "version": "2.2.7", "resolved": "https://registry.npmjs.org/@types/js-cookie/-/js-cookie-2.2.7.tgz", @@ -3208,6 +3201,16 @@ "dev": true, "license": "MIT" }, + "node_modules/@types/ws": { + "version": "8.5.13", + "resolved": "https://registry.npmjs.org/@types/ws/-/ws-8.5.13.tgz", + "integrity": "sha512-osM/gWBTPKgHV8XkTunnegTRIsvF6owmf5w+JtAfOw472dptdm0dlGv4xCt6GwQRcC2XVOvvRE/0bAoQcL2QkA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/node": "*" + } + }, "node_modules/@types/yauzl": { "version": "2.10.3", "resolved": "https://registry.npmjs.org/@types/yauzl/-/yauzl-2.10.3.tgz", @@ -7733,15 +7736,6 @@ "css-in-js-utils": "^3.1.0" } }, - "node_modules/intercept-stdout": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/intercept-stdout/-/intercept-stdout-0.1.2.tgz", - "integrity": "sha512-Umb41Ryp5FzLurfCRAWx+jjNAk8jsw2RTk2XPIwus+86h/Y2Eb4DfOWof/mZ6FBww8SoO45rJSlg25054/Di9w==", - "license": "MIT", - "dependencies": { - "lodash.toarray": "^3.0.0" - } - }, "node_modules/internal-ip": { "version": "8.0.0", "resolved": "https://registry.npmjs.org/internal-ip/-/internal-ip-8.0.0.tgz", @@ -8742,47 +8736,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/lodash._arraycopy": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/lodash._arraycopy/-/lodash._arraycopy-3.0.0.tgz", - "integrity": "sha512-RHShTDnPKP7aWxlvXKiDT6IX2jCs6YZLCtNhOru/OX2Q/tzX295vVBK5oX1ECtN+2r86S0Ogy8ykP1sgCZAN0A==", - "license": "MIT" - }, - "node_modules/lodash._basevalues": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/lodash._basevalues/-/lodash._basevalues-3.0.0.tgz", - "integrity": "sha512-H94wl5P13uEqlCg7OcNNhMQ8KvWSIyqXzOPusRgHC9DK3o54P6P3xtbXlVbRABG4q5gSmp7EDdJ0MSuW9HX6Mg==", - "license": "MIT" - }, - "node_modules/lodash._getnative": { - "version": "3.9.1", - "resolved": "https://registry.npmjs.org/lodash._getnative/-/lodash._getnative-3.9.1.tgz", - "integrity": "sha512-RrL9VxMEPyDMHOd9uFbvMe8X55X16/cGM5IgOKgRElQZutpX89iS6vwl64duTV1/16w5JY7tuFNXqoekmh1EmA==", - "license": "MIT" - }, - "node_modules/lodash.isarguments": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/lodash.isarguments/-/lodash.isarguments-3.1.0.tgz", - "integrity": "sha512-chi4NHZlZqZD18a0imDHnZPrDeBbTtVN7GXMwuGdRH9qotxAjYs3aVLKc7zNOG9eddR5Ksd8rvFEBc9SsggPpg==", - "license": "MIT" - }, - "node_modules/lodash.isarray": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/lodash.isarray/-/lodash.isarray-3.0.4.tgz", - "integrity": "sha512-JwObCrNJuT0Nnbuecmqr5DgtuBppuCvGD9lxjFpAzwnVtdGoDQ1zig+5W8k5/6Gcn0gZ3936HDAlGd28i7sOGQ==", - "license": "MIT" - }, - "node_modules/lodash.keys": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/lodash.keys/-/lodash.keys-3.1.2.tgz", - "integrity": "sha512-CuBsapFjcubOGMn3VD+24HOAPxM79tH+V6ivJL3CHYjtrawauDJHUk//Yew9Hvc6e9rbCrURGk8z6PC+8WJBfQ==", - "license": "MIT", - "dependencies": { - "lodash._getnative": "^3.0.0", - "lodash.isarguments": "^3.0.0", - "lodash.isarray": "^3.0.0" - } - }, "node_modules/lodash.merge": { "version": "4.6.2", "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", @@ -8790,17 +8743,6 @@ "dev": true, "license": "MIT" }, - "node_modules/lodash.toarray": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/lodash.toarray/-/lodash.toarray-3.0.2.tgz", - "integrity": "sha512-ptkjUqvuHjTuMJJxiktJpZhxM5l60bEkfntJx+NFzdQd1bZVxfpTF1bhFYFqBrT4F0wZ1qx9KbVmHJV3Rfc7Tw==", - "license": "MIT", - "dependencies": { - "lodash._arraycopy": "^3.0.0", - "lodash._basevalues": "^3.0.0", - "lodash.keys": "^3.0.0" - } - }, "node_modules/longest-streak": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/longest-streak/-/longest-streak-3.1.0.tgz", @@ -15463,10 +15405,10 @@ "packages/plugin-runtime": { "name": "@yaakapp-internal/plugin-runtime", "dependencies": { - "intercept-stdout": "^0.1.2" + "ws": "^8.18.0" }, "devDependencies": { - "@types/intercept-stdout": "^0.1.3" + "@types/ws": "^8.5.13" } }, "packages/plugin-runtime-types": { @@ -15481,6 +15423,27 @@ "typescript": "^5.6.2" } }, + "packages/plugin-runtime/node_modules/ws": { + "version": "8.18.0", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.18.0.tgz", + "integrity": "sha512-8VbfWfHLbbwu3+N6OKsOMpBdT4kXPDDB9cJk2bJ6mh9ucxdlnNvH1e+roYkKmN9Nxw2yjz7VzeO9oOz2zJ04Pw==", + "license": "MIT", + "engines": { + "node": ">=10.0.0" + }, + "peerDependencies": { + "bufferutil": "^4.0.1", + "utf-8-validate": ">=5.0.2" + }, + "peerDependenciesMeta": { + "bufferutil": { + "optional": true + }, + "utf-8-validate": { + "optional": true + } + } + }, "plugin-runtime": { "name": "@yaakapp-internal/plugin-runtime", "extraneous": true, diff --git a/package.json b/package.json index 1bfa75b5..9734ce07 100644 --- a/package.json +++ b/package.json @@ -24,7 +24,7 @@ "app-dev": "tauri dev --no-watch --config ./src-tauri/tauri-dev.conf.json", "build": "npm run --workspaces --if-present build", "bootstrap": "run-p bootstrap:* && npm run --workspaces --if-present bootstrap", - "bootstrap:vendor-deno": "node scripts/vendor-deno.cjs", + "bootstrap:vendor-node": "node scripts/vendor-node.cjs", "bootstrap:vendor-plugins": "node scripts/vendor-plugins.cjs", "bootstrap:vendor-protoc": "node scripts/vendor-protoc.cjs", "lint": "npm run --workspaces --if-present lint", diff --git a/packages/plugin-runtime-types/src/bindings/events.ts b/packages/plugin-runtime-types/src/bindings/events.ts index ff41b214..8c7b2e9f 100644 --- a/packages/plugin-runtime-types/src/bindings/events.ts +++ b/packages/plugin-runtime-types/src/bindings/events.ts @@ -38,6 +38,8 @@ export type EditorLanguage = "text" | "javascript" | "json" | "html" | "xml" | " export type EmptyPayload = {}; +export type ErrorResponse = { error: string, }; + export type ExportHttpRequestRequest = { httpRequest: HttpRequest, }; export type ExportHttpRequestResponse = { content: string, }; @@ -244,7 +246,7 @@ export type ImportResponse = { resources: ImportResources, }; export type InternalEvent = { id: string, pluginRefId: string, pluginName: string, replyId: string | null, payload: InternalEventPayload, windowContext: WindowContext, }; -export type InternalEventPayload = { "type": "boot_request" } & BootRequest | { "type": "boot_response" } & BootResponse | { "type": "reload_request" } & EmptyPayload | { "type": "reload_response" } & EmptyPayload | { "type": "terminate_request" } | { "type": "terminate_response" } | { "type": "import_request" } & ImportRequest | { "type": "import_response" } & ImportResponse | { "type": "filter_request" } & FilterRequest | { "type": "filter_response" } & FilterResponse | { "type": "export_http_request_request" } & ExportHttpRequestRequest | { "type": "export_http_request_response" } & ExportHttpRequestResponse | { "type": "send_http_request_request" } & SendHttpRequestRequest | { "type": "send_http_request_response" } & SendHttpRequestResponse | { "type": "get_http_request_actions_request" } & EmptyPayload | { "type": "get_http_request_actions_response" } & GetHttpRequestActionsResponse | { "type": "call_http_request_action_request" } & CallHttpRequestActionRequest | { "type": "get_template_functions_request" } | { "type": "get_template_functions_response" } & GetTemplateFunctionsResponse | { "type": "call_template_function_request" } & CallTemplateFunctionRequest | { "type": "call_template_function_response" } & CallTemplateFunctionResponse | { "type": "get_http_authentication_request" } & EmptyPayload | { "type": "get_http_authentication_response" } & GetHttpAuthenticationResponse | { "type": "call_http_authentication_request" } & CallHttpAuthenticationRequest | { "type": "call_http_authentication_response" } & CallHttpAuthenticationResponse | { "type": "copy_text_request" } & CopyTextRequest | { "type": "render_http_request_request" } & RenderHttpRequestRequest | { "type": "render_http_request_response" } & RenderHttpRequestResponse | { "type": "template_render_request" } & TemplateRenderRequest | { "type": "template_render_response" } & TemplateRenderResponse | { "type": "show_toast_request" } & ShowToastRequest | { "type": "prompt_text_request" } & PromptTextRequest | { "type": "prompt_text_response" } & PromptTextResponse | { "type": "get_http_request_by_id_request" } & GetHttpRequestByIdRequest | { "type": "get_http_request_by_id_response" } & GetHttpRequestByIdResponse | { "type": "find_http_responses_request" } & FindHttpResponsesRequest | { "type": "find_http_responses_response" } & FindHttpResponsesResponse | { "type": "empty_response" } & EmptyPayload; +export type InternalEventPayload = { "type": "boot_request" } & BootRequest | { "type": "boot_response" } & BootResponse | { "type": "reload_request" } & EmptyPayload | { "type": "reload_response" } & EmptyPayload | { "type": "terminate_request" } | { "type": "terminate_response" } | { "type": "import_request" } & ImportRequest | { "type": "import_response" } & ImportResponse | { "type": "filter_request" } & FilterRequest | { "type": "filter_response" } & FilterResponse | { "type": "export_http_request_request" } & ExportHttpRequestRequest | { "type": "export_http_request_response" } & ExportHttpRequestResponse | { "type": "send_http_request_request" } & SendHttpRequestRequest | { "type": "send_http_request_response" } & SendHttpRequestResponse | { "type": "get_http_request_actions_request" } & EmptyPayload | { "type": "get_http_request_actions_response" } & GetHttpRequestActionsResponse | { "type": "call_http_request_action_request" } & CallHttpRequestActionRequest | { "type": "get_template_functions_request" } | { "type": "get_template_functions_response" } & GetTemplateFunctionsResponse | { "type": "call_template_function_request" } & CallTemplateFunctionRequest | { "type": "call_template_function_response" } & CallTemplateFunctionResponse | { "type": "get_http_authentication_request" } & EmptyPayload | { "type": "get_http_authentication_response" } & GetHttpAuthenticationResponse | { "type": "call_http_authentication_request" } & CallHttpAuthenticationRequest | { "type": "call_http_authentication_response" } & CallHttpAuthenticationResponse | { "type": "copy_text_request" } & CopyTextRequest | { "type": "render_http_request_request" } & RenderHttpRequestRequest | { "type": "render_http_request_response" } & RenderHttpRequestResponse | { "type": "template_render_request" } & TemplateRenderRequest | { "type": "template_render_response" } & TemplateRenderResponse | { "type": "show_toast_request" } & ShowToastRequest | { "type": "prompt_text_request" } & PromptTextRequest | { "type": "prompt_text_response" } & PromptTextResponse | { "type": "get_http_request_by_id_request" } & GetHttpRequestByIdRequest | { "type": "get_http_request_by_id_response" } & GetHttpRequestByIdResponse | { "type": "find_http_responses_request" } & FindHttpResponsesRequest | { "type": "find_http_responses_response" } & FindHttpResponsesResponse | { "type": "empty_response" } & EmptyPayload | { "type": "error_response" } & ErrorResponse; export type PromptTextRequest = { id: string, title: string, label: string, description?: string, defaultValue?: string, placeholder?: string, /** diff --git a/packages/plugin-runtime/package.json b/packages/plugin-runtime/package.json index 632a294b..f3d80c5b 100644 --- a/packages/plugin-runtime/package.json +++ b/packages/plugin-runtime/package.json @@ -4,6 +4,14 @@ "bootstrap": "npm run build", "build": "run-p build:*", "build:main": "esbuild src/index.ts --bundle --platform=node --outfile=../../src-tauri/vendored/plugin-runtime/index.cjs", - "build:worker": "esbuild src/index.worker.ts --bundle --platform=node --outfile=../../src-tauri/vendored/plugin-runtime/index.worker.cjs" + "build:worker": "esbuild src/index.worker.ts --bundle --platform=node --outfile=../../src-tauri/vendored/plugin-runtime/index.worker.cjs", + "build:__main": "esbuild src/index.ts --bundle --platform=node --outfile=../../src-tauri/target/debug/vendored/plugin-runtime/index.cjs", + "build:__worker": "esbuild src/index.ts --bundle --platform=node --outfile=../../src-tauri/target/debug/vendored/plugin-runtime/index.worker.cjs" + }, + "dependencies": { + "ws": "^8.18.0" + }, + "devDependencies": { + "@types/ws": "^8.5.13" } } diff --git a/packages/plugin-runtime/src/PluginHandle.ts b/packages/plugin-runtime/src/PluginHandle.ts index a406dbd1..b585c40b 100644 --- a/packages/plugin-runtime/src/PluginHandle.ts +++ b/packages/plugin-runtime/src/PluginHandle.ts @@ -1,8 +1,8 @@ import type { BootRequest, InternalEvent } from '@yaakapp/api'; +import path from 'node:path'; import { Worker } from 'node:worker_threads'; import type { EventChannel } from './EventChannel'; import type { PluginWorkerData } from './index.worker'; -import path from 'node:path'; export class PluginHandle { #worker: Worker; @@ -24,19 +24,16 @@ export class PluginHandle { } #createWorker(): Worker { - const workerPath = path.join(__dirname, './index.worker.cjs'); + const workerPath = process.env.YAAK_WORKER_PATH ?? path.join(__dirname, 'index.worker.cjs'); const workerData: PluginWorkerData = { pluginRefId: this.pluginRefId, bootRequest: this.bootRequest, }; const worker = new Worker(workerPath, { workerData, - deno: { - permissions: 'none', - }, }); - worker.on('message', (e: InternalEvent) => this.events.emit(e)); + worker.on('message', (e) => this.events.emit(e)); worker.on('error', this.#handleError.bind(this)); worker.on('exit', this.#handleExit.bind(this)); @@ -45,11 +42,11 @@ export class PluginHandle { return worker; } - #handleError(err: Error) { + async #handleError(err: Error) { console.error('Plugin errored', this.bootRequest.dir, err); } - #handleExit(code: number) { + async #handleExit(code: number) { if (code === 0) { console.log('Plugin exited successfully', this.bootRequest.dir); } else { diff --git a/packages/plugin-runtime/src/index.ts b/packages/plugin-runtime/src/index.ts index 24b2f24b..229a7564 100644 --- a/packages/plugin-runtime/src/index.ts +++ b/packages/plugin-runtime/src/index.ts @@ -1,29 +1,25 @@ import type { InternalEvent } from '@yaakapp/api'; import { EventChannel } from './EventChannel'; import { PluginHandle } from './PluginHandle'; +import WebSocket from 'ws'; -const port = process.env.PORT || '50051'; +const port = process.env.YAAK_PLUGIN_SERVER_PORT || '9442'; const events = new EventChannel(); const plugins: Record = {}; const ws = new WebSocket(`ws://localhost:${port}`); -ws.addEventListener('message', async (e) => { + +ws.on('message', async (e: Buffer) => { try { - await handleIncoming(e); + await handleIncoming(e.toString()); } catch (err) { console.log('Failed to handle incoming plugin event', err); } }); -ws.addEventListener('open', () => { - console.log('Plugin runtime connected to websocket'); -}); -ws.addEventListener('error', (e) => { - console.error('Plugin runtime websocket error', e); -}); -ws.addEventListener('close', () => { - console.log('Plugin runtime websocket closed'); -}); +ws.on('open', (e) => console.log('Plugin runtime connected to websocket', e)); +ws.on('error', (e) => console.error('Plugin runtime websocket error', e)); +ws.on('close', (e) => console.log('Plugin runtime websocket closed', e)); // Listen for incoming events from plugins events.listen((e) => { @@ -31,8 +27,8 @@ events.listen((e) => { ws.send(eventStr); }); -async function handleIncoming(msg: MessageEvent) { - const pluginEvent: InternalEvent = JSON.parse(msg.data); +async function handleIncoming(msg: string) { + const pluginEvent: InternalEvent = JSON.parse(msg); // Handle special event to bootstrap plugin if (pluginEvent.payload.type === 'boot_request') { const plugin = new PluginHandle(pluginEvent.pluginRefId, pluginEvent.payload, events); diff --git a/packages/plugin-runtime/src/index.worker.ts b/packages/plugin-runtime/src/index.worker.ts index 154932c1..17444d3e 100644 --- a/packages/plugin-runtime/src/index.worker.ts +++ b/packages/plugin-runtime/src/index.worker.ts @@ -13,30 +13,30 @@ import type { TemplateFunction, TemplateRenderResponse, WindowContext, -} from "@yaakapp/api"; -import * as console from "node:console"; -import type { Stats } from "node:fs"; -import { readFileSync, statSync, watch } from "node:fs"; -import path from "node:path"; -import * as util from "node:util"; -import { parentPort, workerData } from "node:worker_threads"; -import { interceptStdout } from "./interceptStdout"; +} from '@yaakapp/api'; +import * as console from 'node:console'; +import type { Stats } from 'node:fs'; +import { readFileSync, statSync, watch } from 'node:fs'; +import path from 'node:path'; +import * as util from 'node:util'; +import { interceptStdout } from './interceptStdout'; +import { parentPort, workerData } from 'node:worker_threads'; export interface PluginWorkerData { bootRequest: BootRequest; pluginRefId: string; } -function initialize() { +function initialize(workerData: PluginWorkerData) { const { bootRequest: { dir: pluginDir, watch: enableWatch }, pluginRefId, }: PluginWorkerData = workerData; - const pathPkg = path.join(pluginDir, "package.json"); - const pathMod = path.posix.join(pluginDir, "src", "index.ts"); + const pathPkg = path.join(pluginDir, 'package.json'); + const pathMod = path.posix.join(pluginDir, 'build', 'index.js'); - const pkg = JSON.parse(readFileSync(pathPkg, "utf8")); + const pkg = JSON.parse(readFileSync(pathPkg, 'utf8')); prefixStdout(`[plugin][${pkg.name}] %s`); @@ -55,11 +55,8 @@ function initialize() { }; } - function sendEmpty( - windowContext: WindowContext, - replyId: string | null = null, - ): string { - return sendPayload(windowContext, { type: "empty_response" }, replyId); + function sendEmpty(windowContext: WindowContext, replyId: string | null = null): string { + return sendPayload(windowContext, { type: 'empty_response' }, replyId); } function sendPayload( @@ -73,13 +70,13 @@ function initialize() { } function sendEvent(event: InternalEvent) { - if (event.payload.type !== "empty_response") { - console.log("Sending event to app", event.id, event.payload.type); + if (event.payload.type !== 'empty_response') { + console.log('Sending event to app', event.id, event.payload.type); } parentPort!.postMessage(event); } - function sendAndWaitForReply>( + function sendAndWaitForReply>( windowContext: WindowContext, payload: InternalEventPayload, ): Promise { @@ -90,11 +87,11 @@ function initialize() { const promise = new Promise((resolve) => { const cb = (event: InternalEvent) => { if (event.replyId === eventToSend.id) { - parentPort!.off("message", cb); // Unlisten, now that we're done + parentPort!.off('message', cb); // Unlisten, now that we're done resolve(event.payload); // Not type-safe but oh well } }; - parentPort!.on("message", cb); + parentPort!.on('message', cb); }); // 3. Send the event after we start listening (to prevent race) @@ -105,10 +102,10 @@ function initialize() { } // Reload plugin if the JS or package.json changes - const windowContextNone: WindowContext = { type: "none" }; + const windowContextNone: WindowContext = { type: 'none' }; const fileChangeCallback = async () => { await importModule(); - return sendPayload(windowContextNone, { type: "reload_response" }, null); + return sendPayload(windowContextNone, { type: 'reload_response' }, null); }; if (enableWatch) { @@ -120,7 +117,7 @@ function initialize() { clipboard: { async copyText(text) { await sendAndWaitForReply(event.windowContext, { - type: "copy_text_request", + type: 'copy_text_request', text, }); }, @@ -128,32 +125,27 @@ function initialize() { toast: { async show(args) { await sendAndWaitForReply(event.windowContext, { - type: "show_toast_request", + type: 'show_toast_request', ...args, }); }, }, prompt: { async text(args) { - const reply: PromptTextResponse = await sendAndWaitForReply( - event.windowContext, - { - type: "prompt_text_request", - ...args, - }, - ); + const reply: PromptTextResponse = await sendAndWaitForReply(event.windowContext, { + type: 'prompt_text_request', + ...args, + }); return reply.value; }, }, httpResponse: { async find(args) { const payload = { - type: "find_http_responses_request", + type: 'find_http_responses_request', ...args, } as const; - const { httpResponses } = await sendAndWaitForReply< - FindHttpResponsesResponse - >( + const { httpResponses } = await sendAndWaitForReply( event.windowContext, payload, ); @@ -163,12 +155,10 @@ function initialize() { httpRequest: { async getById(args) { const payload = { - type: "get_http_request_by_id_request", + type: 'get_http_request_by_id_request', ...args, } as const; - const { httpRequest } = await sendAndWaitForReply< - GetHttpRequestByIdResponse - >( + const { httpRequest } = await sendAndWaitForReply( event.windowContext, payload, ); @@ -176,12 +166,10 @@ function initialize() { }, async send(args) { const payload = { - type: "send_http_request_request", + type: 'send_http_request_request', ...args, } as const; - const { httpResponse } = await sendAndWaitForReply< - SendHttpRequestResponse - >( + const { httpResponse } = await sendAndWaitForReply( event.windowContext, payload, ); @@ -189,12 +177,10 @@ function initialize() { }, async render(args) { const payload = { - type: "render_http_request_request", + type: 'render_http_request_request', ...args, } as const; - const { httpRequest } = await sendAndWaitForReply< - RenderHttpRequestResponse - >( + const { httpRequest } = await sendAndWaitForReply( event.windowContext, payload, ); @@ -207,7 +193,7 @@ function initialize() { * (eg. object), it will be recursively rendered. */ async render(args) { - const payload = { type: "template_render_request", ...args } as const; + const payload = { type: 'template_render_request', ...args } as const; const result = await sendAndWaitForReply( event.windowContext, payload, @@ -219,26 +205,31 @@ function initialize() { let plug: PluginDefinition | null = null; - async function importModule() { - const m = await import(pathMod); - if ("plugin" in m) { - plug = m.plugin; - } else { - plug = {}; - } + function importModule() { + const id = require.resolve(pathMod); + delete require.cache[id]; + plug = require(id).plugin; + } + importModule(); + + if (pkg.name?.includes('yaak-faker')) { + sendPayload( + { type: 'none' }, + { type: 'error_response', error: 'Failed to initialize Faker plugin' }, + null, + ); + return; } // Message comes into the plugin to be processed - parentPort!.on("message", async (event: InternalEvent) => { - const { windowContext, payload, id: replyId } = event; + parentPort!.on('message', async (event: InternalEvent) => { const ctx = newCtx(event); + const { windowContext, payload, id: replyId } = event; try { - if (payload.type === "boot_request") { - await importModule(); - + if (payload.type === 'boot_request') { // console.log('Plugin initialized', pkg.name, { capabilities, enableWatch }); const payload: InternalEventPayload = { - type: "boot_response", + type: 'boot_response', name: pkg.name, version: pkg.version, }; @@ -246,24 +237,21 @@ function initialize() { return; } - if (payload.type === "terminate_request") { + if (payload.type === 'terminate_request') { const payload: InternalEventPayload = { - type: "terminate_response", + type: 'terminate_response', }; sendPayload(windowContext, payload, replyId); return; } - if ( - payload.type === "import_request" && - typeof plug?.importer?.onImport === "function" - ) { + if (payload.type === 'import_request' && typeof plug?.importer?.onImport === 'function') { const reply = await plug.importer.onImport(ctx, { text: payload.content, }); if (reply != null) { const replyPayload: InternalEventPayload = { - type: "import_response", + type: 'import_response', // deno-lint-ignore no-explicit-any resources: reply.resources as any, }; @@ -274,17 +262,14 @@ function initialize() { } } - if ( - payload.type === "filter_request" && - typeof plug?.filter?.onFilter === "function" - ) { + if (payload.type === 'filter_request' && typeof plug?.filter?.onFilter === 'function') { const reply = await plug.filter.onFilter(ctx, { filter: payload.filter, payload: payload.content, mimeType: payload.type, }); const replyPayload: InternalEventPayload = { - type: "filter_response", + type: 'filter_response', content: reply.filtered, }; sendPayload(windowContext, replyPayload, replyId); @@ -292,18 +277,16 @@ function initialize() { } if ( - payload.type === "get_http_request_actions_request" && + payload.type === 'get_http_request_actions_request' && Array.isArray(plug?.httpRequestActions) ) { - const reply: HttpRequestAction[] = plug.httpRequestActions.map( - (a) => ({ - ...a, - // Add everything except onSelect - onSelect: undefined, - }), - ); + const reply: HttpRequestAction[] = plug.httpRequestActions.map((a) => ({ + ...a, + // Add everything except onSelect + onSelect: undefined, + })); const replyPayload: InternalEventPayload = { - type: "get_http_request_actions_response", + type: 'get_http_request_actions_response', pluginRefId, actions: reply, }; @@ -312,18 +295,16 @@ function initialize() { } if ( - payload.type === "get_template_functions_request" && + payload.type === 'get_template_functions_request' && Array.isArray(plug?.templateFunctions) ) { - const reply: TemplateFunction[] = plug.templateFunctions.map( - (a) => ({ - ...a, - // Add everything except render - onRender: undefined, - }), - ); + const reply: TemplateFunction[] = plug.templateFunctions.map((a) => ({ + ...a, + // Add everything except render + onRender: undefined, + })); const replyPayload: InternalEventPayload = { - type: "get_template_functions_response", + type: 'get_template_functions_response', pluginRefId, functions: reply, }; @@ -331,32 +312,26 @@ function initialize() { return; } - if ( - payload.type === "get_http_authentication_request" && - plug?.authentication - ) { + if (payload.type === 'get_http_authentication_request' && plug?.authentication) { const { onApply: _, ...auth } = plug.authentication; const replyPayload: InternalEventPayload = { ...auth, - type: "get_http_authentication_response", + type: 'get_http_authentication_response', }; sendPayload(windowContext, replyPayload, replyId); return; } - if ( - payload.type === "call_http_authentication_request" && - plug?.authentication - ) { + if (payload.type === 'call_http_authentication_request' && plug?.authentication) { const auth = plug.authentication; - if (typeof auth?.onApply === "function") { + if (typeof auth?.onApply === 'function') { const result = await auth.onApply(ctx, payload); sendPayload( windowContext, { ...result, - type: "call_http_authentication_response", + type: 'call_http_authentication_response', }, replyId, ); @@ -365,13 +340,11 @@ function initialize() { } if ( - payload.type === "call_http_request_action_request" && + payload.type === 'call_http_request_action_request' && Array.isArray(plug?.httpRequestActions) ) { - const action = plug.httpRequestActions.find( - (a) => a.key === payload.key, - ); - if (typeof action?.onSelect === "function") { + const action = plug.httpRequestActions.find((a) => a.key === payload.key); + if (typeof action?.onSelect === 'function') { await action.onSelect(ctx, payload.args); sendEmpty(windowContext, replyId); return; @@ -379,18 +352,16 @@ function initialize() { } if ( - payload.type === "call_template_function_request" && + payload.type === 'call_template_function_request' && Array.isArray(plug?.templateFunctions) ) { - const action = plug.templateFunctions.find( - (a) => a.name === payload.name, - ); - if (typeof action?.onRender === "function") { + const action = plug.templateFunctions.find((a) => a.name === payload.name); + if (typeof action?.onRender === 'function') { const result = await action.onRender(ctx, payload.args); sendPayload( windowContext, { - type: "call_template_function_response", + type: 'call_template_function_response', value: result ?? null, }, replyId, @@ -399,11 +370,19 @@ function initialize() { } } - if (payload.type === "reload_request") { + if (payload.type === 'reload_request') { await importModule(); } } catch (err) { - console.log("Plugin call threw exception", payload.type, err); + console.log('Plugin call threw exception', payload.type, err); + sendPayload( + windowContext, + { + type: 'error_response', + error: `${err}`, + }, + replyId, + ); // TODO: Return errors to server } @@ -412,16 +391,11 @@ function initialize() { }); } -try { - initialize(); -} catch (err) { - console.log("failed to boot plugin", err); -} +initialize(workerData); function genId(len = 5): string { - const alphabet = - "01234567890abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ"; - let id = ""; + const alphabet = '01234567890abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ'; + let id = ''; for (let i = 0; i < len; i++) { id += alphabet[Math.floor(Math.random() * alphabet.length)]; } @@ -429,15 +403,15 @@ function genId(len = 5): string { } function prefixStdout(s: string) { - if (!s.includes("%s")) { + if (!s.includes('%s')) { throw new Error('Console prefix must contain a "%s" replacer'); } interceptStdout((text: string) => { const lines = text.split(/\n/); - let newText = ""; + let newText = ''; for (let i = 0; i < lines.length; i++) { - if (lines[i] == "") continue; - newText += util.format(s, lines[i]) + "\n"; + if (lines[i] == '') continue; + newText += util.format(s, lines[i]) + '\n'; } return newText.trimEnd(); }); diff --git a/scripts/vendor-deno.cjs b/scripts/vendor-node.cjs similarity index 58% rename from scripts/vendor-deno.cjs rename to scripts/vendor-node.cjs index b3aee17c..1cf92a81 100644 --- a/scripts/vendor-deno.cjs +++ b/scripts/vendor-node.cjs @@ -4,7 +4,7 @@ const Downloader = require('nodejs-file-downloader'); const { rmSync, cpSync, mkdirSync, existsSync } = require('node:fs'); const { execSync } = require('node:child_process'); -const VERSION = 'v2.1.6'; +const NODE_VERSION = 'v22.9.0'; // `${process.platform}_${process.arch}` const MAC_ARM = 'darwin_arm64'; @@ -13,33 +13,33 @@ const LNX_X64 = 'linux_x64'; const WIN_X64 = 'win32_x64'; const URL_MAP = { - [MAC_ARM]: `https://github.com/denoland/deno/releases/download/${VERSION}/deno-aarch64-apple-darwin.zip`, - [MAC_X64]: `https://github.com/denoland/deno/releases/download/${VERSION}/deno-x86_64-apple-darwin.zip`, - [LNX_X64]: `https://github.com/denoland/deno/releases/download/${VERSION}/deno-x86_64-unknown-linux-gnu.zip`, - [WIN_X64]: `https://github.com/denoland/deno/releases/download/${VERSION}/deno-x86_64-pc-windows-msvc.zip`, + [MAC_ARM]: `https://nodejs.org/download/release/${NODE_VERSION}/node-${NODE_VERSION}-darwin-arm64.tar.gz`, + [MAC_X64]: `https://nodejs.org/download/release/${NODE_VERSION}/node-${NODE_VERSION}-darwin-x64.tar.gz`, + [LNX_X64]: `https://nodejs.org/download/release/${NODE_VERSION}/node-${NODE_VERSION}-linux-x64.tar.gz`, + [WIN_X64]: `https://nodejs.org/download/release/${NODE_VERSION}/node-${NODE_VERSION}-win-x64.zip`, }; const SRC_BIN_MAP = { - [MAC_ARM]: `deno`, - [MAC_X64]: `deno`, - [LNX_X64]: `deno`, - [WIN_X64]: `deno.exe`, + [MAC_ARM]: `node-${NODE_VERSION}-darwin-arm64/bin/node`, + [MAC_X64]: `node-${NODE_VERSION}-darwin-x64/bin/node`, + [LNX_X64]: `node-${NODE_VERSION}-linux-x64/bin/node`, + [WIN_X64]: `node-${NODE_VERSION}-win-x64/node.exe`, }; const DST_BIN_MAP = { - darwin_arm64: 'yaakdeno-aarch64-apple-darwin', - darwin_x64: 'yaakdeno-x86_64-apple-darwin', - linux_x64: 'yaakdeno-x86_64-unknown-linux-gnu', - win32_x64: 'yaakdeno-x86_64-pc-windows-msvc.exe', + darwin_arm64: 'yaaknode-aarch64-apple-darwin', + darwin_x64: 'yaaknode-x86_64-apple-darwin', + linux_x64: 'yaaknode-x86_64-unknown-linux-gnu', + win32_x64: 'yaaknode-x86_64-pc-windows-msvc.exe', }; const key = `${process.platform}_${process.env.YAAK_TARGET_ARCH ?? process.arch}`; -const destDir = path.join(__dirname, `..`, 'src-tauri', 'vendored', 'deno'); +const destDir = path.join(__dirname, `..`, 'src-tauri', 'vendored', 'node'); const binDest = path.join(destDir, DST_BIN_MAP[key]); -console.log(`Vendoring NodeJS ${VERSION} for ${key}`); +console.log(`Vendoring NodeJS ${NODE_VERSION} for ${key}`); -if (existsSync(binDest) && tryExecSync(`${binDest} --version`).trim() === VERSION) { +if (existsSync(binDest) && tryExecSync(`${binDest} --version`).trim() === NODE_VERSION) { console.log('NodeJS already vendored'); return; } @@ -48,12 +48,12 @@ rmSync(destDir, { recursive: true, force: true }); mkdirSync(destDir, { recursive: true }); const url = URL_MAP[key]; -const tmpDir = path.join(__dirname, 'tmp-deno'); +const tmpDir = path.join(__dirname, 'tmp-node'); rmSync(tmpDir, { recursive: true, force: true }); (async function () { // Download GitHub release artifact - console.log('Downloading Deno at', url); + console.log('Downloading NodeJS at', url); const { filePath } = await new Downloader({ url, directory: tmpDir, @@ -68,7 +68,7 @@ rmSync(tmpDir, { recursive: true, force: true }); cpSync(binSrc, binDest); rmSync(tmpDir, { recursive: true, force: true }); - console.log('Downloaded Deno to', binDest); + console.log('Downloaded NodeJS to', binDest); })().catch((err) => { console.log('Script failed:', err); process.exit(1); diff --git a/src-tauri/src/lib.rs b/src-tauri/src/lib.rs index ec6da9f0..10f76e3f 100644 --- a/src-tauri/src/lib.rs +++ b/src-tauri/src/lib.rs @@ -63,11 +63,12 @@ use yaak_models::queries::{ upsert_workspace_meta, BatchUpsertResult, UpdateSource, }; use yaak_plugins::events::{ - BootResponse, CallHttpAuthenticationRequest, CallHttpRequestActionRequest, FilterResponse, - FindHttpResponsesResponse, GetHttpAuthenticationResponse, GetHttpRequestActionsResponse, - GetHttpRequestByIdResponse, GetTemplateFunctionsResponse, HttpHeader, Icon, InternalEvent, - InternalEventPayload, PromptTextResponse, RenderHttpRequestResponse, RenderPurpose, - SendHttpRequestResponse, ShowToastRequest, TemplateRenderResponse, WindowContext, + BootResponse, CallHttpAuthenticationRequest, CallHttpRequestActionRequest, Color, + FilterResponse, FindHttpResponsesResponse, GetHttpAuthenticationResponse, + GetHttpRequestActionsResponse, GetHttpRequestByIdResponse, GetTemplateFunctionsResponse, + HttpHeader, Icon, InternalEvent, InternalEventPayload, PromptTextResponse, + RenderHttpRequestResponse, RenderPurpose, SendHttpRequestResponse, ShowToastRequest, + TemplateRenderResponse, WindowContext, }; use yaak_plugins::manager::PluginManager; use yaak_plugins::plugin_handle::PluginHandle; @@ -2291,6 +2292,21 @@ async fn handle_plugin_event( render_json_value(req.data, &base_environment, environment.as_ref(), &cb).await; Some(InternalEventPayload::TemplateRenderResponse(TemplateRenderResponse { data })) } + InternalEventPayload::ErrorResponse(resp) => { + let window = get_window_from_window_context(app_handle, &window_context) + .expect("Failed to find window for plugin reload"); + let toast_event = plugin_handle.build_event_to_send( + WindowContext::from_window(&window), + &InternalEventPayload::ShowToastRequest(ShowToastRequest { + message: resp.error, + color: Some(Color::Danger), + ..Default::default() + }), + None, + ); + Box::pin(handle_plugin_event(app_handle, &toast_event, plugin_handle)).await; + None + } InternalEventPayload::ReloadResponse(_) => { let window = get_window_from_window_context(app_handle, &window_context) .expect("Failed to find window for plugin reload"); diff --git a/src-tauri/tauri.conf.json b/src-tauri/tauri.conf.json index 60278a6c..3d78887f 100644 --- a/src-tauri/tauri.conf.json +++ b/src-tauri/tauri.conf.json @@ -45,7 +45,7 @@ "active": true, "category": "DeveloperTool", "externalBin": [ - "vendored/deno/yaakdeno", + "vendored/node/yaaknode", "vendored/protoc/yaakprotoc" ], "icon": [ diff --git a/src-tauri/vendored/plugins/auth-jwt/build/index.js b/src-tauri/vendored/plugins/auth-jwt/build/index.js index 76abaaf4..53c98111 100644 --- a/src-tauri/vendored/plugins/auth-jwt/build/index.js +++ b/src-tauri/vendored/plugins/auth-jwt/build/index.js @@ -34,34 +34,34 @@ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: tru var require_safe_buffer = __commonJS({ "../../node_modules/safe-buffer/index.js"(exports2, module2) { var buffer = require("buffer"); - var Buffer2 = buffer.Buffer; + var Buffer3 = buffer.Buffer; function copyProps(src, dst) { for (var key in src) { dst[key] = src[key]; } } - if (Buffer2.from && Buffer2.alloc && Buffer2.allocUnsafe && Buffer2.allocUnsafeSlow) { + if (Buffer3.from && Buffer3.alloc && Buffer3.allocUnsafe && Buffer3.allocUnsafeSlow) { module2.exports = buffer; } else { copyProps(buffer, exports2); exports2.Buffer = SafeBuffer; } function SafeBuffer(arg, encodingOrOffset, length) { - return Buffer2(arg, encodingOrOffset, length); + return Buffer3(arg, encodingOrOffset, length); } - SafeBuffer.prototype = Object.create(Buffer2.prototype); - copyProps(Buffer2, SafeBuffer); + SafeBuffer.prototype = Object.create(Buffer3.prototype); + copyProps(Buffer3, SafeBuffer); SafeBuffer.from = function(arg, encodingOrOffset, length) { if (typeof arg === "number") { throw new TypeError("Argument must not be a number"); } - return Buffer2(arg, encodingOrOffset, length); + return Buffer3(arg, encodingOrOffset, length); }; SafeBuffer.alloc = function(size, fill, encoding) { if (typeof size !== "number") { throw new TypeError("Argument must be a number"); } - var buf = Buffer2(size); + var buf = Buffer3(size); if (fill !== void 0) { if (typeof encoding === "string") { buf.fill(fill, encoding); @@ -77,7 +77,7 @@ var require_safe_buffer = __commonJS({ if (typeof size !== "number") { throw new TypeError("Argument must be a number"); } - return Buffer2(size); + return Buffer3(size); }; SafeBuffer.allocUnsafeSlow = function(size) { if (typeof size !== "number") { @@ -91,7 +91,7 @@ var require_safe_buffer = __commonJS({ // ../../node_modules/jws/lib/data-stream.js var require_data_stream = __commonJS({ "../../node_modules/jws/lib/data-stream.js"(exports2, module2) { - var Buffer2 = require_safe_buffer().Buffer; + var Buffer3 = require_safe_buffer().Buffer; var Stream = require("stream"); var util = require("util"); function DataStream(data) { @@ -99,11 +99,11 @@ var require_data_stream = __commonJS({ this.writable = true; this.readable = true; if (!data) { - this.buffer = Buffer2.alloc(0); + this.buffer = Buffer3.alloc(0); return this; } if (typeof data.pipe === "function") { - this.buffer = Buffer2.alloc(0); + this.buffer = Buffer3.alloc(0); data.pipe(this); return this; } @@ -121,7 +121,7 @@ var require_data_stream = __commonJS({ } util.inherits(DataStream, Stream); DataStream.prototype.write = function write(data) { - this.buffer = Buffer2.concat([this.buffer, Buffer2.from(data)]); + this.buffer = Buffer3.concat([this.buffer, Buffer3.from(data)]); this.emit("data", data); }; DataStream.prototype.end = function end(data) { @@ -140,11 +140,11 @@ var require_data_stream = __commonJS({ var require_buffer_equal_constant_time = __commonJS({ "../../node_modules/buffer-equal-constant-time/index.js"(exports2, module2) { "use strict"; - var Buffer2 = require("buffer").Buffer; + var Buffer3 = require("buffer").Buffer; var SlowBuffer = require("buffer").SlowBuffer; module2.exports = bufferEq; function bufferEq(a, b) { - if (!Buffer2.isBuffer(a) || !Buffer2.isBuffer(b)) { + if (!Buffer3.isBuffer(a) || !Buffer3.isBuffer(b)) { return false; } if (a.length !== b.length) { @@ -157,14 +157,14 @@ var require_buffer_equal_constant_time = __commonJS({ return c === 0; } bufferEq.install = function() { - Buffer2.prototype.equal = SlowBuffer.prototype.equal = function equal(that) { + Buffer3.prototype.equal = SlowBuffer.prototype.equal = function equal(that) { return bufferEq(this, that); }; }; - var origBufEqual = Buffer2.prototype.equal; + var origBufEqual = Buffer3.prototype.equal; var origSlowBufEqual = SlowBuffer.prototype.equal; bufferEq.restore = function() { - Buffer2.prototype.equal = origBufEqual; + Buffer3.prototype.equal = origBufEqual; SlowBuffer.prototype.equal = origSlowBufEqual; }; } @@ -198,7 +198,7 @@ var require_param_bytes_for_alg = __commonJS({ var require_ecdsa_sig_formatter = __commonJS({ "../../node_modules/ecdsa-sig-formatter/src/ecdsa-sig-formatter.js"(exports2, module2) { "use strict"; - var Buffer2 = require_safe_buffer().Buffer; + var Buffer3 = require_safe_buffer().Buffer; var getParamBytesForAlg = require_param_bytes_for_alg(); var MAX_OCTET = 128; var CLASS_UNIVERSAL = 0; @@ -211,10 +211,10 @@ var require_ecdsa_sig_formatter = __commonJS({ return base64.replace(/=/g, "").replace(/\+/g, "-").replace(/\//g, "_"); } function signatureAsBuffer(signature) { - if (Buffer2.isBuffer(signature)) { + if (Buffer3.isBuffer(signature)) { return signature; } else if ("string" === typeof signature) { - return Buffer2.from(signature, "base64"); + return Buffer3.from(signature, "base64"); } throw new TypeError("ECDSA signature must be a Base64 string or a Buffer"); } @@ -262,7 +262,7 @@ var require_ecdsa_sig_formatter = __commonJS({ throw new Error('Expected to consume entire buffer, but "' + (inputLength - offset) + '" bytes remain'); } var rPadding = paramBytes - rLength, sPadding = paramBytes - sLength; - var dst = Buffer2.allocUnsafe(rPadding + rLength + sPadding + sLength); + var dst = Buffer3.allocUnsafe(rPadding + rLength + sPadding + sLength); for (offset = 0; offset < rPadding; ++offset) { dst[offset] = 0; } @@ -300,7 +300,7 @@ var require_ecdsa_sig_formatter = __commonJS({ var sLength = paramBytes - sPadding; var rsBytes = 1 + 1 + rLength + 1 + 1 + sLength; var shortLength = rsBytes < MAX_OCTET; - var dst = Buffer2.allocUnsafe((shortLength ? 2 : 3) + rsBytes); + var dst = Buffer3.allocUnsafe((shortLength ? 2 : 3) + rsBytes); var offset = 0; dst[offset++] = ENCODED_TAG_SEQ; if (shortLength) { @@ -338,7 +338,7 @@ var require_ecdsa_sig_formatter = __commonJS({ var require_jwa = __commonJS({ "../../node_modules/jwa/index.js"(exports2, module2) { var bufferEqual = require_buffer_equal_constant_time(); - var Buffer2 = require_safe_buffer().Buffer; + var Buffer3 = require_safe_buffer().Buffer; var crypto = require("crypto"); var formatEcdsa = require_ecdsa_sig_formatter(); var util = require("util"); @@ -352,7 +352,7 @@ var require_jwa = __commonJS({ MSG_INVALID_SECRET += "or a KeyObject"; } function checkIsPublicKey(key) { - if (Buffer2.isBuffer(key)) { + if (Buffer3.isBuffer(key)) { return; } if (typeof key === "string") { @@ -375,7 +375,7 @@ var require_jwa = __commonJS({ } } function checkIsPrivateKey(key) { - if (Buffer2.isBuffer(key)) { + if (Buffer3.isBuffer(key)) { return; } if (typeof key === "string") { @@ -387,7 +387,7 @@ var require_jwa = __commonJS({ throw typeError(MSG_INVALID_SIGNER_KEY); } function checkIsSecretKey(key) { - if (Buffer2.isBuffer(key)) { + if (Buffer3.isBuffer(key)) { return; } if (typeof key === "string") { @@ -425,7 +425,7 @@ var require_jwa = __commonJS({ return new TypeError(errMsg); } function bufferOrString(obj) { - return Buffer2.isBuffer(obj) || typeof obj === "string"; + return Buffer3.isBuffer(obj) || typeof obj === "string"; } function normalizeInput(thing) { if (!bufferOrString(thing)) @@ -444,7 +444,7 @@ var require_jwa = __commonJS({ function createHmacVerifier(bits) { return function verify(thing, signature, secret) { var computedSig = createHmacSigner(bits)(thing, secret); - return bufferEqual(Buffer2.from(signature), Buffer2.from(computedSig)); + return bufferEqual(Buffer3.from(signature), Buffer3.from(computedSig)); }; } function createKeySigner(bits) { @@ -550,11 +550,11 @@ var require_jwa = __commonJS({ // ../../node_modules/jws/lib/tostring.js var require_tostring = __commonJS({ "../../node_modules/jws/lib/tostring.js"(exports2, module2) { - var Buffer2 = require("buffer").Buffer; + var Buffer3 = require("buffer").Buffer; module2.exports = function toString(obj) { if (typeof obj === "string") return obj; - if (typeof obj === "number" || Buffer2.isBuffer(obj)) + if (typeof obj === "number" || Buffer3.isBuffer(obj)) return obj.toString(); return JSON.stringify(obj); }; @@ -564,14 +564,14 @@ var require_tostring = __commonJS({ // ../../node_modules/jws/lib/sign-stream.js var require_sign_stream = __commonJS({ "../../node_modules/jws/lib/sign-stream.js"(exports2, module2) { - var Buffer2 = require_safe_buffer().Buffer; + var Buffer3 = require_safe_buffer().Buffer; var DataStream = require_data_stream(); var jwa = require_jwa(); var Stream = require("stream"); var toString = require_tostring(); var util = require("util"); function base64url(string, encoding) { - return Buffer2.from(string, encoding).toString("base64").replace(/=/g, "").replace(/\+/g, "-").replace(/\//g, "_"); + return Buffer3.from(string, encoding).toString("base64").replace(/=/g, "").replace(/\+/g, "-").replace(/\//g, "_"); } function jwsSecuredInput(header, payload, encoding) { encoding = encoding || "utf8"; @@ -634,7 +634,7 @@ var require_sign_stream = __commonJS({ // ../../node_modules/jws/lib/verify-stream.js var require_verify_stream = __commonJS({ "../../node_modules/jws/lib/verify-stream.js"(exports2, module2) { - var Buffer2 = require_safe_buffer().Buffer; + var Buffer3 = require_safe_buffer().Buffer; var DataStream = require_data_stream(); var jwa = require_jwa(); var Stream = require("stream"); @@ -655,7 +655,7 @@ var require_verify_stream = __commonJS({ } function headerFromJWS(jwsSig) { var encodedHeader = jwsSig.split(".", 1)[0]; - return safeJsonParse(Buffer2.from(encodedHeader, "base64").toString("binary")); + return safeJsonParse(Buffer3.from(encodedHeader, "base64").toString("binary")); } function securedInputFromJWS(jwsSig) { return jwsSig.split(".", 2).join("."); @@ -666,7 +666,7 @@ var require_verify_stream = __commonJS({ function payloadFromJWS(jwsSig, encoding) { encoding = encoding || "utf8"; var payload = jwsSig.split(".")[1]; - return Buffer2.from(payload, "base64").toString(encoding); + return Buffer3.from(payload, "base64").toString(encoding); } function isValidJws(string) { return JWS_REGEX.test(string) && !!headerFromJWS(string); @@ -3793,6 +3793,7 @@ __export(src_exports, { }); module.exports = __toCommonJS(src_exports); var import_jsonwebtoken = __toESM(require_jsonwebtoken()); +var import_node_buffer = __toESM(require("node:buffer")); var algorithms = [ "HS256", "HS384", @@ -3846,7 +3847,7 @@ var plugin = { ], async onApply(_ctx, args) { const { algorithm, secret: _secret, secretBase64, payload } = args.config; - const secret = secretBase64 ? Buffer.from(`${_secret}`, "base64") : `${_secret}`; + const secret = secretBase64 ? import_node_buffer.default.from(`${_secret}`, "base64") : `${_secret}`; const token = import_jsonwebtoken.default.sign(`${payload}`, secret, { algorithm }); const value = `Bearer ${token}`; return { setHeaders: [{ name: "Authorization", value }] }; diff --git a/src-tauri/yaak-plugins/bindings/events.ts b/src-tauri/yaak-plugins/bindings/events.ts index ff41b214..8c7b2e9f 100644 --- a/src-tauri/yaak-plugins/bindings/events.ts +++ b/src-tauri/yaak-plugins/bindings/events.ts @@ -38,6 +38,8 @@ export type EditorLanguage = "text" | "javascript" | "json" | "html" | "xml" | " export type EmptyPayload = {}; +export type ErrorResponse = { error: string, }; + export type ExportHttpRequestRequest = { httpRequest: HttpRequest, }; export type ExportHttpRequestResponse = { content: string, }; @@ -244,7 +246,7 @@ export type ImportResponse = { resources: ImportResources, }; export type InternalEvent = { id: string, pluginRefId: string, pluginName: string, replyId: string | null, payload: InternalEventPayload, windowContext: WindowContext, }; -export type InternalEventPayload = { "type": "boot_request" } & BootRequest | { "type": "boot_response" } & BootResponse | { "type": "reload_request" } & EmptyPayload | { "type": "reload_response" } & EmptyPayload | { "type": "terminate_request" } | { "type": "terminate_response" } | { "type": "import_request" } & ImportRequest | { "type": "import_response" } & ImportResponse | { "type": "filter_request" } & FilterRequest | { "type": "filter_response" } & FilterResponse | { "type": "export_http_request_request" } & ExportHttpRequestRequest | { "type": "export_http_request_response" } & ExportHttpRequestResponse | { "type": "send_http_request_request" } & SendHttpRequestRequest | { "type": "send_http_request_response" } & SendHttpRequestResponse | { "type": "get_http_request_actions_request" } & EmptyPayload | { "type": "get_http_request_actions_response" } & GetHttpRequestActionsResponse | { "type": "call_http_request_action_request" } & CallHttpRequestActionRequest | { "type": "get_template_functions_request" } | { "type": "get_template_functions_response" } & GetTemplateFunctionsResponse | { "type": "call_template_function_request" } & CallTemplateFunctionRequest | { "type": "call_template_function_response" } & CallTemplateFunctionResponse | { "type": "get_http_authentication_request" } & EmptyPayload | { "type": "get_http_authentication_response" } & GetHttpAuthenticationResponse | { "type": "call_http_authentication_request" } & CallHttpAuthenticationRequest | { "type": "call_http_authentication_response" } & CallHttpAuthenticationResponse | { "type": "copy_text_request" } & CopyTextRequest | { "type": "render_http_request_request" } & RenderHttpRequestRequest | { "type": "render_http_request_response" } & RenderHttpRequestResponse | { "type": "template_render_request" } & TemplateRenderRequest | { "type": "template_render_response" } & TemplateRenderResponse | { "type": "show_toast_request" } & ShowToastRequest | { "type": "prompt_text_request" } & PromptTextRequest | { "type": "prompt_text_response" } & PromptTextResponse | { "type": "get_http_request_by_id_request" } & GetHttpRequestByIdRequest | { "type": "get_http_request_by_id_response" } & GetHttpRequestByIdResponse | { "type": "find_http_responses_request" } & FindHttpResponsesRequest | { "type": "find_http_responses_response" } & FindHttpResponsesResponse | { "type": "empty_response" } & EmptyPayload; +export type InternalEventPayload = { "type": "boot_request" } & BootRequest | { "type": "boot_response" } & BootResponse | { "type": "reload_request" } & EmptyPayload | { "type": "reload_response" } & EmptyPayload | { "type": "terminate_request" } | { "type": "terminate_response" } | { "type": "import_request" } & ImportRequest | { "type": "import_response" } & ImportResponse | { "type": "filter_request" } & FilterRequest | { "type": "filter_response" } & FilterResponse | { "type": "export_http_request_request" } & ExportHttpRequestRequest | { "type": "export_http_request_response" } & ExportHttpRequestResponse | { "type": "send_http_request_request" } & SendHttpRequestRequest | { "type": "send_http_request_response" } & SendHttpRequestResponse | { "type": "get_http_request_actions_request" } & EmptyPayload | { "type": "get_http_request_actions_response" } & GetHttpRequestActionsResponse | { "type": "call_http_request_action_request" } & CallHttpRequestActionRequest | { "type": "get_template_functions_request" } | { "type": "get_template_functions_response" } & GetTemplateFunctionsResponse | { "type": "call_template_function_request" } & CallTemplateFunctionRequest | { "type": "call_template_function_response" } & CallTemplateFunctionResponse | { "type": "get_http_authentication_request" } & EmptyPayload | { "type": "get_http_authentication_response" } & GetHttpAuthenticationResponse | { "type": "call_http_authentication_request" } & CallHttpAuthenticationRequest | { "type": "call_http_authentication_response" } & CallHttpAuthenticationResponse | { "type": "copy_text_request" } & CopyTextRequest | { "type": "render_http_request_request" } & RenderHttpRequestRequest | { "type": "render_http_request_response" } & RenderHttpRequestResponse | { "type": "template_render_request" } & TemplateRenderRequest | { "type": "template_render_response" } & TemplateRenderResponse | { "type": "show_toast_request" } & ShowToastRequest | { "type": "prompt_text_request" } & PromptTextRequest | { "type": "prompt_text_response" } & PromptTextResponse | { "type": "get_http_request_by_id_request" } & GetHttpRequestByIdRequest | { "type": "get_http_request_by_id_response" } & GetHttpRequestByIdResponse | { "type": "find_http_responses_request" } & FindHttpResponsesRequest | { "type": "find_http_responses_response" } & FindHttpResponsesResponse | { "type": "empty_response" } & EmptyPayload | { "type": "error_response" } & ErrorResponse; export type PromptTextRequest = { id: string, title: string, label: string, description?: string, defaultValue?: string, placeholder?: string, /** diff --git a/src-tauri/yaak-plugins/src/events.rs b/src-tauri/yaak-plugins/src/events.rs index d00ad5eb..de0f0d96 100644 --- a/src-tauri/yaak-plugins/src/events.rs +++ b/src-tauri/yaak-plugins/src/events.rs @@ -96,6 +96,8 @@ pub enum InternalEventPayload { /// Returned when a plugin doesn't get run, just so the server /// has something to listen for EmptyResponse(EmptyPayload), + + ErrorResponse(ErrorResponse), } #[derive(Debug, Clone, Default, Serialize, Deserialize, TS)] @@ -103,6 +105,13 @@ pub enum InternalEventPayload { #[ts(export, type = "{}", export_to = "events.ts")] pub struct EmptyPayload {} +#[derive(Debug, Clone, Default, Serialize, Deserialize, TS)] +#[serde(default)] +#[ts(export, export_to = "events.ts")] +pub struct ErrorResponse { + pub error: String, +} + #[derive(Debug, Clone, Default, Serialize, Deserialize, TS)] #[serde(default, rename_all = "camelCase")] #[ts(export, export_to = "events.ts")] diff --git a/src-tauri/yaak-plugins/src/nodejs.rs b/src-tauri/yaak-plugins/src/nodejs.rs index f69d2bf3..aee90af3 100644 --- a/src-tauri/yaak-plugins/src/nodejs.rs +++ b/src-tauri/yaak-plugins/src/nodejs.rs @@ -20,10 +20,8 @@ pub async fn start_nodejs_plugin_runtime( addr: SocketAddr, kill_rx: &Receiver, ) -> Result<()> { - let plugin_runtime_main = app - .path() - .resolve("vendored/plugin-runtime", BaseDirectory::Resource)? - .join("index.cjs"); + let plugin_runtime_main = + app.path().resolve("vendored/plugin-runtime", BaseDirectory::Resource)?.join("index.cjs"); // HACK: Remove UNC prefix for Windows paths to pass to sidecar let plugin_runtime_main = @@ -31,12 +29,11 @@ pub async fn start_nodejs_plugin_runtime( info!("Starting plugin runtime main={}", plugin_runtime_main); - let cmd = app.shell().sidecar("yaakdeno")?.env("PORT", addr.port().to_string()).args(&[ - "run", - "--allow-all", // Must have all permissions to give child workers permissions - "--unstable-sloppy-imports", // To have `./foo/bar` imports - &plugin_runtime_main, - ]); + let cmd = app + .shell() + .sidecar("yaaknode")? + .env("YAAK_PLUGIN_RUNTIME_PORT", addr.port().to_string()) + .args(&[&plugin_runtime_main]); let (mut child_rx, child) = cmd.spawn()?; info!("Spawned plugin runtime"); diff --git a/src-tauri/yaak-sync/bindings/sync.ts b/src-tauri/yaak-sync/bindings/sync.ts index e486cc48..d3fde759 100644 --- a/src-tauri/yaak-sync/bindings/sync.ts +++ b/src-tauri/yaak-sync/bindings/sync.ts @@ -1,6 +1,6 @@ // This file was generated by [ts-rs](https://github.com/Aleph-Alpha/ts-rs). Do not edit this file manually. -import type { SyncModel } from "./models"; -import type { SyncState } from "./models"; +import type { SyncModel } from "./models.js"; +import type { SyncState } from "./models.js"; export type FsCandidate = { "type": "FsCandidate", model: SyncModel, relPath: string, checksum: string, };