From 3635fbbdfd5210700dfe5621731bf95161f5281e Mon Sep 17 00:00:00 2001 From: Akim Mamedov Date: Mon, 23 Oct 2023 15:22:22 +0700 Subject: [PATCH 01/23] Update README --- README.md | 106 ++++++-------- packages/core/js-client/README.md | 11 -- packages/core/js-client/package.json | 11 +- packages/core/js-client/src/index.ts | 33 +---- packages/core/js-client/src/network.ts | 190 +++++++++++++++++++++++++ packages/core/js-client/tsconfig.json | 1 - 6 files changed, 246 insertions(+), 106 deletions(-) delete mode 100644 packages/core/js-client/README.md create mode 100644 packages/core/js-client/src/network.ts diff --git a/README.md b/README.md index b8aa604b9..de75640a3 100644 --- a/README.md +++ b/README.md @@ -1,84 +1,65 @@ # Fluence JS Client -[![npm](https://img.shields.io/npm/v/@fluencelabs/js-client.api?label=@fluencelabs/js-client.api)](https://www.npmjs.com/package/@fluencelabs/js-client.api) -[![npm](https://img.shields.io/npm/v/@fluencelabs/js-client.web.standalone?label=@fluencelabs/js-client.web.standalone)](https://www.npmjs.com/package/@fluencelabs/js-client.web.standalone) +[![npm](https://img.shields.io/npm/v/@fluencelabs/js-client?label=@fluencelabs/js-client)](https://www.npmjs.com/package/@fluencelabs/js-client) This is the Javascript client for the [Fluence](https://fluence.network) network. The main role of the JS client is to connect to the Fluence Network and allow you to integrate Aqua code into your application. ## Installation -Adding the Fluence JS client for your web application is very easy. +> JS Client only supports the ESM format that means not every Node.js project can install it. +> You can read more [here](https://nodejs.org/api/esm.html) -### Browser-based Apps +1. Install the client: -1. Add a script tag with the JS Client bundle to your `index.html`. The easiest way to do this is using a CDN (like [JSDELIVR](https://www.jsdelivr.com/) or [UNPKG](https://unpkg.com/)). The script is large, thus we highly recommend to use the `async` attribute. - - Here is an example using the JSDELIVR CDN: - - ```html - - Cool App - - + ```bash + npm i @fluencelabs/js-client ``` - If you cannot or don't want to use a CDN, feel free to get the script directly from the [npm package](https://www.npmjs.com/package/@fluencelabs/js-client.web.standalone) and host it yourself. You can find the script in the `/dist` directory of the package. (Note: this option means that developers understand what they are doing and know how to serve this file from their own web server.) - -2. Install the following packages: - - ``` - npm i @fluencelabs/js-client.api @fluencelabs/fluence-network-environment - ``` - -3. Add the following lines at the beginning of your code: +2. Add the following lines at the beginning of your code: - ``` - import { Fluence } from "@fluencelabs/js-client.api"; - import { randomKras } from '@fluencelabs/fluence-network-environment'; + ```javascript + import { Fluence, randomKras } from "@fluencelabs/js-client"; Fluence.connect(randomKras()); ``` -### Node.js Apps +### HTML page -**Prerequisites:** +Add a script tag with the JS Client bundle to your `index.html`. The easiest way to do this is using a CDN ( +like [JSDELIVR](https://www.jsdelivr.com/) or [UNPKG](https://unpkg.com/)). -The Fluence JS Client only supports the ESM format. This implies that a few preliminary steps are required if your project is not already using ESM: +Here is an example using the JSDELIVR CDN: -- Add `"type": "module"` to your package.json. -- Replace `"main": "index.js"` with `"exports": "./index.js"` in your package.json. -- Remove `'use strict';` from all JavaScript files. -- Replace all `require()`/`module.export` with `import`/`export`. -- Use only full relative file paths for imports: `import x from '.';` → `import x from './index.js';`. - -If you are using TypeScript: - -- Make sure you are using TypeScript 4.7 or later. -- Add [`"module": "ESNext", "target": "ESNext", "moduleResolution": "nodenext"`](https://www.typescriptlang.org/tsconfig#module) to your tsconfig.json. -- Use only full relative file paths for imports: `import x from '.';` → `import x from './index.js';`. -- Remove `namespace` usage and use `export` instead. -- You must use a `.js` extension in relative imports even though you're importing `.ts` files. - -**Installation:** + ```html + + Cool App + + + ``` -1. Install the following packages: +If you cannot or don't want to use a CDN, feel free to get the script directly from +the [npm package](https://www.npmjs.com/package/@fluencelabs/js-client) and host it yourself. You can find the script in +the `/dist` directory of the package. (Note: this option means that developers understand what they are doing and know +how to serve this file from their own web server.) - ``` - npm i @fluencelabs/js-client.api"@fluencelabs/js-client.node @fluencelabs/fluence-network-environment - ``` +After importing JS-client to HTML page the client is available as ```window.Fluence``` variable. +To get a specific network you can peek at -2. Add the following lines at the beginning of your code: +``` +https://cdn.jsdelivr.net/npm/@fluencelabs/js-client/dist/network.js +``` - ``` - import '@fluencelabs/js-client.node'; - import { Fluence } from "@fluencelabs/js-client.api"; - import { randomKras } from '@fluencelabs/fluence-network-environment'; +and hardcode selected network. So initialization would look like this - Fluence.connect(randomKras()); - ``` +```javascript + // Passing 1 kras network config from ./dist/network.js above + window.Fluence.connect({ + multiaddr: "/dns4/0-kras.fluence.dev/tcp/9000/wss/p2p/12D3KooWSD5PToNiLQwKDXsu8JSysCwUt8BVUJEqCHcDe7P5h45e", + peerId: "12D3KooWSD5PToNiLQwKDXsu8JSysCwUt8BVUJEqCHcDe7P5h45e", + }); +``` ## Usage in an Application @@ -86,7 +67,7 @@ Once you've added the client, you can compile [Aqua](https://github.com/fluencel 1. Install the package: - ``` + ```bash npm i -D @fluencelabs/cli ``` @@ -130,7 +111,7 @@ Once you've added the client, you can compile [Aqua](https://github.com/fluencel 6. Now you can import and call Aqua code from your application like this: - ``` + ```javascript import { getRelayTime } from "./_aqua/demo"; async function buttonClick() { @@ -172,7 +153,7 @@ Star (`*`) character can be used as a wildcard to enable logs for multiple compo ### Enabling logs in Node.js -enable logs, pass the environment variable `DEBUG` with the corresponding log level. For example: +Enable logs by passing the environment variable `DEBUG` with the corresponding log level. For example: ```sh DEBUG=fluence:* node --loader ts-node/esm ./src/index.ts @@ -182,13 +163,14 @@ DEBUG=fluence:* node --loader ts-node/esm ./src/index.ts To enable logs, set the `localStorage.debug` variable. For example: -``` +```javascript localStorage.debug = 'fluence:*' ``` **NOTE** -In Chromium-based web browsers (e.g. Brave, Chrome, and Electron), the JavaScript console will—by default—only show messages logged by debug if the "Verbose" log level is enabled. +In Chromium-based web browsers (e.g. Brave, Chrome, and Electron), the JavaScript console will be default—only to show +messages logged by debug if the "Verbose" log level is enabled. ## Development diff --git a/packages/core/js-client/README.md b/packages/core/js-client/README.md deleted file mode 100644 index 271a05d15..000000000 --- a/packages/core/js-client/README.md +++ /dev/null @@ -1,11 +0,0 @@ -# JS Peer - -TDB - -## Contributing - -While the project is still in the early stages of development, you are welcome to track progress and contribute. As the project is undergoing rapid changes, interested contributors should contact the team before embarking on larger pieces of work. All contributors should consult with and agree to our [basic contributing rules](CONTRIBUTING.md). - -## License - -[Apache 2.0](LICENSE) diff --git a/packages/core/js-client/package.json b/packages/core/js-client/package.json index dbcdf21b4..05abfb0c9 100644 --- a/packages/core/js-client/package.json +++ b/packages/core/js-client/package.json @@ -13,9 +13,14 @@ "unpkg": "./dist/browser/index.umd.js", "types": "./dist/index.d.ts", "exports": { - "types": "./dist/index.d.ts", - "node": "./dist/index.js", - "default": "./dist/browser/index.js" + ".": { + "types": "./dist/index.d.ts", + "import": "./dist/index.js" + }, + "./keypair": { + "types": "./dist/keypair/index.d.ts", + "import": "./dist/keypair/index.js" + } }, "imports": { "#fetcher": { diff --git a/packages/core/js-client/src/index.ts b/packages/core/js-client/src/index.ts index 755382eb7..82dcb5736 100644 --- a/packages/core/js-client/src/index.ts +++ b/packages/core/js-client/src/index.ts @@ -205,37 +205,8 @@ export const Fluence: FluencePublicApi = { }, }; -export type { CallParams } from "@fluencelabs/interfaces"; - export type { ClientConfig, IFluenceClient } from "./clientPeer/types.js"; -export type { - ArrayType, - ArrowType, - ArrowWithCallbacks, - ArrowWithoutCallbacks, - BottomType, - FunctionCallConstants, - FunctionCallDef, - LabeledProductType, - NilType, - NonArrowType, - OptionType, - ProductType, - ScalarNames, - ScalarType, - ServiceDef, - StructType, - TopType, - UnlabeledProductType, - CallAquaFunctionType, - CallAquaFunctionArgs, - PassedArgs, - FnConfig, - RegisterServiceType, - RegisterServiceArgs, -} from "@fluencelabs/interfaces"; - export { v5_callFunction, v5_registerService } from "./api.js"; // @ts-expect-error Writing to global object like this prohibited by ts @@ -249,9 +220,13 @@ globalThis.fluence = { }; export { createClient, callAquaFunction, registerService }; + +// Deprecated exports. Later they will be exposed only under js-client/keypair path export { KeyPair, fromBase64Sk, fromBase58Sk, fromOpts, } from "./keypair/index.js"; + +export * from "./network.js"; diff --git a/packages/core/js-client/src/network.ts b/packages/core/js-client/src/network.ts new file mode 100644 index 000000000..5fd34f5ab --- /dev/null +++ b/packages/core/js-client/src/network.ts @@ -0,0 +1,190 @@ +/** + * Copyright 2023 Fluence Labs Limited + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +export type Node = { peerId: string; multiaddr: string }; + +export const stage: Node[] = [ + { + multiaddr: + "/dns4/0-stage.fluence.dev/tcp/9000/wss/p2p/12D3KooWDcpWuyrMTDinqNgmXAuRdfd2mTdY9VoXZSAet2pDzh6r", + peerId: "12D3KooWDcpWuyrMTDinqNgmXAuRdfd2mTdY9VoXZSAet2pDzh6r", + }, + { + multiaddr: + "/dns4/1-stage.fluence.dev/tcp/9000/wss/p2p/12D3KooWHCJbJKGDfCgHSoCuK9q4STyRnVveqLoXAPBbXHTZx9Cv", + peerId: "12D3KooWHCJbJKGDfCgHSoCuK9q4STyRnVveqLoXAPBbXHTZx9Cv", + }, + { + multiaddr: + "/dns4/2-stage.fluence.dev/tcp/9000/wss/p2p/12D3KooWMigkP4jkVyufq5JnDJL6nXvyjeaDNpRfEZqQhsG3sYCU", + peerId: "12D3KooWMigkP4jkVyufq5JnDJL6nXvyjeaDNpRfEZqQhsG3sYCU", + }, + { + multiaddr: + "/dns4/3-stage.fluence.dev/tcp/9000/wss/p2p/12D3KooWMMGdfVEJ1rWe1nH1nehYDzNEHhg5ogdfiGk88AupCMnf", + peerId: "12D3KooWMMGdfVEJ1rWe1nH1nehYDzNEHhg5ogdfiGk88AupCMnf", + }, + { + multiaddr: + "/dns4/4-stage.fluence.dev/tcp/9000/wss/p2p/12D3KooWJ4bTHirdTFNZpCS72TAzwtdmavTBkkEXtzo6wHL25CtE", + peerId: "12D3KooWJ4bTHirdTFNZpCS72TAzwtdmavTBkkEXtzo6wHL25CtE", + }, + { + multiaddr: + "/dns4/5-stage.fluence.dev/tcp/9000/wss/p2p/12D3KooWAKNos2KogexTXhrkMZzFYpLHuWJ4PgoAhurSAv7o5CWA", + peerId: "12D3KooWAKNos2KogexTXhrkMZzFYpLHuWJ4PgoAhurSAv7o5CWA", + }, +]; + +export const testNet: Node[] = [ + { + multiaddr: + "/dns4/0-testnet.fluence.dev/tcp/9000/wss/p2p/12D3KooWMhVpgfQxBLkQkJed8VFNvgN4iE6MD7xCybb1ZYWW2Gtz", + peerId: "12D3KooWMhVpgfQxBLkQkJed8VFNvgN4iE6MD7xCybb1ZYWW2Gtz", + }, + { + multiaddr: + "/dns4/1-testnet.fluence.dev/tcp/9000/wss/p2p/12D3KooWEXNUbCXooUwHrHBbrmjsrpHXoEphPwbjQXEGyzbqKnE9", + peerId: "12D3KooWEXNUbCXooUwHrHBbrmjsrpHXoEphPwbjQXEGyzbqKnE9", + }, + { + multiaddr: + "/dns4/2-testnet.fluence.dev/tcp/9000/wss/p2p/12D3KooWHk9BjDQBUqnavciRPhAYFvqKBe4ZiPPvde7vDaqgn5er", + peerId: "12D3KooWHk9BjDQBUqnavciRPhAYFvqKBe4ZiPPvde7vDaqgn5er", + }, + { + multiaddr: + "/dns4/3-testnet.fluence.dev/tcp/9000/wss/p2p/12D3KooWBUJifCTgaxAUrcM9JysqCcS4CS8tiYH5hExbdWCAoNwb", + peerId: "12D3KooWBUJifCTgaxAUrcM9JysqCcS4CS8tiYH5hExbdWCAoNwb", + }, + { + multiaddr: + "/dns4/4-testnet.fluence.dev/tcp/9000/wss/p2p/12D3KooWJbJFaZ3k5sNd8DjQgg3aERoKtBAnirEvPV8yp76kEXHB", + peerId: "12D3KooWJbJFaZ3k5sNd8DjQgg3aERoKtBAnirEvPV8yp76kEXHB", + }, + { + multiaddr: + "/dns4/5-testnet.fluence.dev/tcp/9000/wss/p2p/12D3KooWCKCeqLPSgMnDjyFsJuWqREDtKNHx1JEBiwaMXhCLNTRb", + peerId: "12D3KooWCKCeqLPSgMnDjyFsJuWqREDtKNHx1JEBiwaMXhCLNTRb", + }, + { + multiaddr: + "/dns4/6-testnet.fluence.dev/tcp/9000/wss/p2p/12D3KooWKnRcsTpYx9axkJ6d69LPfpPXrkVLe96skuPTAo76LLVH", + peerId: "12D3KooWKnRcsTpYx9axkJ6d69LPfpPXrkVLe96skuPTAo76LLVH", + }, + { + multiaddr: + "/dns4/7-testnet.fluence.dev/tcp/9000/wss/p2p/12D3KooWBSdm6TkqnEFrgBuSkpVE3dR1kr6952DsWQRNwJZjFZBv", + peerId: "12D3KooWBSdm6TkqnEFrgBuSkpVE3dR1kr6952DsWQRNwJZjFZBv", + }, + { + multiaddr: + "/dns4/8-testnet.fluence.dev/tcp/9000/wss/p2p/12D3KooWGzNvhSDsgFoHwpWHAyPf1kcTYCGeRBPfznL8J6qdyu2H", + peerId: "12D3KooWGzNvhSDsgFoHwpWHAyPf1kcTYCGeRBPfznL8J6qdyu2H", + }, + { + multiaddr: + "/dns4/9-testnet.fluence.dev/tcp/9000/wss/p2p/12D3KooWF7gjXhQ4LaKj6j7ntxsPpGk34psdQicN2KNfBi9bFKXg", + peerId: "12D3KooWF7gjXhQ4LaKj6j7ntxsPpGk34psdQicN2KNfBi9bFKXg", + }, + { + multiaddr: + "/dns4/10-testnet.fluence.dev/tcp/9000/wss/p2p/12D3KooWB9P1xmV3c7ZPpBemovbwCiRRTKd3Kq2jsVPQN4ZukDfy", + peerId: "12D3KooWB9P1xmV3c7ZPpBemovbwCiRRTKd3Kq2jsVPQN4ZukDfy", + }, +]; + +export const kras: Node[] = [ + { + multiaddr: + "/dns4/0-kras.fluence.dev/tcp/9000/wss/p2p/12D3KooWSD5PToNiLQwKDXsu8JSysCwUt8BVUJEqCHcDe7P5h45e", + peerId: "12D3KooWSD5PToNiLQwKDXsu8JSysCwUt8BVUJEqCHcDe7P5h45e", + }, + { + multiaddr: + "/dns4/1-kras.fluence.dev/tcp/9000/wss/p2p/12D3KooWR4cv1a8tv7pps4HH6wePNaK6gf1Hww5wcCMzeWxyNw51", + peerId: "12D3KooWR4cv1a8tv7pps4HH6wePNaK6gf1Hww5wcCMzeWxyNw51", + }, + { + multiaddr: + "/dns4/2-kras.fluence.dev/tcp/9000/wss/p2p/12D3KooWKnEqMfYo9zvfHmqTLpLdiHXPe4SVqUWcWHDJdFGrSmcA", + peerId: "12D3KooWKnEqMfYo9zvfHmqTLpLdiHXPe4SVqUWcWHDJdFGrSmcA", + }, + { + multiaddr: + "/dns4/3-kras.fluence.dev/tcp/9000/wss/p2p/12D3KooWHLxVhUQyAuZe6AHMB29P7wkvTNMn7eDMcsqimJYLKREf", + peerId: "12D3KooWHLxVhUQyAuZe6AHMB29P7wkvTNMn7eDMcsqimJYLKREf", + }, + { + multiaddr: + "/dns4/4-kras.fluence.dev/tcp/9000/wss/p2p/12D3KooWJd3HaMJ1rpLY1kQvcjRPEvnDwcXrH8mJvk7ypcZXqXGE", + peerId: "12D3KooWJd3HaMJ1rpLY1kQvcjRPEvnDwcXrH8mJvk7ypcZXqXGE", + }, + { + multiaddr: + "/dns4/5-kras.fluence.dev/tcp/9000/wss/p2p/12D3KooWFEwNWcHqi9rtsmDhsYcDbRUCDXH84RC4FW6UfsFWaoHi", + peerId: "12D3KooWFEwNWcHqi9rtsmDhsYcDbRUCDXH84RC4FW6UfsFWaoHi", + }, + { + multiaddr: + "/dns4/6-kras.fluence.dev/tcp/9000/wss/p2p/12D3KooWCMr9mU894i8JXAFqpgoFtx6qnV1LFPSfVc3Y34N4h4LS", + peerId: "12D3KooWCMr9mU894i8JXAFqpgoFtx6qnV1LFPSfVc3Y34N4h4LS", + }, + { + multiaddr: + "/dns4/7-kras.fluence.dev/tcp/9000/wss/p2p/12D3KooWDUszU2NeWyUVjCXhGEt1MoZrhvdmaQQwtZUriuGN1jTr", + peerId: "12D3KooWDUszU2NeWyUVjCXhGEt1MoZrhvdmaQQwtZUriuGN1jTr", + }, + { + multiaddr: + "/dns4/8-kras.fluence.dev/tcp/9000/wss/p2p/12D3KooWEFFCZnar1cUJQ3rMWjvPQg6yMV2aXWs2DkJNSRbduBWn", + peerId: "12D3KooWEFFCZnar1cUJQ3rMWjvPQg6yMV2aXWs2DkJNSRbduBWn", + }, + { + multiaddr: + "/dns4/9-kras.fluence.dev/tcp/9000/wss/p2p/12D3KooWFtf3rfCDAfWwt6oLZYZbDfn9Vn7bv7g6QjjQxUUEFVBt", + peerId: "12D3KooWFtf3rfCDAfWwt6oLZYZbDfn9Vn7bv7g6QjjQxUUEFVBt", + }, + { + multiaddr: + "/dns4/10-kras.fluence.dev/tcp/9000/wss/p2p/12D3KooWD7CvsYcpF9HE9CCV9aY3SJ317tkXVykjtZnht2EbzDPm", + peerId: "12D3KooWD7CvsYcpF9HE9CCV9aY3SJ317tkXVykjtZnht2EbzDPm", + }, +]; + +// for backward compatibility +export const krasnodar = kras; + +export const randomKras = () => { + return randomItem(kras); +}; + +export const randomTestNet = () => { + return randomItem(testNet); +}; + +export const randomStage = () => { + return randomItem(stage); +}; + +function randomItem(arr: Node[]) { + const index = randomInt(0, arr.length); + return arr[index]; +} + +function randomInt(min: number, max: number) { + return Math.floor(Math.random() * (max - min)) + min; +} diff --git a/packages/core/js-client/tsconfig.json b/packages/core/js-client/tsconfig.json index 70f838c90..6486ca5d6 100644 --- a/packages/core/js-client/tsconfig.json +++ b/packages/core/js-client/tsconfig.json @@ -3,7 +3,6 @@ "compilerOptions": { "types": ["vite/client"], "outDir": "./dist", - "esModuleInterop": true, "resolveJsonModule": true, "rootDir": "src" }, From 7a77b349894ace6bad9b0eeb2a67b8d9a42f48e0 Mon Sep 17 00:00:00 2001 From: Akim Mamedov Date: Tue, 24 Oct 2023 13:58:10 +0700 Subject: [PATCH 02/23] Improve build experience --- README.md | 29 ++++---- packages/core/aqua-to-js/package.json | 1 - .../src/generate/__test__/generate.spec.ts | 3 + .../core/js-client-isomorphic/package.json | 26 +++++++ .../src/fetchers/browser.ts | 36 ++++++++++ .../src/fetchers/node.ts | 11 +-- .../src/worker-resolvers/browser.ts | 34 +++++++++ .../src/worker-resolvers/node.ts | 36 ++++++++++ .../core/js-client-isomorphic/tsconfig.json | 13 ++++ packages/core/js-client/.gitignore | 2 + packages/core/js-client/createVersionFile.js | 38 ++++++++++ packages/core/js-client/package.json | 13 ++-- .../core/js-client/src/fetchers/browser.ts | 69 ------------------- packages/core/js-client/src/index.ts | 66 +++++------------- packages/core/js-client/src/network.ts | 13 ++-- packages/core/js-client/vite.config.ts | 7 +- pnpm-lock.yaml | 12 +++- 17 files changed, 246 insertions(+), 163 deletions(-) create mode 100644 packages/core/js-client-isomorphic/package.json create mode 100644 packages/core/js-client-isomorphic/src/fetchers/browser.ts rename packages/core/{js-client => js-client-isomorphic}/src/fetchers/node.ts (84%) create mode 100644 packages/core/js-client-isomorphic/src/worker-resolvers/browser.ts create mode 100644 packages/core/js-client-isomorphic/src/worker-resolvers/node.ts create mode 100644 packages/core/js-client-isomorphic/tsconfig.json create mode 100644 packages/core/js-client/createVersionFile.js delete mode 100644 packages/core/js-client/src/fetchers/browser.ts diff --git a/README.md b/README.md index de75640a3..c6ed200e9 100644 --- a/README.md +++ b/README.md @@ -30,21 +30,19 @@ like [JSDELIVR](https://www.jsdelivr.com/) or [UNPKG](https://unpkg.com/)). Here is an example using the JSDELIVR CDN: - ```html - - Cool App - - - ``` +```html + + Cool App + + +``` If you cannot or don't want to use a CDN, feel free to get the script directly from the [npm package](https://www.npmjs.com/package/@fluencelabs/js-client) and host it yourself. You can find the script in the `/dist` directory of the package. (Note: this option means that developers understand what they are doing and know how to serve this file from their own web server.) -After importing JS-client to HTML page the client is available as ```window.Fluence``` variable. +After importing JS-client to HTML page the client is available as `window.Fluence` variable. To get a specific network you can peek at ``` @@ -54,11 +52,12 @@ https://cdn.jsdelivr.net/npm/@fluencelabs/js-client/dist/network.js and hardcode selected network. So initialization would look like this ```javascript - // Passing 1 kras network config from ./dist/network.js above - window.Fluence.connect({ - multiaddr: "/dns4/0-kras.fluence.dev/tcp/9000/wss/p2p/12D3KooWSD5PToNiLQwKDXsu8JSysCwUt8BVUJEqCHcDe7P5h45e", - peerId: "12D3KooWSD5PToNiLQwKDXsu8JSysCwUt8BVUJEqCHcDe7P5h45e", - }); +// Passing 1 kras network config from ./dist/network.js above +window.Fluence.connect({ + multiaddr: + "/dns4/0-kras.fluence.dev/tcp/9000/wss/p2p/12D3KooWSD5PToNiLQwKDXsu8JSysCwUt8BVUJEqCHcDe7P5h45e", + peerId: "12D3KooWSD5PToNiLQwKDXsu8JSysCwUt8BVUJEqCHcDe7P5h45e", +}); ``` ## Usage in an Application @@ -164,7 +163,7 @@ DEBUG=fluence:* node --loader ts-node/esm ./src/index.ts To enable logs, set the `localStorage.debug` variable. For example: ```javascript -localStorage.debug = 'fluence:*' +localStorage.debug = "fluence:*"; ``` **NOTE** diff --git a/packages/core/aqua-to-js/package.json b/packages/core/aqua-to-js/package.json index 211d474c2..c410038d8 100644 --- a/packages/core/aqua-to-js/package.json +++ b/packages/core/aqua-to-js/package.json @@ -21,7 +21,6 @@ "@fluencelabs/aqua-api": "0.12.0", "@fluencelabs/aqua-lib": "0.7.3", "@fluencelabs/interfaces": "workspace:*", - "@fluencelabs/js-client": "workspace:*", "@fluencelabs/registry": "0.8.7", "@fluencelabs/spell": "0.5.20", "@fluencelabs/trust-graph": "0.4.7", diff --git a/packages/core/aqua-to-js/src/generate/__test__/generate.spec.ts b/packages/core/aqua-to-js/src/generate/__test__/generate.spec.ts index 34effb2be..e4951b801 100644 --- a/packages/core/aqua-to-js/src/generate/__test__/generate.spec.ts +++ b/packages/core/aqua-to-js/src/generate/__test__/generate.spec.ts @@ -40,12 +40,15 @@ describe("Aqua to js/ts compiler", () => { }, }; + // @ts-expect-error don't use compileFromPath directly here const jsResult = generateSources(res, "js", pkg); + // @ts-expect-error don't use compileFromPath directly here const jsTypes = generateTypes(res, pkg); expect(jsResult).toMatchSnapshot(); expect(jsTypes).toMatchSnapshot(); + // @ts-expect-error don't use compileFromPath directly here const tsResult = generateSources(res, "ts", pkg); expect(tsResult).toMatchSnapshot(); diff --git a/packages/core/js-client-isomorphic/package.json b/packages/core/js-client-isomorphic/package.json new file mode 100644 index 000000000..beed5d1e3 --- /dev/null +++ b/packages/core/js-client-isomorphic/package.json @@ -0,0 +1,26 @@ +{ + "name": "@fluencelabs/js-client-isomorphic", + "version": "1.0.0", + "description": "", + "main": "index.js", + "scripts": { + "build": "tsc" + }, + "exports": { + "./fetcher": { + "node": "./dist/fetchers/node.js", + "default": "./dist/fetchers/browser.js" + }, + "./worker-resolver": { + "node": "./dist/worker-resolvers/node.js", + "default": "./dist/worker-resolvers/browser.js" + } + }, + "dependencies": { + "threads": "fluencelabs/threads.js#b00a5342380b0278d3ae56dcfb170effb3cad7cd" + }, + "keywords": [], + "author": "Fluence Labs", + "license": "Apache-2.0", + "private": true +} diff --git a/packages/core/js-client-isomorphic/src/fetchers/browser.ts b/packages/core/js-client-isomorphic/src/fetchers/browser.ts new file mode 100644 index 000000000..5bfac2c68 --- /dev/null +++ b/packages/core/js-client-isomorphic/src/fetchers/browser.ts @@ -0,0 +1,36 @@ +/** + * Copyright 2023 Fluence Labs Limited + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +/** + * @param pkg name of package with version + * @param assetPath path of required asset in given package + * @param root CDN domain in browser or file system root in node + */ +export async function fetchResource( + pkg: string, + assetPath: string, + root: string, +) { + const refinedAssetPath = assetPath.startsWith("/") + ? assetPath.slice(1) + : assetPath; + + const url = new URL(`${pkg}/` + refinedAssetPath, root); + + return fetch(url).catch(() => { + throw new Error(`Cannot fetch from ${url.toString()}`); + }); +} diff --git a/packages/core/js-client/src/fetchers/node.ts b/packages/core/js-client-isomorphic/src/fetchers/node.ts similarity index 84% rename from packages/core/js-client/src/fetchers/node.ts rename to packages/core/js-client-isomorphic/src/fetchers/node.ts index 38a40ee39..b9c19078f 100644 --- a/packages/core/js-client/src/fetchers/node.ts +++ b/packages/core/js-client-isomorphic/src/fetchers/node.ts @@ -19,7 +19,7 @@ import module from "module"; import path from "path"; /** - * @param pkg name of package + * @param pkg name of package with version * @param assetPath path of required asset in given package * @param root CDN domain in browser or file system root in node */ @@ -30,18 +30,21 @@ export async function fetchResource( ) { // TODO: `root` will be handled somehow in the future. For now, we use filesystem root where js-client is running; root = "/"; + const pkgWithoutVersion = pkg.split("@").slice(0, -1).join("@"); const require = module.createRequire(import.meta.url); - const packagePathIndex = require.resolve(pkg); + const packagePathIndex = require.resolve(pkgWithoutVersion); // Ensure that windows path is converted to posix path. So we can find a package const posixPath = packagePathIndex.split(path.sep).join(path.posix.sep); - const matches = new RegExp(`(.+${pkg})`).exec(posixPath); + const matches = new RegExp(`(.+${pkgWithoutVersion})`).exec(posixPath); const packagePath = matches?.[0]; if (packagePath == null) { - throw new Error(`Cannot find dependency ${pkg} in path ${posixPath}`); + throw new Error( + `Cannot find dependency ${pkgWithoutVersion} in path ${posixPath}`, + ); } const pathToResource = path.join(root, packagePath, assetPath); diff --git a/packages/core/js-client-isomorphic/src/worker-resolvers/browser.ts b/packages/core/js-client-isomorphic/src/worker-resolvers/browser.ts new file mode 100644 index 000000000..119b85f6d --- /dev/null +++ b/packages/core/js-client-isomorphic/src/worker-resolvers/browser.ts @@ -0,0 +1,34 @@ +/** + * Copyright 2023 Fluence Labs Limited + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import { BlobWorker, Worker } from "threads/master"; + +import { fetchResource } from "../fetchers/browser.js"; + +export async function getWorker(pkg: string, CDNUrl: string): Promise { + const fetchWorkerCode = async () => { + const resource = await fetchResource( + pkg, + "/dist/browser/marine-worker.umd.cjs", + CDNUrl, + ); + + return resource.text(); + }; + + const workerCode = await fetchWorkerCode(); + return Promise.resolve(BlobWorker.fromText(workerCode)); +} diff --git a/packages/core/js-client-isomorphic/src/worker-resolvers/node.ts b/packages/core/js-client-isomorphic/src/worker-resolvers/node.ts new file mode 100644 index 000000000..91aacf6e8 --- /dev/null +++ b/packages/core/js-client-isomorphic/src/worker-resolvers/node.ts @@ -0,0 +1,36 @@ +/** + * Copyright 2023 Fluence Labs Limited + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import assert from "assert"; +import module from "module"; +import path from "path"; +import url from "url"; + +import { Worker } from "threads/master"; + +export async function getWorker(pkg: string, CDNUrl: string): Promise { + assert(typeof CDNUrl === "string"); + const pkgWithoutVersion = pkg.split("@").slice(0, -1).join("@"); + const require = module.createRequire(import.meta.url); + + const pathToThisFile = path.dirname(url.fileURLToPath(import.meta.url)); + + const pathToWorker = require.resolve(pkgWithoutVersion); + + const relativePathToWorker = path.relative(pathToThisFile, pathToWorker); + + return Promise.resolve(new Worker(relativePathToWorker)); +} diff --git a/packages/core/js-client-isomorphic/tsconfig.json b/packages/core/js-client-isomorphic/tsconfig.json new file mode 100644 index 000000000..a33b91ca5 --- /dev/null +++ b/packages/core/js-client-isomorphic/tsconfig.json @@ -0,0 +1,13 @@ +{ + "extends": "../../../tsconfig.json", + "compilerOptions": { + "outDir": "./dist" + }, + "include": [ + "src/**/*" + ], + "exclude": [ + "node_modules", + "dist" + ] +} diff --git a/packages/core/js-client/.gitignore b/packages/core/js-client/.gitignore index fe11902df..dfa77d723 100644 --- a/packages/core/js-client/.gitignore +++ b/packages/core/js-client/.gitignore @@ -22,3 +22,5 @@ jspm_packages/ # workaround to make integration tests work src/marine/worker-script/index.js + +src/versions.ts diff --git a/packages/core/js-client/createVersionFile.js b/packages/core/js-client/createVersionFile.js new file mode 100644 index 000000000..4e98aa707 --- /dev/null +++ b/packages/core/js-client/createVersionFile.js @@ -0,0 +1,38 @@ +/* + * Copyright 2023 Fluence Labs Limited + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import pkg from "./package.json" assert { type: "json" }; +import { writeFile } from "fs/promises"; +import { join } from "path"; +import { fileURLToPath } from "url"; + +Object.prototype.pick = function (names) { + return names.reduce((acc, name) => { + acc[name] = this[name]; + return acc; + }, {}); +}; + +const output = { ...pkg.dependencies, ...pkg.devDependencies }.pick([ + "@fluencelabs/avm", + "@fluencelabs/marine-js", + "@fluencelabs/marine-worker", +]); + +await writeFile( + join(fileURLToPath(import.meta.url), "../src/versions.ts"), + `export default ${JSON.stringify(output, null, 2)} as const`, +); diff --git a/packages/core/js-client/package.json b/packages/core/js-client/package.json index 05abfb0c9..944041a7a 100644 --- a/packages/core/js-client/package.json +++ b/packages/core/js-client/package.json @@ -9,8 +9,7 @@ "files": [ "dist" ], - "main": "./dist/index.js", - "unpkg": "./dist/browser/index.umd.js", + "main": "./dist/browser/index.min.js", "types": "./dist/index.d.ts", "exports": { ".": { @@ -22,16 +21,11 @@ "import": "./dist/keypair/index.js" } }, - "imports": { - "#fetcher": { - "node": "./dist/fetchers/node.js", - "default": "./dist/fetchers/browser.js" - } - }, "type": "module", "scripts": { "build": "tsc && vite build", - "test": "vitest --threads false run" + "test": "vitest --threads false run", + "postinstall": "node createVersionFile.js" }, "repository": "https://github.com/fluencelabs/fluence-js", "author": "Fluence Labs", @@ -41,6 +35,7 @@ "@chainsafe/libp2p-yamux": "5.0.0", "@fluencelabs/avm": "0.52.0", "@fluencelabs/interfaces": "workspace:*", + "@fluencelabs/js-client-isomorphic": "workspace:*", "@fluencelabs/marine-worker": "0.3.3", "@libp2p/crypto": "2.0.3", "@libp2p/interface": "0.1.2", diff --git a/packages/core/js-client/src/fetchers/browser.ts b/packages/core/js-client/src/fetchers/browser.ts deleted file mode 100644 index 114579fac..000000000 --- a/packages/core/js-client/src/fetchers/browser.ts +++ /dev/null @@ -1,69 +0,0 @@ -/** - * Copyright 2023 Fluence Labs Limited - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -interface PackageJsonContent { - dependencies: Record; - devDependencies: Record; -} - -// This will be substituted in build phase -const packageJsonContentString = `__PACKAGE_JSON_CONTENT__`; -let parsedPackageJsonContent: PackageJsonContent | undefined; - -/** - * @param pkg name of package - * @param assetPath path of required asset in given package - * @param root CDN domain in browser or file system root in node - */ -export async function fetchResource( - pkg: string, - assetPath: string, - root: string, -) { - const packageJsonContent = - parsedPackageJsonContent ?? - // TODO: Should be validated - // eslint-disable-next-line @typescript-eslint/consistent-type-assertions - (parsedPackageJsonContent = JSON.parse( - packageJsonContentString, - ) as PackageJsonContent); - - const version = - packageJsonContent.dependencies[pkg] ?? - packageJsonContent.devDependencies[pkg]; - - if (version === undefined) { - const availableDeps = [ - ...Object.keys(packageJsonContent.dependencies), - ...Object.keys(packageJsonContent.devDependencies), - ]; - - throw new Error( - `Cannot find version of ${pkg} in package.json. Available versions: ${availableDeps.join( - ",", - )}`, - ); - } - - const refinedAssetPath = assetPath.startsWith("/") - ? assetPath.slice(1) - : assetPath; - - const url = new globalThis.URL(`${pkg}@${version}/` + refinedAssetPath, root); - return fetch(url).catch(() => { - throw new Error(`Cannot fetch from ${url.toString()}`); - }); -} diff --git a/packages/core/js-client/src/index.ts b/packages/core/js-client/src/index.ts index 82dcb5736..f2d7f9e8a 100644 --- a/packages/core/js-client/src/index.ts +++ b/packages/core/js-client/src/index.ts @@ -14,12 +14,8 @@ * limitations under the License. */ -import module from "module"; -import path from "path"; -import process from "process"; -import url from "url"; - -import { BlobWorker, Worker } from "threads/master"; +import { fetchResource } from "@fluencelabs/js-client-isomorphic/fetcher"; +import { getWorker } from "@fluencelabs/js-client-isomorphic/worker-resolver"; import { ClientPeer, makeClientPeerConfig } from "./clientPeer/ClientPeer.js"; import { @@ -30,36 +26,22 @@ import { import { callAquaFunction } from "./compilerSupport/callFunction.js"; import { registerService } from "./compilerSupport/registerService.js"; import { MarineBackgroundRunner } from "./marine/worker/index.js"; -import { doRegisterNodeUtils } from "./services/NodeUtils.js"; - -import { fetchResource } from "#fetcher"; +import versions from "./versions.js"; const DEFAULT_CDN_URL = "https://unpkg.com"; -const isNode = - // process.release is undefined in browser env - // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition - typeof process !== "undefined" && process.release?.name === "node"; +const getVersionedPackage = (pkg: keyof typeof versions) => + `${pkg}@${versions[pkg]}`; const createClient = async ( relay: RelayOptions, - config: ClientConfig, + config: ClientConfig = {}, ): Promise => { const CDNUrl = config.CDNUrl ?? DEFAULT_CDN_URL; - const fetchWorkerCode = async () => { - const resource = await fetchResource( - "@fluencelabs/marine-worker", - "/dist/browser/marine-worker.umd.cjs", - CDNUrl, - ); - - return resource.text(); - }; - const fetchMarineJsWasm = async () => { const resource = await fetchResource( - "@fluencelabs/marine-js", + getVersionedPackage("@'@fluencelabs/marine-js' "/dist/marine-js.wasm", CDNUrl, ); @@ -69,7 +51,7 @@ const createClient = async ( const fetchAvmWasm = async () => { const resource = await fetchResource( - "@fluencelabs/avm", + getVersionedPackage("@fluencelabs/avm"), "/dist/avm.wasm", CDNUrl, ); @@ -83,25 +65,10 @@ const createClient = async ( const marine = new MarineBackgroundRunner( { async getValue() { - if (isNode) { - const require = module.createRequire(import.meta.url); - - const pathToThisFile = path.dirname( - url.fileURLToPath(import.meta.url), - ); - - const pathToWorker = require.resolve("@fluencelabs/marine-worker"); - - const relativePathToWorker = path.relative( - pathToThisFile, - pathToWorker, - ); - - return new Worker(relativePathToWorker); - } else { - const workerCode = await fetchWorkerCode(); - return BlobWorker.fromText(workerCode); - } + return getWorker( + getVersionedPackage('@fluencelabs/marine-worker'), + CDNUrl, + ); }, start() { return Promise.resolve(undefined); @@ -141,9 +108,10 @@ const createClient = async ( const client = new ClientPeer(peerConfig, relayConfig, keyPair, marine); - if (isNode) { - doRegisterNodeUtils(client); - } + // TODO: Support node specific utils + // if (isNode) { + // doRegisterNodeUtils(client); + // } await client.connect(); return client; @@ -154,7 +122,7 @@ const createClient = async ( */ interface FluencePublicApi { defaultClient: ClientPeer | undefined; - connect: (relay: RelayOptions, config: ClientConfig) => Promise; + connect: (relay: RelayOptions, config?: ClientConfig) => Promise; disconnect: () => Promise; onConnectionStateChange: ( handler: (state: ConnectionState) => void, diff --git a/packages/core/js-client/src/network.ts b/packages/core/js-client/src/network.ts index 5fd34f5ab..42c74f73b 100644 --- a/packages/core/js-client/src/network.ts +++ b/packages/core/js-client/src/network.ts @@ -14,9 +14,9 @@ * limitations under the License. */ -export type Node = { peerId: string; multiaddr: string }; +export type Relay = { peerId: string; multiaddr: string }; -export const stage: Node[] = [ +export const stage: Relay[] = [ { multiaddr: "/dns4/0-stage.fluence.dev/tcp/9000/wss/p2p/12D3KooWDcpWuyrMTDinqNgmXAuRdfd2mTdY9VoXZSAet2pDzh6r", @@ -49,7 +49,7 @@ export const stage: Node[] = [ }, ]; -export const testNet: Node[] = [ +export const testNet: Relay[] = [ { multiaddr: "/dns4/0-testnet.fluence.dev/tcp/9000/wss/p2p/12D3KooWMhVpgfQxBLkQkJed8VFNvgN4iE6MD7xCybb1ZYWW2Gtz", @@ -107,7 +107,7 @@ export const testNet: Node[] = [ }, ]; -export const kras: Node[] = [ +export const kras: Relay[] = [ { multiaddr: "/dns4/0-kras.fluence.dev/tcp/9000/wss/p2p/12D3KooWSD5PToNiLQwKDXsu8JSysCwUt8BVUJEqCHcDe7P5h45e", @@ -165,9 +165,6 @@ export const kras: Node[] = [ }, ]; -// for backward compatibility -export const krasnodar = kras; - export const randomKras = () => { return randomItem(kras); }; @@ -180,7 +177,7 @@ export const randomStage = () => { return randomItem(stage); }; -function randomItem(arr: Node[]) { +function randomItem(arr: Relay[]) { const index = randomInt(0, arr.length); return arr[index]; } diff --git a/packages/core/js-client/vite.config.ts b/packages/core/js-client/vite.config.ts index 6cfe3847a..80af88452 100644 --- a/packages/core/js-client/vite.config.ts +++ b/packages/core/js-client/vite.config.ts @@ -17,7 +17,6 @@ import inject from "@rollup/plugin-inject"; import tsconfigPaths from "vite-tsconfig-paths"; import { createRequire } from "module"; -import { readFileSync } from "fs"; import { UserConfig } from "vite"; const require = createRequire(import.meta.url); @@ -30,7 +29,8 @@ const config: UserConfig = { lib: { entry: "./src/index.ts", name: "js-client", - fileName: "index", + fileName: () => "index.min.js", + formats: ["umd"], }, outDir: "./dist/browser", rollupOptions: { @@ -55,9 +55,6 @@ const config: UserConfig = { }, }, }, - define: { - __PACKAGE_JSON_CONTENT__: readFileSync("./package.json", "utf-8"), - }, }; export default config; diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index c6fbe3f3f..c22ddb721 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -169,9 +169,6 @@ importers: '@fluencelabs/interfaces': specifier: workspace:* version: link:../interfaces - '@fluencelabs/js-client': - specifier: workspace:* - version: link:../js-client '@fluencelabs/registry': specifier: 0.8.7 version: 0.8.7 @@ -211,6 +208,9 @@ importers: '@fluencelabs/interfaces': specifier: workspace:* version: link:../interfaces + '@fluencelabs/js-client-isomorphic': + specifier: workspace:* + version: link:../js-client-isomorphic '@fluencelabs/marine-worker': specifier: 0.3.3 version: link:../marine-worker @@ -318,6 +318,12 @@ importers: specifier: 0.34.6 version: 0.34.6 + packages/core/js-client-isomorphic: + dependencies: + threads: + specifier: fluencelabs/threads.js#b00a5342380b0278d3ae56dcfb170effb3cad7cd + version: github.com/fluencelabs/threads.js/b00a5342380b0278d3ae56dcfb170effb3cad7cd + packages/core/marine-worker: dependencies: '@fluencelabs/marine-js': From 3259168f0b91648752c093b3e1cac2c033a2b05f Mon Sep 17 00:00:00 2001 From: Akim Mamedov Date: Tue, 24 Oct 2023 15:53:11 +0700 Subject: [PATCH 03/23] Fix eslint --- packages/core/js-client/src/index.ts | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/packages/core/js-client/src/index.ts b/packages/core/js-client/src/index.ts index f2d7f9e8a..cf17c6551 100644 --- a/packages/core/js-client/src/index.ts +++ b/packages/core/js-client/src/index.ts @@ -30,8 +30,9 @@ import versions from "./versions.js"; const DEFAULT_CDN_URL = "https://unpkg.com"; -const getVersionedPackage = (pkg: keyof typeof versions) => - `${pkg}@${versions[pkg]}`; +const getVersionedPackage = (pkg: keyof typeof versions) => { + return `${pkg}@${versions[pkg]}`; +}; const createClient = async ( relay: RelayOptions, @@ -41,7 +42,7 @@ const createClient = async ( const fetchMarineJsWasm = async () => { const resource = await fetchResource( - getVersionedPackage("@'@fluencelabs/marine-js' + getVersionedPackage'@fluencelabs/marine-js'"), "/dist/marine-js.wasm", CDNUrl, ); @@ -66,7 +67,7 @@ const createClient = async ( { async getValue() { return getWorker( - getVersionedPackage('@fluencelabs/marine-worker'), + getVersionedPackage('@fluencelabs/marine-worker'), CDNUrl, ); }, From 484f15d0aac7bb9412cd997e3f3ca8856bff00e2 Mon Sep 17 00:00:00 2001 From: Akim Mamedov Date: Tue, 24 Oct 2023 16:40:12 +0700 Subject: [PATCH 04/23] Fix eslint --- packages/core/js-client/src/index.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/core/js-client/src/index.ts b/packages/core/js-client/src/index.ts index cf17c6551..96a39772d 100644 --- a/packages/core/js-client/src/index.ts +++ b/packages/core/js-client/src/index.ts @@ -42,7 +42,7 @@ const createClient = async ( const fetchMarineJsWasm = async () => { const resource = await fetchResource( - getVersionedPackage'@fluencelabs/marine-js'"), + getVersionedPackage("@fluencelabs/marine-js"), "/dist/marine-js.wasm", CDNUrl, ); @@ -67,7 +67,7 @@ const createClient = async ( { async getValue() { return getWorker( - getVersionedPackage('@fluencelabs/marine-worker'), + getVersionedPackage("@'@fluencelabs/marine-worker' CDNUrl, ); }, From 48c9951c09559eb1a9baf43def93b915483487a5 Mon Sep 17 00:00:00 2001 From: Akim Mamedov Date: Tue, 24 Oct 2023 16:42:28 +0700 Subject: [PATCH 05/23] Fix eslint --- packages/core/js-client/src/index.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/core/js-client/src/index.ts b/packages/core/js-client/src/index.ts index 96a39772d..e62723419 100644 --- a/packages/core/js-client/src/index.ts +++ b/packages/core/js-client/src/index.ts @@ -67,7 +67,7 @@ const createClient = async ( { async getValue() { return getWorker( - getVersionedPackage("@'@fluencelabs/marine-worker' + getVersionedPackage("@fluencelabs/marine-worker"), CDNUrl, ); }, From c9b4d343768f6837a9f457a0c6d062d4ff323f86 Mon Sep 17 00:00:00 2001 From: Akim Mamedov Date: Tue, 24 Oct 2023 17:29:40 +0700 Subject: [PATCH 06/23] Fix tooling --- .prettierignore | 4 +++- packages/core/js-client/.prettierignore | 1 - packages/core/js-client/createVersionFile.js | 3 ++- 3 files changed, 5 insertions(+), 3 deletions(-) delete mode 100644 packages/core/js-client/.prettierignore diff --git a/.prettierignore b/.prettierignore index ce2074832..dd425f10e 100644 --- a/.prettierignore +++ b/.prettierignore @@ -7,4 +7,6 @@ pnpm-lock.yaml **/build **/public -**/CHANGELOG.md \ No newline at end of file +**/CHANGELOG.md + +packages/core/js-client/src/versions.ts \ No newline at end of file diff --git a/packages/core/js-client/.prettierignore b/packages/core/js-client/.prettierignore deleted file mode 100644 index 178135c2b..000000000 --- a/packages/core/js-client/.prettierignore +++ /dev/null @@ -1 +0,0 @@ -/dist/ diff --git a/packages/core/js-client/createVersionFile.js b/packages/core/js-client/createVersionFile.js index 4e98aa707..c1f2cb0bf 100644 --- a/packages/core/js-client/createVersionFile.js +++ b/packages/core/js-client/createVersionFile.js @@ -34,5 +34,6 @@ const output = { ...pkg.dependencies, ...pkg.devDependencies }.pick([ await writeFile( join(fileURLToPath(import.meta.url), "../src/versions.ts"), - `export default ${JSON.stringify(output, null, 2)} as const`, + `/* eslint-disable */ +export default ${JSON.stringify(output, null, 2)} as const`, ); From 45fbe165cba8ef8f0c5638a1a11537f14064722e Mon Sep 17 00:00:00 2001 From: Akim Mamedov Date: Tue, 24 Oct 2023 19:58:37 +0700 Subject: [PATCH 07/23] Fix formatting --- .gitignore | 1 + 1 file changed, 1 insertion(+) diff --git a/.gitignore b/.gitignore index 784700b5c..17bc31dbd 100644 --- a/.gitignore +++ b/.gitignore @@ -8,3 +8,4 @@ node_modules/ # Build directory **/dist **/public +.DS_Store \ No newline at end of file From ddb07d1a25e0948fae2678b683ec21d1c06f93c0 Mon Sep 17 00:00:00 2001 From: Akim Mamedov Date: Tue, 24 Oct 2023 19:59:52 +0700 Subject: [PATCH 08/23] Fix formatting --- packages/core/js-client-isomorphic/tsconfig.json | 9 ++------- packages/core/js-client/createVersionFile.js | 2 +- 2 files changed, 3 insertions(+), 8 deletions(-) diff --git a/packages/core/js-client-isomorphic/tsconfig.json b/packages/core/js-client-isomorphic/tsconfig.json index a33b91ca5..a04ef1f84 100644 --- a/packages/core/js-client-isomorphic/tsconfig.json +++ b/packages/core/js-client-isomorphic/tsconfig.json @@ -3,11 +3,6 @@ "compilerOptions": { "outDir": "./dist" }, - "include": [ - "src/**/*" - ], - "exclude": [ - "node_modules", - "dist" - ] + "include": ["src/**/*"], + "exclude": ["node_modules", "dist"] } diff --git a/packages/core/js-client/createVersionFile.js b/packages/core/js-client/createVersionFile.js index c1f2cb0bf..a915fd3ff 100644 --- a/packages/core/js-client/createVersionFile.js +++ b/packages/core/js-client/createVersionFile.js @@ -34,6 +34,6 @@ const output = { ...pkg.dependencies, ...pkg.devDependencies }.pick([ await writeFile( join(fileURLToPath(import.meta.url), "../src/versions.ts"), - `/* eslint-disable */ + `/* eslint-disable */ export default ${JSON.stringify(output, null, 2)} as const`, ); From 93423a32932c3deeb36238ec3d08ed948441fd4c Mon Sep 17 00:00:00 2001 From: Akim Mamedov Date: Tue, 24 Oct 2023 21:25:07 +0700 Subject: [PATCH 09/23] Fix test resource name --- packages/@tests/test-utils/src/index.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/@tests/test-utils/src/index.ts b/packages/@tests/test-utils/src/index.ts index 5cf9c599c..4dfef918c 100644 --- a/packages/@tests/test-utils/src/index.ts +++ b/packages/@tests/test-utils/src/index.ts @@ -59,7 +59,7 @@ export const startContentServer = ( rewrites: [ { source: "/js-client.min.js", - destination: "/source/index.umd.cjs", + destination: "/source/index.min.js", }, // TODO: // something like this From 9bc2b3e1a3ce26e6b9570b93a993743a3ff1cfed Mon Sep 17 00:00:00 2001 From: Akim Mamedov Date: Tue, 24 Oct 2023 21:26:41 +0700 Subject: [PATCH 10/23] Remove async --- packages/core/js-client-isomorphic/src/worker-resolvers/node.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/core/js-client-isomorphic/src/worker-resolvers/node.ts b/packages/core/js-client-isomorphic/src/worker-resolvers/node.ts index 91aacf6e8..0a73d0a6a 100644 --- a/packages/core/js-client-isomorphic/src/worker-resolvers/node.ts +++ b/packages/core/js-client-isomorphic/src/worker-resolvers/node.ts @@ -21,7 +21,7 @@ import url from "url"; import { Worker } from "threads/master"; -export async function getWorker(pkg: string, CDNUrl: string): Promise { +export function getWorker(pkg: string, CDNUrl: string): Promise { assert(typeof CDNUrl === "string"); const pkgWithoutVersion = pkg.split("@").slice(0, -1).join("@"); const require = module.createRequire(import.meta.url); From 1fdc9cb112a5938f84027339ea7b9d5458aa58a4 Mon Sep 17 00:00:00 2001 From: Akim Mamedov Date: Tue, 24 Oct 2023 21:35:39 +0700 Subject: [PATCH 11/23] Fix comments --- packages/core/js-client-isomorphic/package.json | 1 + .../src/fetchers/browser.ts | 6 ++++-- .../js-client-isomorphic/src/fetchers/node.ts | 13 ++++++------- packages/core/js-client-isomorphic/src/types.ts | 17 +++++++++++++++++ .../src/worker-resolvers/browser.ts | 6 +++++- .../src/worker-resolvers/node.ts | 10 +++++++--- packages/core/js-client/createVersionFile.js | 2 +- packages/core/js-client/src/index.ts | 8 ++++++-- 8 files changed, 47 insertions(+), 16 deletions(-) create mode 100644 packages/core/js-client-isomorphic/src/types.ts diff --git a/packages/core/js-client-isomorphic/package.json b/packages/core/js-client-isomorphic/package.json index beed5d1e3..c71291326 100644 --- a/packages/core/js-client-isomorphic/package.json +++ b/packages/core/js-client-isomorphic/package.json @@ -7,6 +7,7 @@ "build": "tsc" }, "exports": { + ".": "./dist/types.js", "./fetcher": { "node": "./dist/fetchers/node.js", "default": "./dist/fetchers/browser.js" diff --git a/packages/core/js-client-isomorphic/src/fetchers/browser.ts b/packages/core/js-client-isomorphic/src/fetchers/browser.ts index 5bfac2c68..e90e07c16 100644 --- a/packages/core/js-client-isomorphic/src/fetchers/browser.ts +++ b/packages/core/js-client-isomorphic/src/fetchers/browser.ts @@ -14,13 +14,15 @@ * limitations under the License. */ +import type { VersionedPackage } from "../types.js"; + /** * @param pkg name of package with version * @param assetPath path of required asset in given package * @param root CDN domain in browser or file system root in node */ export async function fetchResource( - pkg: string, + pkg: VersionedPackage, assetPath: string, root: string, ) { @@ -28,7 +30,7 @@ export async function fetchResource( ? assetPath.slice(1) : assetPath; - const url = new URL(`${pkg}/` + refinedAssetPath, root); + const url = new URL(`${pkg.name}@${pkg.version}/` + refinedAssetPath, root); return fetch(url).catch(() => { throw new Error(`Cannot fetch from ${url.toString()}`); diff --git a/packages/core/js-client-isomorphic/src/fetchers/node.ts b/packages/core/js-client-isomorphic/src/fetchers/node.ts index b9c19078f..29a3dc54a 100644 --- a/packages/core/js-client-isomorphic/src/fetchers/node.ts +++ b/packages/core/js-client-isomorphic/src/fetchers/node.ts @@ -18,33 +18,32 @@ import fs from "fs"; import module from "module"; import path from "path"; +import type { VersionedPackage } from "../types"; + /** * @param pkg name of package with version * @param assetPath path of required asset in given package * @param root CDN domain in browser or file system root in node */ export async function fetchResource( - pkg: string, + pkg: VersionedPackage, assetPath: string, root: string, ) { // TODO: `root` will be handled somehow in the future. For now, we use filesystem root where js-client is running; root = "/"; - const pkgWithoutVersion = pkg.split("@").slice(0, -1).join("@"); const require = module.createRequire(import.meta.url); - const packagePathIndex = require.resolve(pkgWithoutVersion); + const packagePathIndex = require.resolve(pkg.name); // Ensure that windows path is converted to posix path. So we can find a package const posixPath = packagePathIndex.split(path.sep).join(path.posix.sep); - const matches = new RegExp(`(.+${pkgWithoutVersion})`).exec(posixPath); + const matches = new RegExp(`(.+${pkg.name})`).exec(posixPath); const packagePath = matches?.[0]; if (packagePath == null) { - throw new Error( - `Cannot find dependency ${pkgWithoutVersion} in path ${posixPath}`, - ); + throw new Error(`Cannot find dependency ${pkg.name} in path ${posixPath}`); } const pathToResource = path.join(root, packagePath, assetPath); diff --git a/packages/core/js-client-isomorphic/src/types.ts b/packages/core/js-client-isomorphic/src/types.ts new file mode 100644 index 000000000..a893d3da3 --- /dev/null +++ b/packages/core/js-client-isomorphic/src/types.ts @@ -0,0 +1,17 @@ +/** + * Copyright 2023 Fluence Labs Limited + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +export type VersionedPackage = { name: string; version: string }; diff --git a/packages/core/js-client-isomorphic/src/worker-resolvers/browser.ts b/packages/core/js-client-isomorphic/src/worker-resolvers/browser.ts index 119b85f6d..fa48f72a0 100644 --- a/packages/core/js-client-isomorphic/src/worker-resolvers/browser.ts +++ b/packages/core/js-client-isomorphic/src/worker-resolvers/browser.ts @@ -17,8 +17,12 @@ import { BlobWorker, Worker } from "threads/master"; import { fetchResource } from "../fetchers/browser.js"; +import type { VersionedPackage } from "../types.js"; -export async function getWorker(pkg: string, CDNUrl: string): Promise { +export async function getWorker( + pkg: VersionedPackage, + CDNUrl: string, +): Promise { const fetchWorkerCode = async () => { const resource = await fetchResource( pkg, diff --git a/packages/core/js-client-isomorphic/src/worker-resolvers/node.ts b/packages/core/js-client-isomorphic/src/worker-resolvers/node.ts index 0a73d0a6a..e1f81527a 100644 --- a/packages/core/js-client-isomorphic/src/worker-resolvers/node.ts +++ b/packages/core/js-client-isomorphic/src/worker-resolvers/node.ts @@ -21,14 +21,18 @@ import url from "url"; import { Worker } from "threads/master"; -export function getWorker(pkg: string, CDNUrl: string): Promise { +import type { VersionedPackage } from "../types.js"; + +export function getWorker( + pkg: VersionedPackage, + CDNUrl: string, +): Promise { assert(typeof CDNUrl === "string"); - const pkgWithoutVersion = pkg.split("@").slice(0, -1).join("@"); const require = module.createRequire(import.meta.url); const pathToThisFile = path.dirname(url.fileURLToPath(import.meta.url)); - const pathToWorker = require.resolve(pkgWithoutVersion); + const pathToWorker = require.resolve(pkg.name); const relativePathToWorker = path.relative(pathToThisFile, pathToWorker); diff --git a/packages/core/js-client/createVersionFile.js b/packages/core/js-client/createVersionFile.js index a915fd3ff..a43edf763 100644 --- a/packages/core/js-client/createVersionFile.js +++ b/packages/core/js-client/createVersionFile.js @@ -33,7 +33,7 @@ const output = { ...pkg.dependencies, ...pkg.devDependencies }.pick([ ]); await writeFile( - join(fileURLToPath(import.meta.url), "../src/versions.ts"), + join(fileURLToPath(import.meta.url), "..", "src", "versions.ts"), `/* eslint-disable */ export default ${JSON.stringify(output, null, 2)} as const`, ); diff --git a/packages/core/js-client/src/index.ts b/packages/core/js-client/src/index.ts index e62723419..3c12cb455 100644 --- a/packages/core/js-client/src/index.ts +++ b/packages/core/js-client/src/index.ts @@ -14,6 +14,7 @@ * limitations under the License. */ +import type { VersionedPackage } from "@fluencelabs/js-client-isomorphic"; import { fetchResource } from "@fluencelabs/js-client-isomorphic/fetcher"; import { getWorker } from "@fluencelabs/js-client-isomorphic/worker-resolver"; @@ -30,8 +31,11 @@ import versions from "./versions.js"; const DEFAULT_CDN_URL = "https://unpkg.com"; -const getVersionedPackage = (pkg: keyof typeof versions) => { - return `${pkg}@${versions[pkg]}`; +const getVersionedPackage = (pkg: keyof typeof versions): VersionedPackage => { + return { + name: pkg, + version: versions[pkg], + }; }; const createClient = async ( From c1db062a6f51b5f7bdbf7be1ef245745dcb6dd34 Mon Sep 17 00:00:00 2001 From: Akim Mamedov Date: Tue, 24 Oct 2023 21:58:11 +0700 Subject: [PATCH 12/23] Add ts-check --- packages/core/js-client/createVersionFile.js | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/packages/core/js-client/createVersionFile.js b/packages/core/js-client/createVersionFile.js index a43edf763..1b7ef808d 100644 --- a/packages/core/js-client/createVersionFile.js +++ b/packages/core/js-client/createVersionFile.js @@ -14,23 +14,23 @@ * limitations under the License. */ +// @ts-check + import pkg from "./package.json" assert { type: "json" }; import { writeFile } from "fs/promises"; import { join } from "path"; import { fileURLToPath } from "url"; -Object.prototype.pick = function (names) { - return names.reduce((acc, name) => { - acc[name] = this[name]; - return acc; - }, {}); -}; - -const output = { ...pkg.dependencies, ...pkg.devDependencies }.pick([ +const names = [ "@fluencelabs/avm", "@fluencelabs/marine-js", "@fluencelabs/marine-worker", -]); +]; + +const entries = Object.entries({ ...pkg.dependencies, ...pkg.devDependencies }) + .filter(([name]) => names.includes(name)); + +const output = Object.fromEntries(entries); await writeFile( join(fileURLToPath(import.meta.url), "..", "src", "versions.ts"), From 2c4940ce9de4ee7ca592759ba216ff682b784ad4 Mon Sep 17 00:00:00 2001 From: Akim Mamedov Date: Tue, 24 Oct 2023 23:54:08 +0700 Subject: [PATCH 13/23] Add new line --- .gitignore | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.gitignore b/.gitignore index 17bc31dbd..d13592cd5 100644 --- a/.gitignore +++ b/.gitignore @@ -8,4 +8,4 @@ node_modules/ # Build directory **/dist **/public -.DS_Store \ No newline at end of file +.DS_Store From 86d6eb2631c286deb686213bc15bb5342f206c18 Mon Sep 17 00:00:00 2001 From: Akim Mamedov Date: Wed, 25 Oct 2023 00:14:17 +0700 Subject: [PATCH 14/23] Fix arg --- .../core/js-client-isomorphic/src/worker-resolvers/node.ts | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/packages/core/js-client-isomorphic/src/worker-resolvers/node.ts b/packages/core/js-client-isomorphic/src/worker-resolvers/node.ts index e1f81527a..092e965d6 100644 --- a/packages/core/js-client-isomorphic/src/worker-resolvers/node.ts +++ b/packages/core/js-client-isomorphic/src/worker-resolvers/node.ts @@ -14,7 +14,6 @@ * limitations under the License. */ -import assert from "assert"; import module from "module"; import path from "path"; import url from "url"; @@ -25,9 +24,10 @@ import type { VersionedPackage } from "../types.js"; export function getWorker( pkg: VersionedPackage, - CDNUrl: string, + // Not used, but still required to match a signature + // eslint-disable-next-line + _CDNUrl: string, ): Promise { - assert(typeof CDNUrl === "string"); const require = module.createRequire(import.meta.url); const pathToThisFile = path.dirname(url.fileURLToPath(import.meta.url)); From 969062b685a646afb40847cef86b3d40494b5db2 Mon Sep 17 00:00:00 2001 From: Akim Mamedov Date: Wed, 25 Oct 2023 00:23:08 +0700 Subject: [PATCH 15/23] add todo's --- .../core/aqua-to-js/src/generate/__test__/generate.spec.ts | 3 +++ 1 file changed, 3 insertions(+) diff --git a/packages/core/aqua-to-js/src/generate/__test__/generate.spec.ts b/packages/core/aqua-to-js/src/generate/__test__/generate.spec.ts index e4951b801..4457d3349 100644 --- a/packages/core/aqua-to-js/src/generate/__test__/generate.spec.ts +++ b/packages/core/aqua-to-js/src/generate/__test__/generate.spec.ts @@ -40,14 +40,17 @@ describe("Aqua to js/ts compiler", () => { }, }; + // TODO: see https://github.com/fluencelabs/js-client/pull/366#discussion_r1370567711 // @ts-expect-error don't use compileFromPath directly here const jsResult = generateSources(res, "js", pkg); + // TODO: see https://github.com/fluencelabs/js-client/pull/366#discussion_r1370567711 // @ts-expect-error don't use compileFromPath directly here const jsTypes = generateTypes(res, pkg); expect(jsResult).toMatchSnapshot(); expect(jsTypes).toMatchSnapshot(); + // TODO: see https://github.com/fluencelabs/js-client/pull/366#discussion_r1370567711 // @ts-expect-error don't use compileFromPath directly here const tsResult = generateSources(res, "ts", pkg); From 8cb3ab818387a20974f54519314594135f86208a Mon Sep 17 00:00:00 2001 From: Akim Mamedov Date: Wed, 25 Oct 2023 06:17:21 +0700 Subject: [PATCH 16/23] Fix lint --- packages/core/js-client/createVersionFile.js | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/packages/core/js-client/createVersionFile.js b/packages/core/js-client/createVersionFile.js index 1b7ef808d..c7c186de4 100644 --- a/packages/core/js-client/createVersionFile.js +++ b/packages/core/js-client/createVersionFile.js @@ -27,8 +27,10 @@ const names = [ "@fluencelabs/marine-worker", ]; -const entries = Object.entries({ ...pkg.dependencies, ...pkg.devDependencies }) - .filter(([name]) => names.includes(name)); +const entries = Object.entries({ + ...pkg.dependencies, + ...pkg.devDependencies, +}).filter(([name]) => names.includes(name)); const output = Object.fromEntries(entries); From 730e78e748ca7c81044dc621d0abd9dbc8bde947 Mon Sep 17 00:00:00 2001 From: Akim Mamedov Date: Wed, 25 Oct 2023 06:24:53 +0700 Subject: [PATCH 17/23] Fix typo --- packages/core/js-client-isomorphic/src/worker-resolvers/node.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/core/js-client-isomorphic/src/worker-resolvers/node.ts b/packages/core/js-client-isomorphic/src/worker-resolvers/node.ts index 092e965d6..0fb137ed4 100644 --- a/packages/core/js-client-isomorphic/src/worker-resolvers/node.ts +++ b/packages/core/js-client-isomorphic/src/worker-resolvers/node.ts @@ -24,7 +24,7 @@ import type { VersionedPackage } from "../types.js"; export function getWorker( pkg: VersionedPackage, - // Not used, but still required to match a signature + // Not used, but still required to match a function signature // eslint-disable-next-line _CDNUrl: string, ): Promise { From 5ac94d9b9c133f7511e5a26cd3ce02630b0a15b6 Mon Sep 17 00:00:00 2001 From: Akim Mamedov Date: Wed, 25 Oct 2023 06:24:58 +0700 Subject: [PATCH 18/23] Type module --- packages/core/js-client-isomorphic/package.json | 1 + 1 file changed, 1 insertion(+) diff --git a/packages/core/js-client-isomorphic/package.json b/packages/core/js-client-isomorphic/package.json index c71291326..40ba79d4d 100644 --- a/packages/core/js-client-isomorphic/package.json +++ b/packages/core/js-client-isomorphic/package.json @@ -1,4 +1,5 @@ { + "type": "module", "name": "@fluencelabs/js-client-isomorphic", "version": "1.0.0", "description": "", From 9b8b950f892acb80b1b4ab44426d3a76d67acd6f Mon Sep 17 00:00:00 2001 From: Akim Mamedov Date: Wed, 25 Oct 2023 17:22:45 +0700 Subject: [PATCH 19/23] Add deps to isomorphic package --- .../core/js-client-isomorphic/package.json | 3 ++ .../js-client-isomorphic/src/fetchers/node.ts | 28 ++++------- .../src/worker-resolvers/node.ts | 12 ++--- pnpm-lock.yaml | 47 ++++++++++++++++++- 4 files changed, 63 insertions(+), 27 deletions(-) diff --git a/packages/core/js-client-isomorphic/package.json b/packages/core/js-client-isomorphic/package.json index 40ba79d4d..23d3da0f6 100644 --- a/packages/core/js-client-isomorphic/package.json +++ b/packages/core/js-client-isomorphic/package.json @@ -19,6 +19,9 @@ } }, "dependencies": { + "@fluencelabs/avm": "0.52.0", + "@fluencelabs/marine-js": "0.7.2", + "@fluencelabs/marine-worker": "workspace:*", "threads": "fluencelabs/threads.js#b00a5342380b0278d3ae56dcfb170effb3cad7cd" }, "keywords": [], diff --git a/packages/core/js-client-isomorphic/src/fetchers/node.ts b/packages/core/js-client-isomorphic/src/fetchers/node.ts index 29a3dc54a..94c0751ea 100644 --- a/packages/core/js-client-isomorphic/src/fetchers/node.ts +++ b/packages/core/js-client-isomorphic/src/fetchers/node.ts @@ -14,16 +14,16 @@ * limitations under the License. */ -import fs from "fs"; -import module from "module"; -import path from "path"; +import { readFile } from "fs/promises"; +import { createRequire } from "module"; +import { sep, posix, join } from "path"; -import type { VersionedPackage } from "../types"; +import type { VersionedPackage } from "../types.js"; /** * @param pkg name of package with version * @param assetPath path of required asset in given package - * @param root CDN domain in browser or file system root in node + * @param root CDN domain in browser or js-client itself in node */ export async function fetchResource( pkg: VersionedPackage, @@ -32,11 +32,11 @@ export async function fetchResource( ) { // TODO: `root` will be handled somehow in the future. For now, we use filesystem root where js-client is running; root = "/"; - const require = module.createRequire(import.meta.url); + const require = createRequire(import.meta.url); const packagePathIndex = require.resolve(pkg.name); // Ensure that windows path is converted to posix path. So we can find a package - const posixPath = packagePathIndex.split(path.sep).join(path.posix.sep); + const posixPath = packagePathIndex.split(sep).join(posix.sep); const matches = new RegExp(`(.+${pkg.name})`).exec(posixPath); @@ -46,19 +46,9 @@ export async function fetchResource( throw new Error(`Cannot find dependency ${pkg.name} in path ${posixPath}`); } - const pathToResource = path.join(root, packagePath, assetPath); + const pathToResource = join(root, packagePath, assetPath); - const file = await new Promise((resolve, reject) => { - // Cannot use 'fs/promises' with current vite config. This module is not polyfilled by default. - fs.readFile(pathToResource, (err, data) => { - if (err != null) { - reject(err); - return; - } - - resolve(data); - }); - }); + const file = await readFile(pathToResource); return new Response(file, { headers: { diff --git a/packages/core/js-client-isomorphic/src/worker-resolvers/node.ts b/packages/core/js-client-isomorphic/src/worker-resolvers/node.ts index 0fb137ed4..83348aa07 100644 --- a/packages/core/js-client-isomorphic/src/worker-resolvers/node.ts +++ b/packages/core/js-client-isomorphic/src/worker-resolvers/node.ts @@ -14,9 +14,9 @@ * limitations under the License. */ -import module from "module"; -import path from "path"; -import url from "url"; +import { createRequire } from "module"; +import { dirname, relative } from "path"; +import { fileURLToPath } from "url"; import { Worker } from "threads/master"; @@ -28,13 +28,13 @@ export function getWorker( // eslint-disable-next-line _CDNUrl: string, ): Promise { - const require = module.createRequire(import.meta.url); + const require = createRequire(import.meta.url); - const pathToThisFile = path.dirname(url.fileURLToPath(import.meta.url)); + const pathToThisFile = dirname(fileURLToPath(import.meta.url)); const pathToWorker = require.resolve(pkg.name); - const relativePathToWorker = path.relative(pathToThisFile, pathToWorker); + const relativePathToWorker = relative(pathToThisFile, pathToWorker); return Promise.resolve(new Worker(relativePathToWorker)); } diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 5dcfaa01f..9c9477f96 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -320,6 +320,15 @@ importers: packages/core/js-client-isomorphic: dependencies: + '@fluencelabs/avm': + specifier: 0.52.0 + version: 0.52.0 + '@fluencelabs/marine-js': + specifier: 0.7.2 + version: 0.7.2 + '@fluencelabs/marine-worker': + specifier: workspace:* + version: link:../marine-worker threads: specifier: fluencelabs/threads.js#b00a5342380b0278d3ae56dcfb170effb3cad7cd version: github.com/fluencelabs/threads.js/b00a5342380b0278d3ae56dcfb170effb3cad7cd @@ -1172,6 +1181,16 @@ packages: '@babel/helper-plugin-utils': 7.22.5 dev: false + /@babel/plugin-syntax-flow@7.22.5(@babel/core@7.22.10): + resolution: {integrity: sha512-9RdCl0i+q0QExayk2nOS7853w08yLucnnPML6EN9S8fgMPVtdLDCdx/cOQ/i44Lb9UeQX9A35yaqBBOMMZxPxQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.22.10 + '@babel/helper-plugin-utils': 7.22.5 + dev: false + /@babel/plugin-syntax-flow@7.22.5(@babel/core@7.22.5): resolution: {integrity: sha512-9RdCl0i+q0QExayk2nOS7853w08yLucnnPML6EN9S8fgMPVtdLDCdx/cOQ/i44Lb9UeQX9A35yaqBBOMMZxPxQ==} engines: {node: '>=6.9.0'} @@ -1258,6 +1277,16 @@ packages: '@babel/helper-plugin-utils': 7.22.5 dev: false + /@babel/plugin-syntax-jsx@7.22.5(@babel/core@7.22.10): + resolution: {integrity: sha512-gvyP4hZrgrs/wWMaocvxZ44Hw0b3W8Pe+cMxc8V1ULQ07oh8VNbIRaoD1LRZVTvD+0nieDKjfgKg89sD7rrKrg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.22.10 + '@babel/helper-plugin-utils': 7.22.5 + dev: false + /@babel/plugin-syntax-jsx@7.22.5(@babel/core@7.22.5): resolution: {integrity: sha512-gvyP4hZrgrs/wWMaocvxZ44Hw0b3W8Pe+cMxc8V1ULQ07oh8VNbIRaoD1LRZVTvD+0nieDKjfgKg89sD7rrKrg==} engines: {node: '>=6.9.0'} @@ -2381,6 +2410,20 @@ packages: '@babel/plugin-transform-react-jsx': 7.22.5(@babel/core@7.22.5) dev: false + /@babel/plugin-transform-react-jsx@7.22.5(@babel/core@7.22.10): + resolution: {integrity: sha512-rog5gZaVbUip5iWDMTYbVM15XQq+RkUKhET/IHR6oizR+JEoN6CAfTTuHcK4vwUyzca30qqHqEpzBOnaRMWYMA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.22.10 + '@babel/helper-annotate-as-pure': 7.22.5 + '@babel/helper-module-imports': 7.22.5 + '@babel/helper-plugin-utils': 7.22.5 + '@babel/plugin-syntax-jsx': 7.22.5(@babel/core@7.22.10) + '@babel/types': 7.22.5 + dev: false + /@babel/plugin-transform-react-jsx@7.22.5(@babel/core@7.22.5): resolution: {integrity: sha512-rog5gZaVbUip5iWDMTYbVM15XQq+RkUKhET/IHR6oizR+JEoN6CAfTTuHcK4vwUyzca30qqHqEpzBOnaRMWYMA==} engines: {node: '>=6.9.0'} @@ -10379,8 +10422,8 @@ packages: '@babel/plugin-transform-react-jsx': ^7.14.9 eslint: ^8.1.0 dependencies: - '@babel/plugin-syntax-flow': 7.22.5(@babel/core@7.22.5) - '@babel/plugin-transform-react-jsx': 7.22.5(@babel/core@7.22.5) + '@babel/plugin-syntax-flow': 7.22.5(@babel/core@7.22.10) + '@babel/plugin-transform-react-jsx': 7.22.5(@babel/core@7.22.10) eslint: 8.50.0 lodash: 4.17.21 string-natural-compare: 3.0.1 From 083d9642235bc83a8555216286aa5ac14b822baf Mon Sep 17 00:00:00 2001 From: Akim Mamedov Date: Wed, 25 Oct 2023 17:40:53 +0700 Subject: [PATCH 20/23] Extract function type --- packages/core/js-client-isomorphic/src/types.ts | 5 +++++ .../src/worker-resolvers/browser.ts | 12 ++++++------ .../src/worker-resolvers/node.ts | 13 ++++--------- 3 files changed, 15 insertions(+), 15 deletions(-) diff --git a/packages/core/js-client-isomorphic/src/types.ts b/packages/core/js-client-isomorphic/src/types.ts index a893d3da3..c0d3cb12d 100644 --- a/packages/core/js-client-isomorphic/src/types.ts +++ b/packages/core/js-client-isomorphic/src/types.ts @@ -13,5 +13,10 @@ * See the License for the specific language governing permissions and * limitations under the License. */ +import { Worker } from "threads/master"; export type VersionedPackage = { name: string; version: string }; +export type GetWorker = ( + pkg: VersionedPackage, + CDNUrl: string, +) => Promise; diff --git a/packages/core/js-client-isomorphic/src/worker-resolvers/browser.ts b/packages/core/js-client-isomorphic/src/worker-resolvers/browser.ts index fa48f72a0..c197c821f 100644 --- a/packages/core/js-client-isomorphic/src/worker-resolvers/browser.ts +++ b/packages/core/js-client-isomorphic/src/worker-resolvers/browser.ts @@ -14,15 +14,15 @@ * limitations under the License. */ -import { BlobWorker, Worker } from "threads/master"; +import { BlobWorker } from "threads/master"; import { fetchResource } from "../fetchers/browser.js"; -import type { VersionedPackage } from "../types.js"; +import type { GetWorker, VersionedPackage } from "../types.js"; -export async function getWorker( +export const getWorker: GetWorker = async ( pkg: VersionedPackage, CDNUrl: string, -): Promise { +) => { const fetchWorkerCode = async () => { const resource = await fetchResource( pkg, @@ -34,5 +34,5 @@ export async function getWorker( }; const workerCode = await fetchWorkerCode(); - return Promise.resolve(BlobWorker.fromText(workerCode)); -} + return BlobWorker.fromText(workerCode); +}; diff --git a/packages/core/js-client-isomorphic/src/worker-resolvers/node.ts b/packages/core/js-client-isomorphic/src/worker-resolvers/node.ts index 83348aa07..6e23bf8ea 100644 --- a/packages/core/js-client-isomorphic/src/worker-resolvers/node.ts +++ b/packages/core/js-client-isomorphic/src/worker-resolvers/node.ts @@ -20,14 +20,9 @@ import { fileURLToPath } from "url"; import { Worker } from "threads/master"; -import type { VersionedPackage } from "../types.js"; - -export function getWorker( - pkg: VersionedPackage, - // Not used, but still required to match a function signature - // eslint-disable-next-line - _CDNUrl: string, -): Promise { +import type { GetWorker, VersionedPackage } from "../types.js"; + +export const getWorker: GetWorker = (pkg: VersionedPackage) => { const require = createRequire(import.meta.url); const pathToThisFile = dirname(fileURLToPath(import.meta.url)); @@ -37,4 +32,4 @@ export function getWorker( const relativePathToWorker = relative(pathToThisFile, pathToWorker); return Promise.resolve(new Worker(relativePathToWorker)); -} +}; From 94f0e439a2102f6648892151c077faf7e6d39d79 Mon Sep 17 00:00:00 2001 From: Akim Mamedov Date: Wed, 25 Oct 2023 18:03:12 +0700 Subject: [PATCH 21/23] Fix newline --- packages/core/js-client-isomorphic/src/types.ts | 1 + 1 file changed, 1 insertion(+) diff --git a/packages/core/js-client-isomorphic/src/types.ts b/packages/core/js-client-isomorphic/src/types.ts index c0d3cb12d..389bed28e 100644 --- a/packages/core/js-client-isomorphic/src/types.ts +++ b/packages/core/js-client-isomorphic/src/types.ts @@ -13,6 +13,7 @@ * See the License for the specific language governing permissions and * limitations under the License. */ + import { Worker } from "threads/master"; export type VersionedPackage = { name: string; version: string }; From 036a1e5c4dc1faf322020fd4ab74359b81b891d6 Mon Sep 17 00:00:00 2001 From: Akim Mamedov Date: Wed, 25 Oct 2023 18:18:05 +0700 Subject: [PATCH 22/23] Remove private --- packages/core/js-client-isomorphic/package.json | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/packages/core/js-client-isomorphic/package.json b/packages/core/js-client-isomorphic/package.json index 23d3da0f6..bf3334835 100644 --- a/packages/core/js-client-isomorphic/package.json +++ b/packages/core/js-client-isomorphic/package.json @@ -26,6 +26,5 @@ }, "keywords": [], "author": "Fluence Labs", - "license": "Apache-2.0", - "private": true + "license": "Apache-2.0" } From 633d206385a8153830093a402c2b90733eea7295 Mon Sep 17 00:00:00 2001 From: Akim Mamedov Date: Wed, 25 Oct 2023 18:47:44 +0700 Subject: [PATCH 23/23] Use prepare hook instead of postinstall --- packages/core/js-client-isomorphic/package.json | 5 ++++- packages/core/js-client/createVersionFile.js | 4 ++-- packages/core/js-client/package.json | 2 +- 3 files changed, 7 insertions(+), 4 deletions(-) diff --git a/packages/core/js-client-isomorphic/package.json b/packages/core/js-client-isomorphic/package.json index bf3334835..175178edc 100644 --- a/packages/core/js-client-isomorphic/package.json +++ b/packages/core/js-client-isomorphic/package.json @@ -2,7 +2,10 @@ "type": "module", "name": "@fluencelabs/js-client-isomorphic", "version": "1.0.0", - "description": "", + "description": "Isomorphic entities for js-client", + "files": [ + "dist" + ], "main": "index.js", "scripts": { "build": "tsc" diff --git a/packages/core/js-client/createVersionFile.js b/packages/core/js-client/createVersionFile.js index c7c186de4..32e589993 100644 --- a/packages/core/js-client/createVersionFile.js +++ b/packages/core/js-client/createVersionFile.js @@ -18,7 +18,7 @@ import pkg from "./package.json" assert { type: "json" }; import { writeFile } from "fs/promises"; -import { join } from "path"; +import { join, dirname } from "path"; import { fileURLToPath } from "url"; const names = [ @@ -35,7 +35,7 @@ const entries = Object.entries({ const output = Object.fromEntries(entries); await writeFile( - join(fileURLToPath(import.meta.url), "..", "src", "versions.ts"), + join(dirname(fileURLToPath(import.meta.url)), "src", "versions.ts"), `/* eslint-disable */ export default ${JSON.stringify(output, null, 2)} as const`, ); diff --git a/packages/core/js-client/package.json b/packages/core/js-client/package.json index 18a162d51..fcd0a5653 100644 --- a/packages/core/js-client/package.json +++ b/packages/core/js-client/package.json @@ -25,7 +25,7 @@ "scripts": { "build": "tsc && vite build", "test": "vitest --threads false run", - "postinstall": "node createVersionFile.js" + "prepare": "node createVersionFile.js" }, "repository": "https://github.com/fluencelabs/fluence-js", "author": "Fluence Labs",