diff --git a/Cargo.lock b/Cargo.lock
index d2d21a4..5d91457 100644
--- a/Cargo.lock
+++ b/Cargo.lock
@@ -3691,6 +3691,7 @@ dependencies = [
"ng-storage-rocksdb",
"ng-verifier",
"once_cell",
+ "reqwest 0.11.27",
"rust-embed",
"serde",
"serde_bare",
diff --git a/Cargo.toml b/Cargo.toml
index eff8e24..2e031d3 100644
--- a/Cargo.toml
+++ b/Cargo.toml
@@ -77,4 +77,5 @@ opt-level = 2
[workspace.metadata.scripts]
-libwasm = "cd sdk/js/lib-wasm && cargo run-script app && cd ../../.."
\ No newline at end of file
+libwasm = "cd sdk/js/lib-wasm && cargo run-script app && cd ../../.."
+libwasmdev = "cd sdk/js/lib-wasm && cargo run-script appdev && cd ../../.."
\ No newline at end of file
diff --git a/engine/broker/Cargo.toml b/engine/broker/Cargo.toml
index f4b4686..df26e2b 100644
--- a/engine/broker/Cargo.toml
+++ b/engine/broker/Cargo.toml
@@ -26,6 +26,7 @@ async-trait = "0.1.64"
rust-embed = { version = "6.7.0", features = ["include-exclude","debug-embed"] }
urlencoding = "2.1.3"
blake3 = "1.3.1"
+reqwest = { version = "0.11.18", features = ["blocking", "native-tls-vendored"] }
ng-async-tungstenite = { version = "0.22.2", git = "https://git.nextgraph.org/NextGraph/async-tungstenite.git", branch = "nextgraph", features = [
"async-std-runtime",
] }
diff --git a/engine/broker/auth/index.html b/engine/broker/auth/index.html
index dc7c03a..9ada603 100644
--- a/engine/broker/auth/index.html
+++ b/engine/broker/auth/index.html
@@ -11,6 +11,7 @@
+
NextGraph Auth
diff --git a/engine/broker/auth/package.json b/engine/broker/auth/package.json
index 73af863..0533197 100644
--- a/engine/broker/auth/package.json
+++ b/engine/broker/auth/package.json
@@ -6,6 +6,7 @@
"scripts": {
"dev": "vite",
"build": "vite build --base=./ && node prepare-app-file.cjs && shx rm -rf ./dist/assets",
+ "dev3": "cross-env NG_DEV3=1 vite",
"builddev": "cross-env NG_DEV=1 vite build --base=./ && shx rm -rf ./dist/assets && shx mkdir -p ../../../app/nextgraph/public_dev && cp ./dist/index.html ../../../app/nextgraph/public_dev/appauth.html",
"preview": "vite preview"
},
diff --git a/engine/broker/auth/src/App.svelte b/engine/broker/auth/src/App.svelte
index d032906..09c1a7b 100644
--- a/engine/broker/auth/src/App.svelte
+++ b/engine/broker/auth/src/App.svelte
@@ -90,11 +90,11 @@
// wallets.set(walls);
// };
const redirect_server = import.meta.env.NG_REDIR_SERVER || "nextgraph.net";
- const iframe_config = import.meta.env.DEV ? {src:"http://localhost:14404/?o=", origin: "http://localhost:14404"} :
+ const iframe_config =
+ import.meta.env.NG_DEV3 ? {src:"http://127.0.0.1:3033/auth/?o=", origin: "http://127.0.0.1:3033"} :
+ import.meta.env.DEV ? {src:"http://localhost:14404/?o=", origin: "http://localhost:14404"} :
import.meta.env.NG_DEV ? {src:"http://localhost:1421/auth.html?o=", origin: "http://localhost:1421"} :
{src:`https://${redirect_server}/auth/?o=`, origin: `https://${redirect_server}`} ;
- // to test ngnet
- //const iframe_config = {src:"http://127.0.0.1:3033/auth/?o=", origin: "http://127.0.0.1:3033"};
onMount(async () => {
diff --git a/engine/broker/auth/src/routes/Home.svelte b/engine/broker/auth/src/routes/Home.svelte
index ada05bb..d7dd9a8 100644
--- a/engine/broker/auth/src/routes/Home.svelte
+++ b/engine/broker/auth/src/routes/Home.svelte
@@ -25,6 +25,7 @@
derived,
cannot_load_offline,
} from "@ng-org/ui-common/store";
+ import { origin } from "../store";
let display_login_create = !$has_wallets || !$active_wallet;
let unsubscribe;
@@ -40,6 +41,9 @@
push("#/wallet/login");
}
});
+ if (import.meta.env.NG_DEV3 && $origin) {
+ push("#/?o="+encodeURIComponent($origin));
+ }
});
onDestroy(() => {
diff --git a/engine/broker/auth/vite.config.js b/engine/broker/auth/vite.config.js
index e5804c8..6ade54e 100644
--- a/engine/broker/auth/vite.config.js
+++ b/engine/broker/auth/vite.config.js
@@ -23,7 +23,7 @@ const jsToBottom = () => {
export default defineConfig({
envPrefix: ["VITE_", "NG_"],
server: {
- port: 14401
+ port: 14401,
},
worker: {
format: 'es',
diff --git a/engine/broker/src/server_ws.rs b/engine/broker/src/server_ws.rs
index 4d8f3ca..4573527 100644
--- a/engine/broker/src/server_ws.rs
+++ b/engine/broker/src/server_ws.rs
@@ -13,6 +13,7 @@
use std::collections::HashMap;
use std::collections::HashSet;
+use std::io::Read;
use std::net::IpAddr;
use std::net::SocketAddr;
use std::path::PathBuf;
@@ -245,6 +246,7 @@ fn upgrade_ws_or_serve_app(
}
if serve_app && (remote.is_private() || remote.is_loopback()) {
+ log_debug!("GET {}", uri.path_and_query().unwrap().as_str());
if uri == "/" {
log_debug!("Serving the app");
let sha_file = App::get("index.sha256").unwrap();
@@ -272,8 +274,7 @@ fn upgrade_ws_or_serve_app(
.body(Some(file.data.to_vec()))
.unwrap();
return Err(res);
- } else if uri.path() == "/auth/" {
- log_debug!("Serving auth app");
+ } else if std::env::var("NG_DEV3").is_ok() && uri.path().starts_with("/auth") {
// if referer.is_none() || referer.unwrap().to_str().is_err() || referer.unwrap().to_str().unwrap() != "https://nextgraph.net/" {
// return Err(make_error(StatusCode::FORBIDDEN));
// }
@@ -290,6 +291,32 @@ fn upgrade_ws_or_serve_app(
// }
// None => return Err(make_error(StatusCode::BAD_REQUEST)),
// };
+ let path = format!(
+ "http://localhost:14401{}",
+ uri.path_and_query()
+ .unwrap()
+ .as_str()
+ .get(5..)
+ .unwrap_or("")
+ );
+ log_debug!("SERVING AUTH APP from {path}");
+
+ match reqwest::blocking::get(path) {
+ Err(e) => return Err(make_error(StatusCode::NOT_FOUND)),
+ Ok(mut res) => {
+ use std::io::{Cursor, Write};
+ let mut builder = Response::builder().status(res.status());
+ for (name, value) in res.headers().into_iter() {
+ builder = builder.header(name, value);
+ }
+ let mut buffer: Vec = vec![];
+ let mut cursor = Cursor::new(&mut buffer);
+ res.copy_to(&mut cursor);
+ return Err(builder.body(Some(buffer)).unwrap());
+ }
+ }
+ } else if uri == "/auth/" {
+ log_debug!("Serving auth app");
let sha_file = AppAuth::get("index.sha256").unwrap();
let sha = format!(
"\"{}\"",
diff --git a/infra/ngnet/Cargo.toml b/infra/ngnet/Cargo.toml
index 82f1e98..e360766 100644
--- a/infra/ngnet/Cargo.toml
+++ b/infra/ngnet/Cargo.toml
@@ -15,6 +15,8 @@ rust-version.workspace = true
[package.metadata.scripts]
buildfront = "pnpm -C ./web build && pnpm -C ./bootstrap build && pnpm -C ./auth build && pnpm -C ./redir build"
+buildfrontdev = "pnpm -C ./auth builddev && pnpm -C ./bootstrap builddev && pnpm -C ./redir builddev && pnpm -C ./web build"
+buildfrontdev3 = "pnpm -C ./auth build && pnpm -C ./web build && pnpm -C ./bootstrap builddev && pnpm -C ./redir build"
[dependencies]
serde = { version = "1.0.142", features = ["derive"] }
diff --git a/infra/ngnet/README.md b/infra/ngnet/README.md
index 9b4eece..bfeb7c7 100644
--- a/infra/ngnet/README.md
+++ b/infra/ngnet/README.md
@@ -11,27 +11,28 @@ npm install -g pnpm
pnpm install
```
-## Dev
+## Dev (of the app)
-compile the 3 front-ends, in dev mode
+compile the 4 front-ends, in dev mode
```
-pnpm -C ./auth builddev
-pnpm -C ./bootstrap builddev
-pnpm -C ./redir builddev
+cargo run-script buildfrontdev
```
```bash
-cd web
-pnpm run dev --host
-
-# In another terminal... in the folder ngnet
cargo watch -c -w src -x run
```
> Currently, the ngnet server api is listening on http://127.0.0.1:3033 only, which might cause you trouble with Android emulator (hardcoded in `main.rs`).
> If you need to test from a (virtual) android device, you can use adb to tunnel the connection like: [`adb reverse tcp:3033 tcp:3033`](https://justinchips.medium.com/proxying-adb-client-connections-2ab495f774eb).
+## Dev (of the SDK)
+
+```
+cargo run-script buildfrontdev3
+cargo run
+```
+
## Prod
```
diff --git a/infra/ngnet/auth/src/main.ts b/infra/ngnet/auth/src/main.ts
index e0fb89a..812d997 100644
--- a/infra/ngnet/auth/src/main.ts
+++ b/infra/ngnet/auth/src/main.ts
@@ -9,11 +9,12 @@
const searchParams = new URLSearchParams(window.location.search);
let o = searchParams.get("o");
+let parent_origin = (new URL(o)).origin;
let web_origin;
let web_redirect;
let wallet_port;
-let web_origin_host;
+//let web_origin_host;
let session;
async function rpc( method:string, port: MessagePort, args?: any) : Promise {
@@ -25,16 +26,16 @@ async function rpc( method:string, port: MessagePort, args?: any) : Promise
window.addEventListener("message", async (event)=>{
//console.log("ngnet auth got msg from", event.origin, event.data);
const { method, port } = event.data;
- if (event.origin === o) {
+ if (event.origin === parent_origin) {
if (event.data.ready) return;
if ( method === "init" ) {
web_redirect = event.data.manifest.origin;
let url = new URL(web_redirect);
web_origin = url.origin;
- web_origin_host = url.host;
+ //web_origin_host = url.host;
session = event.data.session;
port.onclose = () => {
- console.error("BSP parent window closed its port with nextgraph.net");
+ console.error("BSP parent window closed its port with us, te redirecting server");
};
wallet_port = port;
diff --git a/infra/ngnet/bootstrap/src/App.svelte b/infra/ngnet/bootstrap/src/App.svelte
index 104d272..2f9d158 100644
--- a/infra/ngnet/bootstrap/src/App.svelte
+++ b/infra/ngnet/bootstrap/src/App.svelte
@@ -36,7 +36,7 @@
const bsp_list = [
"https://nextgraph.eu",
"https://nextgraph.one",
- "https://stage1.nextgraph.eu",
+ "https://stage1.nextgraph.eu"
];
let channel;
diff --git a/infra/ngnet/redir/src/lib/Home.svelte b/infra/ngnet/redir/src/lib/Home.svelte
index b268fa8..3d78d7f 100644
--- a/infra/ngnet/redir/src/lib/Home.svelte
+++ b/infra/ngnet/redir/src/lib/Home.svelte
@@ -39,8 +39,8 @@
let broker = broker_info[1];
broker_name = broker_info[0];
let url;
- if (import.meta.env.DEV && broker.localhost === 1421) {
- // dev mode
+ if ( import.meta.env.DEV && broker.localhost === 1421 ) {
+ // dev mode
url = "http://localhost:14401/";
} else if (import.meta.env.NG_DEV && broker.localhost === 14400) {
// dev mode
diff --git a/infra/ngnet/src/main.rs b/infra/ngnet/src/main.rs
index bbd5b83..9950f80 100644
--- a/infra/ngnet/src/main.rs
+++ b/infra/ngnet/src/main.rs
@@ -136,13 +136,19 @@ async fn main() -> anyhow::Result<()> {
.map(|reply, p: HashMap| match p.get("o") {
Some(obj) => {
let decoded = obj.trim();
- if BSP_DETAILS.get(decoded).is_none()
- && decoded != "http://localhost:14400"
- && decoded != "http://localhost:1421"
- // if decoded.eq("*")
- // || (!decoded.starts_with("http://") && !decoded.starts_with("https://"))
- // || decoded.len() < 11
+ let mut allowed = false;
+ #[cfg(debug_assertions)]
{
+ if decoded == "http://localhost:14401" {
+ allowed = true;
+ }
+ }
+ allowed = allowed
+ || BSP_DETAILS.get(decoded).is_some()
+ || decoded == "http://localhost:14400"
+ || decoded == "http://localhost:1421";
+
+ if !allowed {
warp::http::StatusCode::BAD_REQUEST.into_response()
} else {
let reply = warp::reply::with_header(
diff --git a/package.json b/package.json
index f8fcf8f..57cbcf0 100644
--- a/package.json
+++ b/package.json
@@ -2,7 +2,8 @@
"name": "ng-org",
"private": true,
"version": "0.1.2",
- "scripts": {
+ "scripts": {
+ "buildfrontdev3": "cargo run-script libwasmdev && pnpm -C ./sdk/js/web builddev3 && pnpm -C ./engine/broker/auth build",
"buildfront": "cargo run-script libwasm && pnpm -C ./app/nextgraph install && pnpm -C ./app/nextgraph webbuild && pnpm -C ./sdk/js/web build && pnpm -C ./engine/broker/auth install && pnpm -C ./engine/broker/auth build",
"buildfrontdev": "pnpm -C ./engine/broker/auth builddev && pnpm -C ./infra/ngnet/bootstrap builddev && pnpm -C ./infra/ngnet/auth builddev && pnpm -C ./infra/ngnet/redir builddev && pnpm -C ./sdk/js/web builddev"
},
diff --git a/sdk/js/lib-wasm/Cargo.toml b/sdk/js/lib-wasm/Cargo.toml
index a69ff7f..81a0491 100644
--- a/sdk/js/lib-wasm/Cargo.toml
+++ b/sdk/js/lib-wasm/Cargo.toml
@@ -17,7 +17,7 @@ rust-version.workspace = true
wasm-opt = false
[package.metadata.scripts]
-appdev = "rm -rf pkg/snippets && wasm-pack build --dev --target bundler && node prepare-web.js"
+appdev = "wasm-pack build --dev --target bundler && node prepare-web.js"
app = "rm -rf pkg/snippets && wasm-pack build --target bundler && node prepare-web.js"
nodedev = "rm -rf pkg-node/snippets && wasm-pack build --dev -t nodejs -d pkg-node && node prepare-node.js"
node = "rm -rf pkg-node/snippets && wasm-pack build -t nodejs -d pkg-node && node prepare-node.js"
diff --git a/sdk/js/lib-wasm/DEV.md b/sdk/js/lib-wasm/DEV.md
index 1220bea..07e3a00 100644
--- a/sdk/js/lib-wasm/DEV.md
+++ b/sdk/js/lib-wasm/DEV.md
@@ -42,6 +42,48 @@ Or automated testing with headless chrome:
wasm-pack test --chrome --headless
```
+## Developing against a third party webapp
+
+in a separate terminal, from the root of the mono-repo :
+
+```
+pnpm buildfrontdev3
+cd engine/broker/auth
+pnpm dev3
+```
+
+in a separate terminal, from the root of the mono-repo :
+
+```
+cd infra/ngnet
+cargo run-script buildfrontdev3
+cargo run
+```
+
+start your local ngd
+
+```
+export NG_DEV3=1; cargo run -r -p ngd -- -vv --save-key -l 14400
+// then log in to your account by opening
+http://localhost:14400
+```
+
+finally, start your local third party webapp you will use to test the WASM SDK
+
+```
+// this is up to you. by example :
+cd sdk/js/examples/multi-framework-signals
+pnpm dev
+// then open that app in your browser
+```
+
+every time you modify the SDK, re-run (at the root of momo-repo) :
+
+```
+cargo run-script libwasmdev
+// or in the sdk/js/lib-wasm folder run cargo run-script appdev
+```
+
## Production build
```
diff --git a/sdk/js/web/package.json b/sdk/js/web/package.json
index 2ad1dbb..294c50c 100644
--- a/sdk/js/web/package.json
+++ b/sdk/js/web/package.json
@@ -31,6 +31,7 @@
"build": "tsc && vite build",
"builddevlocal": "tsc && cross-env NG_DEV=1 vite build",
"builddev": "tsc && cross-env NG_DEV_LOCAL_BROKER=1 vite build",
+ "builddev3": "tsc && cross-env NG_DEV3=1 vite build",
"preview": "vite preview"
},
"dependencies": {
diff --git a/sdk/js/web/src/index.ts b/sdk/js/web/src/index.ts
index 5dae98b..d18aa35 100644
--- a/sdk/js/web/src/index.ts
+++ b/sdk/js/web/src/index.ts
@@ -12,11 +12,11 @@ import { createAsyncProxy } from "async-proxy";
let initialized = false;
const redirect_server = import.meta.env.NG_REDIR_SERVER || "nextgraph.net";
-const config = import.meta.env.NG_DEV ? {redirect:"http://localhost:14402/#/?o=", origin: "http://localhost:14404"} :
+const config =
+ import.meta.env.NG_DEV3 ? {redirect:"http://127.0.0.1:3033/redir/#/?o=", origin: "http://127.0.0.1:3033"} :
+ import.meta.env.NG_DEV ? {redirect:"http://localhost:14402/#/?o=", origin: "http://localhost:14404"} :
import.meta.env.NG_DEV_LOCAL_BROKER ? {redirect:"http://localhost:1421/redir.html#/?o=", origin: "http://localhost:1421"} :
{redirect:`https://${redirect_server}/redir/#/?o=`, origin: `https://${redirect_server}`} ;
-// to test ngnet
-//const config = {redirect:"http://127.0.0.1:3033/auth/#/?o=", origin: "http://127.0.0.1:3033"};
export const init = async function(callback:Function | null, singleton:boolean, access_requests:any) {
if (!window) throw new Error("init(callback,..) can only be called from a browser's window");