Skip to content
This repository was archived by the owner on Jul 10, 2025. It is now read-only.

Commit f5425b4

Browse files
author
Akim
authored
fix: Enable async loading of all dependency resources (#408)
* Async loading * Fix lint
1 parent 1e42e58 commit f5425b4

File tree

6 files changed

+27
-54
lines changed

6 files changed

+27
-54
lines changed

packages/core/js-client-isomorphic/src/types.ts

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,8 @@
1414
* limitations under the License.
1515
*/
1616

17-
import { Worker } from "@fluencelabs/threads/master";
17+
import type { MarineBackgroundInterface } from "@fluencelabs/marine-worker";
18+
import { ModuleThread } from "@fluencelabs/threads/master";
1819

1920
import versions from "./versions.js";
2021

@@ -23,7 +24,7 @@ type VersionedPackage = { name: string; version: string };
2324
export type GetWorkerFn = (
2425
pkg: FetchedPackages,
2526
CDNUrl: string,
26-
) => Promise<Worker>;
27+
) => Promise<ModuleThread<MarineBackgroundInterface>>;
2728

2829
export const getVersionedPackage = (pkg: FetchedPackages): VersionedPackage => {
2930
return {

packages/core/js-client-isomorphic/src/worker-resolvers/browser.ts

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,8 @@
1414
* limitations under the License.
1515
*/
1616

17-
import { BlobWorker } from "@fluencelabs/threads/master";
17+
import type { MarineBackgroundInterface } from "@fluencelabs/marine-worker";
18+
import { BlobWorker, ModuleThread, spawn } from "@fluencelabs/threads/master";
1819

1920
import { fetchResource } from "../fetchers/browser.js";
2021
import type { FetchedPackages, GetWorkerFn } from "../types.js";
@@ -34,5 +35,9 @@ export const getWorker: GetWorkerFn = async (
3435
};
3536

3637
const workerCode = await fetchWorkerCode();
37-
return BlobWorker.fromText(workerCode);
38+
39+
const workerThread: ModuleThread<MarineBackgroundInterface> =
40+
await spawn<MarineBackgroundInterface>(BlobWorker.fromText(workerCode));
41+
42+
return workerThread;
3843
};

packages/core/js-client-isomorphic/src/worker-resolvers/node.ts

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -18,12 +18,13 @@ import { createRequire } from "module";
1818
import { dirname, relative } from "path";
1919
import { fileURLToPath } from "url";
2020

21-
import { Worker } from "@fluencelabs/threads/master";
21+
import type { MarineBackgroundInterface } from "@fluencelabs/marine-worker";
22+
import { ModuleThread, spawn, Worker } from "@fluencelabs/threads/master";
2223

2324
import type { FetchedPackages, GetWorkerFn } from "../types.js";
2425
import { getVersionedPackage } from "../types.js";
2526

26-
export const getWorker: GetWorkerFn = (pkg: FetchedPackages) => {
27+
export const getWorker: GetWorkerFn = async (pkg: FetchedPackages) => {
2728
const require = createRequire(import.meta.url);
2829

2930
const pathToThisFile = dirname(fileURLToPath(import.meta.url));
@@ -33,5 +34,8 @@ export const getWorker: GetWorkerFn = (pkg: FetchedPackages) => {
3334

3435
const relativePathToWorker = relative(pathToThisFile, pathToWorker);
3536

36-
return Promise.resolve(new Worker(relativePathToWorker));
37+
const workerThread: ModuleThread<MarineBackgroundInterface> =
38+
await spawn<MarineBackgroundInterface>(new Worker(relativePathToWorker));
39+
40+
return workerThread;
3741
};

packages/core/js-client/src/jsPeer/FluencePeer.ts

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -356,9 +356,8 @@ export abstract class FluencePeer {
356356
await this.connection.sendParticle(item.result.nextPeerPks, newParticle);
357357
log_particle.trace("id %s. send successful", newParticle.id);
358358
} catch (e) {
359-
log_particle.error("id %s. send failed %j", newParticle.id, e);
360-
361359
const message = getErrorMessage(e);
360+
log_particle.error("id %s. send failed %s", newParticle.id, message);
362361

363362
item.onError(
364363
new SendError(

packages/core/js-client/src/marine/loader.ts

Lines changed: 5 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -16,18 +16,19 @@
1616

1717
import { fetchResource } from "@fluencelabs/js-client-isomorphic/fetcher";
1818
import { getWorker } from "@fluencelabs/js-client-isomorphic/worker-resolver";
19-
import { Worker } from "@fluencelabs/threads/master";
19+
import type { MarineBackgroundInterface } from "@fluencelabs/marine-worker";
20+
import type { ModuleThread } from "@fluencelabs/threads/master";
2021

2122
type StrategyReturnType = [
2223
marineJsWasm: ArrayBuffer,
2324
avmWasm: ArrayBuffer,
24-
worker: Worker,
25+
worker: ModuleThread<MarineBackgroundInterface>,
2526
];
2627

2728
export const loadMarineDeps = async (
2829
CDNUrl: string,
2930
): Promise<StrategyReturnType> => {
30-
const [marineJsWasm, avmWasm] = await Promise.all([
31+
const [marineJsWasm, avmWasm, worker] = await Promise.all([
3132
fetchResource(
3233
"@fluencelabs/marine-js",
3334
"/dist/marine-js.wasm",
@@ -38,10 +39,8 @@ export const loadMarineDeps = async (
3839
fetchResource("@fluencelabs/avm", "/dist/avm.wasm", CDNUrl).then((res) => {
3940
return res.arrayBuffer();
4041
}),
42+
getWorker("@fluencelabs/marine-worker", CDNUrl),
4143
]);
4244

43-
// TODO: load worker in parallel with avm and marine, test that it works
44-
const worker = await getWorker("@fluencelabs/marine-worker", CDNUrl);
45-
4645
return [marineJsWasm, avmWasm, worker];
4746
};

packages/core/js-client/src/marine/worker/index.ts

Lines changed: 4 additions & 39 deletions
Original file line numberDiff line numberDiff line change
@@ -21,51 +21,29 @@ import type {
2121
JSONValueNonNullable,
2222
CallParameters,
2323
} from "@fluencelabs/marine-worker";
24-
import {
25-
ModuleThread,
26-
Thread,
27-
spawn,
28-
Worker,
29-
} from "@fluencelabs/threads/master";
24+
import { ModuleThread, Thread } from "@fluencelabs/threads/master";
3025

3126
import { MarineLogger, marineLogger } from "../../util/logger.js";
3227
import { IMarineHost } from "../interfaces.js";
3328

3429
export class MarineBackgroundRunner implements IMarineHost {
35-
private workerThread?: ModuleThread<MarineBackgroundInterface>;
36-
3730
private loggers = new Map<string, MarineLogger>();
3831

3932
constructor(
4033
private marineJsWasm: ArrayBuffer,
4134
private avmWasm: ArrayBuffer,
42-
private worker: Worker,
35+
private workerThread: ModuleThread<MarineBackgroundInterface>,
4336
) {}
4437

4538
async hasService(serviceId: string) {
46-
if (this.workerThread === undefined) {
47-
throw new Error("Worker is not initialized");
48-
}
49-
5039
return this.workerThread.hasService(serviceId);
5140
}
5241

5342
async removeService(serviceId: string) {
54-
if (this.workerThread === undefined) {
55-
throw new Error("Worker is not initialized");
56-
}
57-
5843
await this.workerThread.removeService(serviceId);
5944
}
6045

6146
async start(): Promise<void> {
62-
if (this.workerThread !== undefined) {
63-
throw new Error("Worker thread already initialized");
64-
}
65-
66-
const workerThread: ModuleThread<MarineBackgroundInterface> =
67-
await spawn<MarineBackgroundInterface>(this.worker);
68-
6947
const logfn: LogFunction = (message) => {
7048
const serviceLogger = this.loggers.get(message.service);
7149

@@ -76,20 +54,15 @@ export class MarineBackgroundRunner implements IMarineHost {
7654
serviceLogger[message.level](message.message);
7755
};
7856

79-
workerThread.onLogMessage().subscribe(logfn);
80-
await workerThread.init(this.marineJsWasm);
81-
this.workerThread = workerThread;
57+
this.workerThread.onLogMessage().subscribe(logfn);
58+
await this.workerThread.init(this.marineJsWasm);
8259
await this.createService(this.avmWasm, "avm");
8360
}
8461

8562
async createService(
8663
serviceModule: ArrayBuffer | SharedArrayBuffer,
8764
serviceId: string,
8865
): Promise<void> {
89-
if (this.workerThread === undefined) {
90-
throw new Error("Worker is not initialized");
91-
}
92-
9366
this.loggers.set(serviceId, marineLogger(serviceId));
9467
await this.workerThread.createService(serviceModule, serviceId);
9568
}
@@ -100,10 +73,6 @@ export class MarineBackgroundRunner implements IMarineHost {
10073
args: Array<JSONValueNonNullable> | Record<string, JSONValueNonNullable>,
10174
callParams?: CallParameters,
10275
): Promise<JSONValue> {
103-
if (this.workerThread === undefined) {
104-
throw new Error("Worker is not initialized");
105-
}
106-
10776
return this.workerThread.callService(
10877
serviceId,
10978
functionName,
@@ -113,10 +82,6 @@ export class MarineBackgroundRunner implements IMarineHost {
11382
}
11483

11584
async stop(): Promise<void> {
116-
if (this.workerThread === undefined) {
117-
return;
118-
}
119-
12085
await this.workerThread.terminate();
12186
await Thread.terminate(this.workerThread);
12287
}

0 commit comments

Comments
 (0)