Skip to content

Commit 15a2c91

Browse files
author
Akim
authored
chore: fix build [fixes DXJ-482] (#352)
* Remove additional node targeted build * Fix test errors * Typo fix * Remove headless * Prevent JSON error * Cache json parsing * Remove resource test as it's not working in new nox * Fix test output * enable smoke tests * add puppeteer to deps * Remove headless option
1 parent 63e4ce3 commit 15a2c91

File tree

22 files changed

+384
-676
lines changed

22 files changed

+384
-676
lines changed

.github/workflows/tests.yml

+1-1
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@ on:
66
nox-image:
77
description: "nox image tag"
88
type: string
9-
default: "fluencelabs/nox:minimal_0.2.5"
9+
default: "fluencelabs/nox:minimal_0.2.9"
1010
avm-version:
1111
description: "@fluencelabs/avm version"
1212
type: string

packages/@tests/aqua/src/index.ts

+1-11
Original file line numberDiff line numberDiff line change
@@ -53,15 +53,6 @@ export const runTest = async (): Promise<TestResult> => {
5353
console.log('my peer id: ', client.getPeerId());
5454
console.log('my sk id: ', fromByteArray(client.getPeerSecretKey()));
5555

56-
console.log('running resource test...');
57-
const [res, errors] = await resourceTest('my_resource');
58-
if (res === null) {
59-
console.log('resource test failed, errors', errors);
60-
return { type: 'failure', error: errors.join(', ') };
61-
} else {
62-
console.log('resource test finished, result', res);
63-
}
64-
6556
console.log('running hello test...');
6657
const hello = await helloTest();
6758
console.log('hello test finished, result: ', hello);
@@ -75,9 +66,8 @@ export const runTest = async (): Promise<TestResult> => {
7566
console.log('marine test finished, result: ', marine);
7667

7768
const returnVal = {
78-
res,
7969
hello,
80-
// marine,
70+
marine,
8171
};
8272
return { type: 'success', data: JSON.stringify(returnVal) };
8373
} finally {

packages/@tests/smoke/node/package.json

+1-1
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@
1111
"type": "module",
1212
"scripts": {
1313
"build": "tsc",
14-
"test_commented_out": "node --loader ts-node/esm ./src/index.ts"
14+
"test": "node --loader ts-node/esm ./src/index.ts"
1515
},
1616
"repository": "https://github.com/fluencelabs/fluence-js",
1717
"author": "Fluence Labs",

packages/@tests/smoke/web-cra-ts/package.json

+3-2
Original file line numberDiff line numberDiff line change
@@ -19,10 +19,11 @@
1919
"web-vitals": "2.1.4"
2020
},
2121
"devDependencies": {
22-
"@test/test-utils": "workspace:^"
22+
"@test/test-utils": "workspace:^",
23+
"puppeteer": "19.7.2"
2324
},
2425
"scripts": {
25-
"test_commented_out": "node --loader ts-node/esm ./test/index.ts",
26+
"test": "node --loader ts-node/esm ./test/index.ts",
2627
"simulate-cdn": "http-server -p 8766 ../../../client/js-client.web.standalone/dist",
2728
"start": "react-scripts start",
2829
"build": "react-scripts build",

packages/@tests/smoke/web-cra-ts/test/index.ts

+1-1
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,7 @@ const test = async () => {
1919
}
2020

2121
console.log('starting puppeteer...');
22-
const browser = await puppeteer.launch({ headless: false });
22+
const browser = await puppeteer.launch();
2323
const page = (await browser.pages())[0];
2424

2525
// uncomment to debug what's happening inside the browser

packages/@tests/smoke/web/package.json

+4-2
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@
1212
"scripts": {
1313
"build": "tsc",
1414
"simulate-cdn": "http-server -p 8765 ../../../client/js-client.web.standalone/dist",
15-
"test_commented_out": "node --loader ts-node/esm ./src/index.ts",
15+
"test": "node --loader ts-node/esm ./src/index.ts",
1616
"serve": "http-server public"
1717
},
1818
"repository": "https://github.com/fluencelabs/fluence-js",
@@ -22,5 +22,7 @@
2222
"@fluencelabs/js-client": "workspace:^",
2323
"@test/test-utils": "workspace:../../test-utils"
2424
},
25-
"devDependencies": {}
25+
"devDependencies": {
26+
"puppeteer": "19.7.2"
27+
}
2628
}

packages/core/js-client/build.ts

-102
This file was deleted.

packages/core/js-client/package.json

+8-10
Original file line numberDiff line numberDiff line change
@@ -9,17 +9,17 @@
99
"files": [
1010
"dist"
1111
],
12-
"main": "./dist/browser/index.js",
13-
"unpkg": "./dist/browser/index.js",
14-
"types": "./dist/types/index.d.ts",
12+
"main": "./dist/index.js",
13+
"unpkg": "./dist/browser/index.umd.js",
14+
"types": "./dist/index.d.ts",
1515
"exports": {
16-
"types": "./dist/types/index.d.ts",
17-
"node": "./dist/node/index.js",
16+
"types": "./dist/index.d.ts",
17+
"node": "./dist/index.js",
1818
"default": "./dist/browser/index.js"
1919
},
2020
"type": "module",
2121
"scripts": {
22-
"build": "node --loader ts-node/esm build.ts && tsc --emitDeclarationOnly",
22+
"build": "tsc && vite build",
2323
"test": "vitest --threads false run"
2424
},
2525
"repository": "https://github.com/fluencelabs/fluence-js",
@@ -29,6 +29,7 @@
2929
"@chainsafe/libp2p-noise": "13.0.0",
3030
"@chainsafe/libp2p-yamux": "5.0.0",
3131
"@fluencelabs/interfaces": "workspace:*",
32+
"@fluencelabs/marine-worker": "0.3.3",
3233
"@libp2p/crypto": "2.0.3",
3334
"@libp2p/interface": "0.1.2",
3435
"@libp2p/peer-id": "3.0.2",
@@ -55,15 +56,12 @@
5556
"@fluencelabs/aqua-api": "0.9.3",
5657
"@fluencelabs/avm": "0.48.0",
5758
"@fluencelabs/marine-js": "0.7.2",
58-
"@fluencelabs/marine-worker": "workspace:*",
59-
"@laynezh/vite-plugin-lib-assets": "0.5.2",
6059
"@rollup/plugin-inject": "5.0.3",
6160
"@types/bs58": "4.0.1",
6261
"@types/debug": "4.1.7",
62+
"@types/node": "20.7.0",
6363
"@types/uuid": "8.3.2",
64-
"node-stdlib-browser": "1.2.0",
6564
"vite": "4.0.4",
66-
"vite-plugin-replace": "0.1.1",
6765
"vite-tsconfig-paths": "4.0.3",
6866
"vitest": "0.29.7"
6967
}

