From 07bccbf84a524d831266e2649312ec45bcd8fd3d Mon Sep 17 00:00:00 2001 From: Anant Rai Date: Sun, 4 May 2025 22:51:31 -0700 Subject: [PATCH 1/2] added changes to allow for using fetch calls and async calls in user script --- .../UserScriptPlayer/runtimeWorker/index.ts | 4 ++-- .../runtimeWorker/registry.ts | 12 +++++++---- .../transformerWorker/index.ts | 2 +- .../transformerWorker/typescript/ast.ts | 6 +++++- .../transformerWorker/typescript/lib.ts | 8 +++++-- yarn.lock | 21 +++++++++++++++++++ 6 files changed, 43 insertions(+), 10 deletions(-) diff --git a/packages/suite-base/src/players/UserScriptPlayer/runtimeWorker/index.ts b/packages/suite-base/src/players/UserScriptPlayer/runtimeWorker/index.ts index 61bfaba..8acd927 100644 --- a/packages/suite-base/src/players/UserScriptPlayer/runtimeWorker/index.ts +++ b/packages/suite-base/src/players/UserScriptPlayer/runtimeWorker/index.ts @@ -57,8 +57,8 @@ if (!inSharedWorker()) { ); }; - // Just check fetch is blocked on registration, don't slow down message processing. - rpc.receive("registerScript", enforceFetchIsBlocked(registerScript)); + // Allow fetch in user scripts at runtime by removing the CSP wrapper: + rpc.receive("registerScript", registerScript); rpc.receive("processMessage", processMessage); port.start(); diff --git a/packages/suite-base/src/players/UserScriptPlayer/runtimeWorker/registry.ts b/packages/suite-base/src/players/UserScriptPlayer/runtimeWorker/registry.ts index 6be5354..be42bf6 100644 --- a/packages/suite-base/src/players/UserScriptPlayer/runtimeWorker/registry.ts +++ b/packages/suite-base/src/players/UserScriptPlayer/runtimeWorker/registry.ts @@ -135,13 +135,13 @@ export const registerScript = ({ } }; -export const processMessage = ({ +export const processMessage = async ({ message, globalVariables, }: { message: unknown; globalVariables: GlobalVariables; -}): ProcessMessageOutput => { +}): Promise => { const userScriptLogs: UserScriptLog[] = []; const userScriptDiagnostics: Diagnostic[] = []; (self as { log?: unknown }).log = function (...args: unknown[]) { @@ -157,8 +157,12 @@ export const processMessage = ({ userScriptLogs.push(...args.map((value) => ({ source: "processMessage" as const, value }))); }; try { - const newMessage = nodeCallback(message, globalVariables); - return { message: newMessage, error: undefined, userScriptLogs, userScriptDiagnostics }; + // Invoke the user script; if it's async, await its completion + const result = await (async () => { + const r = nodeCallback(message, globalVariables); + return Promise.resolve(r); + })(); + return { message: result, error: undefined, userScriptLogs, userScriptDiagnostics }; } catch (err) { const error: string = err.toString(); const diagnostic: Diagnostic = { diff --git a/packages/suite-base/src/players/UserScriptPlayer/transformerWorker/index.ts b/packages/suite-base/src/players/UserScriptPlayer/transformerWorker/index.ts index 0719edd..09b06e2 100644 --- a/packages/suite-base/src/players/UserScriptPlayer/transformerWorker/index.ts +++ b/packages/suite-base/src/players/UserScriptPlayer/transformerWorker/index.ts @@ -69,7 +69,7 @@ if (!inSharedWorker()) { rpc.receive("close", () => { global.close(); }); - rpc.receive("transform", enforceFetchIsBlocked(transform)); + rpc.receive("transform", transform); rpc.receive("generateRosLib", generateRosLib); port.start(); }; diff --git a/packages/suite-base/src/players/UserScriptPlayer/transformerWorker/typescript/ast.ts b/packages/suite-base/src/players/UserScriptPlayer/transformerWorker/typescript/ast.ts index b96078a..32872ae 100644 --- a/packages/suite-base/src/players/UserScriptPlayer/transformerWorker/typescript/ast.ts +++ b/packages/suite-base/src/players/UserScriptPlayer/transformerWorker/typescript/ast.ts @@ -200,8 +200,12 @@ export const findReturnType = ( throw new DatatypeExtractionError(nonFuncError); } + // Determine the actual return type, unwrapping Promise if needed const fullReturnType = typeChecker.getReturnTypeOfSignature(signature); - const nonNullable = fullReturnType.getNonNullableType(); + // If it's a Promise, get the promised inner type; otherwise use as-is + const unwrappedType = + typeChecker.getPromisedTypeOfPromise(fullReturnType) ?? fullReturnType; + const nonNullable = unwrappedType.getNonNullableType(); // In some future we could support intersection types where all the fields are known if (nonNullable.isIntersection()) { diff --git a/packages/suite-base/src/players/UserScriptPlayer/transformerWorker/typescript/lib.ts b/packages/suite-base/src/players/UserScriptPlayer/transformerWorker/typescript/lib.ts index 2a9e985..480bdca 100644 --- a/packages/suite-base/src/players/UserScriptPlayer/transformerWorker/typescript/lib.ts +++ b/packages/suite-base/src/players/UserScriptPlayer/transformerWorker/typescript/lib.ts @@ -61,6 +61,8 @@ import lib_es2022_regexp from "typescript/lib/lib.es2022.regexp.d.ts?raw"; import lib_es2022_sharedmemory from "typescript/lib/lib.es2022.sharedmemory.d.ts?raw"; import lib_es2022_string from "typescript/lib/lib.es2022.string.d.ts?raw"; import lib_es5_dts from "typescript/lib/lib.es5.d.ts?raw"; +import lib_dom_dts from "typescript/lib/lib.dom.d.ts?raw"; +import lib_dom_iterable_dts from "typescript/lib/lib.dom.iterable.d.ts?raw"; export const lib_filename = "lib.d.ts"; @@ -147,5 +149,7 @@ function resolveReferences(originalSrc: string): string { }); } -const resolvedDts = resolveReferences(lib_es2022_dts); -export const lib_dts = `${resolvedDts}\n\n${lib_logger}`; +const resolvedEsDts = resolveReferences(lib_es2022_dts); +const resolvedDomDts = resolveReferences(lib_dom_dts); +const resolvedDomIterableDts = resolveReferences(lib_dom_iterable_dts); +export const lib_dts = `${resolvedEsDts}\n\n${resolvedDomDts}\n\n${resolvedDomIterableDts}\n\n${lib_logger}`; diff --git a/yarn.lock b/yarn.lock index facfb8f..5e9361f 100644 --- a/yarn.lock +++ b/yarn.lock @@ -2756,6 +2756,17 @@ __metadata: languageName: node linkType: hard +"@foxglove/my-background-processor@workspace:packages/my-background-processor": + version: 0.0.0-use.local + resolution: "@foxglove/my-background-processor@workspace:packages/my-background-processor" + dependencies: + react: "npm:^17.0.0" + typescript: "npm:5.3.3" + peerDependencies: + "@foxglove/studio": "*" + languageName: unknown + linkType: soft + "@foxglove/rosmsg-msgs-common@npm:^3.0.0": version: 3.2.1 resolution: "@foxglove/rosmsg-msgs-common@npm:3.2.1" @@ -18624,6 +18635,16 @@ __metadata: languageName: node linkType: hard +"react@npm:^17.0.0": + version: 17.0.2 + resolution: "react@npm:17.0.2" + dependencies: + loose-envify: "npm:^1.1.0" + object-assign: "npm:^4.1.1" + checksum: 10c0/07ae8959acf1596f0550685102fd6097d461a54a4fd46a50f88a0cd7daaa97fdd6415de1dcb4bfe0da6aa43221a6746ce380410fa848acc60f8ac41f6649c148 + languageName: node + linkType: hard + "read-binary-file-arch@npm:^1.0.6": version: 1.0.6 resolution: "read-binary-file-arch@npm:1.0.6" From 1b359c2317421c2b1d80a26d96e4570f85095d37 Mon Sep 17 00:00:00 2001 From: Anant Rai Date: Sun, 4 May 2025 23:01:56 -0700 Subject: [PATCH 2/2] removed redundand changes --- yarn.lock | 21 --------------------- 1 file changed, 21 deletions(-) diff --git a/yarn.lock b/yarn.lock index 5e9361f..facfb8f 100644 --- a/yarn.lock +++ b/yarn.lock @@ -2756,17 +2756,6 @@ __metadata: languageName: node linkType: hard -"@foxglove/my-background-processor@workspace:packages/my-background-processor": - version: 0.0.0-use.local - resolution: "@foxglove/my-background-processor@workspace:packages/my-background-processor" - dependencies: - react: "npm:^17.0.0" - typescript: "npm:5.3.3" - peerDependencies: - "@foxglove/studio": "*" - languageName: unknown - linkType: soft - "@foxglove/rosmsg-msgs-common@npm:^3.0.0": version: 3.2.1 resolution: "@foxglove/rosmsg-msgs-common@npm:3.2.1" @@ -18635,16 +18624,6 @@ __metadata: languageName: node linkType: hard -"react@npm:^17.0.0": - version: 17.0.2 - resolution: "react@npm:17.0.2" - dependencies: - loose-envify: "npm:^1.1.0" - object-assign: "npm:^4.1.1" - checksum: 10c0/07ae8959acf1596f0550685102fd6097d461a54a4fd46a50f88a0cd7daaa97fdd6415de1dcb4bfe0da6aa43221a6746ce380410fa848acc60f8ac41f6649c148 - languageName: node - linkType: hard - "read-binary-file-arch@npm:^1.0.6": version: 1.0.6 resolution: "read-binary-file-arch@npm:1.0.6"