packages/core/js-client/src/fetchers/browser.ts

+23-2
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,27 @@
1414
* limitations under the License.
1515
*/
1616

17-
export async function fetchResource(assetPath: string, version: string) {
18-
return fetch(new globalThis.URL(`@fluencelabs/js-client@${version}/dist` + assetPath, `https://unpkg.com/`));
17+
interface PackageJsonContent {
18+
dependencies: Record<string, string | undefined>;
19+
devDependencies: Record<string, string | undefined>;
20+
}
21+
22+
// This will be substituted in build phase
23+
const packageJsonContentString = `__PACKAGE_JSON_CONTENT__`;
24+
let parsedPackageJsonContent: PackageJsonContent;
25+
26+
const PRIMARY_CDN = "https://unpkg.com/";
27+
28+
export async function fetchResource(pkg: string, assetPath: string) {
29+
const packageJsonContent = parsedPackageJsonContent || (parsedPackageJsonContent = JSON.parse(packageJsonContentString));
30+
const version = packageJsonContent.dependencies[pkg] || packageJsonContent.devDependencies[pkg];
31+
32+
if (version === undefined) {
33+
const availableDeps = [...Object.keys(packageJsonContent.dependencies), ...Object.keys(packageJsonContent.devDependencies)];
34+
throw new Error(`Cannot find version of ${pkg} in package.json. Available versions: ${availableDeps.join(',')}`);
35+
}
36+
37+
const refinedAssetPath = assetPath.startsWith('/') ? assetPath.slice(1) : assetPath;
38+
39+
return fetch(new globalThis.URL(`${pkg}@${version}/` + refinedAssetPath, PRIMARY_CDN));
1940
}

packages/core/js-client/src/fetchers/index.ts

+3-3
Original file line numberDiff line numberDiff line change
@@ -20,11 +20,11 @@ import process from 'process';
2020

2121
const isNode = typeof process !== 'undefined' && process?.release?.name === 'node';
2222

23-
export async function fetchResource(assetPath: string, version: string) {
23+
export async function fetchResource(pkg: string, path: string) {
2424
switch (true) {
2525
case isNode:
26-
return fetchResourceNode(assetPath, version);
26+
return fetchResourceNode(pkg, path);
2727
default:
28-
return fetchResourceBrowser(assetPath, version);
28+
return fetchResourceBrowser(pkg, path);
2929
}
3030
}

packages/core/js-client/src/fetchers/node.ts

+21-6
Original file line numberDiff line numberDiff line change
@@ -15,22 +15,37 @@
1515
*/
1616

1717
import fs from 'fs';
18-
import url from 'url';
1918
import path from 'path';
19+
import module from 'module';
2020

21-
export async function fetchResource(assetPath: string, version: string) {
21+
export async function fetchResource(pkg: string, assetPath: string) {
22+
const require = module.createRequire(import.meta.url);
23+
const packagePathIndex = require.resolve(pkg);
24+
25+
// Ensure that windows path is converted to posix path. So we can find a package
26+
const posixPath = packagePathIndex.split(path.sep).join(path.posix.sep);
27+
28+
const matches = new RegExp(`(.+${pkg})`).exec(posixPath);
29+
30+
const packagePath = matches?.[0];
31+
32+
if (!packagePath) {
33+
throw new Error(`Cannot find dependency ${pkg} in path ${posixPath}`);
34+
}
35+
36+
const pathToResource = path.join(packagePath, assetPath);
37+
2238
const file = await new Promise<ArrayBuffer>((resolve, reject) => {
2339
// Cannot use 'fs/promises' with current vite config. This module is not polyfilled by default.
24-
const root = path.dirname(url.fileURLToPath(import.meta.url));
25-
const workerFilePath = path.join(root, '..', assetPath);
26-
fs.readFile(workerFilePath, (err, data) => {
40+
fs.readFile(pathToResource, (err, data) => {
2741
if (err) {
2842
reject(err);
2943
return;
3044
}
3145
resolve(data);
3246
});
33-
});
47+
});
48+
3449
return new Response(file, {
3550
headers: {
3651
'Content-type':

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

+17-13
Original file line numberDiff line numberDiff line change
@@ -23,28 +23,32 @@ import { BlobWorker, Worker } from 'threads';
2323
import { doRegisterNodeUtils } from './services/NodeUtils.js';
2424
import { fetchResource } from './fetchers/index.js';
2525
import process from 'process';
26-
27-
import avmWasmUrl from '../node_modules/@fluencelabs/avm/dist/avm.wasm?url';
28-
import marineJsWasmUrl from '../node_modules/@fluencelabs/marine-js/dist/marine-js.wasm?url';
29-
import workerCodeUrl from '../node_modules/@fluencelabs/marine-worker/dist/__ENV__/marine-worker.umd.cjs?url';
30-
31-
const JS_CLIENT_VERSION = '__JS_CLIENT_VERSION__';
26+
import path from 'path';
27+
import url from 'url';
28+
import module from 'module';
3229

3330
const isNode = typeof process !== 'undefined' && process?.release?.name === 'node';
3431

35-
const fetchWorkerCode = () => fetchResource(workerCodeUrl, JS_CLIENT_VERSION).then(res => res.text());
36-
const fetchMarineJsWasm = () => fetchResource(marineJsWasmUrl, JS_CLIENT_VERSION).then(res => res.arrayBuffer());
37-
const fetchAvmWasm = () => fetchResource(avmWasmUrl, JS_CLIENT_VERSION).then(res => res.arrayBuffer());
32+
const fetchWorkerCode = () => fetchResource('@fluencelabs/marine-worker', '/dist/browser/marine-worker.umd.cjs').then(res => res.text());
33+
const fetchMarineJsWasm = () => fetchResource('@fluencelabs/marine-js', '/dist/marine-js.wasm').then(res => res.arrayBuffer());
34+
const fetchAvmWasm = () => fetchResource('@fluencelabs/avm', '/dist/avm.wasm').then(res => res.arrayBuffer());
3835

3936
const createClient = async (relay: RelayOptions, config: ClientConfig): Promise<IFluenceClient> => {
40-
const workerCode = await fetchWorkerCode();
41-
4237
const marineJsWasm = await fetchMarineJsWasm();
4338
const avmWasm = await fetchAvmWasm();
4439

4540
const marine = new MarineBackgroundRunner({
46-
getValue() {
47-
return BlobWorker.fromText(workerCode)
41+
async getValue() {
42+
if (isNode) {
43+
const require = module.createRequire(import.meta.url);
44+
const pathToThisFile = path.dirname(url.fileURLToPath(import.meta.url));
45+
const pathToWorker = require.resolve('@fluencelabs/marine-worker');
46+
const relativePathToWorker = path.relative(pathToThisFile, pathToWorker);
47+
return new Worker(relativePathToWorker);
48+
} else {
49+
const workerCode = await fetchWorkerCode();
50+
return BlobWorker.fromText(workerCode)
51+
}
4852
},
4953
start() {
5054
return Promise.resolve(undefined);

packages/core/js-client/src/marine/worker-script/workerLoader.ts

+1-1
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,6 @@ import { LazyLoader } from '../interfaces.js';
2121

2222
export class WorkerLoader extends LazyLoader<WorkerImplementation> {
2323
constructor() {
24-
super(() => new Worker('../../../node_modules/@fluencelabs/marine-worker/dist/node/marine-worker.umd.cjs'));
24+
super(() => new Worker('../../../node_modules/@fluencelabs/marine-worker/dist/index.js'));
2525
}
2626
}

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

+1-1
Original file line numberDiff line numberDiff line change
@@ -57,7 +57,7 @@ export class MarineBackgroundRunner implements IMarineHost {
5757
await this.avmWasmLoader.start();
5858

5959
await this.workerLoader.start();
60-
const worker = this.workerLoader.getValue();
60+
const worker = await this.workerLoader.getValue();
6161

6262
const workerThread = await spawn<MarineBackgroundInterface>(worker);
6363
const logfn: LogFunction = (message) => {

0 commit comments

Comments
 (0)