Compare commits
205 Commits
5c98e8f532
...
795b08a59b
Author | SHA1 | Date |
---|---|---|
|
795b08a59b | 7 days ago |
|
684b652d2e | 7 days ago |
|
86b21b2324 | 7 days ago |
|
3d9356e46c | 2 weeks ago |
|
5462171338 | 3 weeks ago |
|
9cb763479a | 3 weeks ago |
|
8d7f63849d | 4 weeks ago |
|
e83316f95b | 4 weeks ago |
|
3916dbbfd2 | 2 months ago |
|
fed970b55d | 2 months ago |
|
abbc63c7a0 | 2 months ago |
|
6aa87f1467 | 2 months ago |
|
7331289e0f | 2 months ago |
|
33e8942a0f | 2 months ago |
|
5bfe3750b6 | 2 months ago |
|
aff711f505 | 2 months ago |
|
da0f550a79 | 2 months ago |
|
24521c1009 | 2 months ago |
|
63786fa15b | 2 months ago |
|
0d038af076 | 2 months ago |
|
f3ffc5ce70 | 2 months ago |
|
e3e04ce1bd | 2 months ago |
|
cf30aee425 | 2 months ago |
|
4ed3670cb6 | 3 months ago |
|
b274ac7334 | 3 months ago |
|
f2e3257814 | 3 months ago |
|
e4b96ad37c | 3 months ago |
|
0b4cdefe00 | 3 months ago |
|
1cd249f356 | 4 months ago |
|
eb3765ea6e | 5 months ago |
|
d51020dcda | 5 months ago |
|
9f91fcd014 | 5 months ago |
|
c969e49633 | 5 months ago |
|
ecf9b766d8 | 7 months ago |
|
9b239229b5 | 7 months ago |
|
fcba2e867d | 8 months ago |
|
bb518792eb | 8 months ago |
|
254ad56e5b | 8 months ago |
|
711fa42621 | 8 months ago |
|
513d7742f1 | 8 months ago |
|
30f93e0797 | 8 months ago |
|
86a64d7ef5 | 8 months ago |
|
b4ea570146 | 8 months ago |
|
e4b96d96e5 | 8 months ago |
|
b7c5aa7cc4 | 8 months ago |
|
856d713a73 | 8 months ago |
|
48c63ead2f | 8 months ago |
|
17e1eb95e3 | 8 months ago |
|
495340dabe | 8 months ago |
|
4ef7e2730e | 8 months ago |
|
b16e649d53 | 8 months ago |
|
fa7cd603ee | 8 months ago |
|
f781f446fb | 8 months ago |
|
de6d053961 | 8 months ago |
|
2b9b9107a5 | 8 months ago |
|
dc4cf5ae13 | 9 months ago |
|
44fd445f4d | 9 months ago |
|
09a0e83a21 | 9 months ago |
|
465b43d88d | 9 months ago |
|
3295c685d6 | 9 months ago |
|
6110ebf733 | 9 months ago |
|
8f053793f0 | 9 months ago |
|
f2245c3b8c | 9 months ago |
|
b76dc2be9b | 9 months ago |
|
d819fd4618 | 9 months ago |
|
8b9c3ea409 | 9 months ago |
|
76ef3eee4d | 9 months ago |
|
81eeae8947 | 9 months ago |
|
e453c8998f | 9 months ago |
|
cc89bb1808 | 9 months ago |
|
077ba6265e | 9 months ago |
|
d03d15f9b7 | 9 months ago |
|
6852d56bbc | 9 months ago |
|
3926f1f2e4 | 9 months ago |
|
2f799ed937 | 9 months ago |
|
6f3e7b16eb | 9 months ago |
|
a127efffa6 | 9 months ago |
|
b8474bc2ce | 9 months ago |
|
248916c561 | 9 months ago |
|
a983205baa | 9 months ago |
|
5155dc208b | 9 months ago |
|
c38585f87d | 9 months ago |
|
8209fff45b | 9 months ago |
|
456ddf7e30 | 9 months ago |
|
ea38ac7d2a | 9 months ago |
|
a29c225216 | 9 months ago |
|
c1945d7349 | 9 months ago |
|
ded846f2fc | 9 months ago |
|
fa0102f1f4 | 9 months ago |
|
f289170e74 | 9 months ago |
|
0a5c03ebd1 | 9 months ago |
|
74137c4bdd | 9 months ago |
|
4ae372a860 | 9 months ago |
|
c7eda5198b | 9 months ago |
|
434201c657 | 9 months ago |
|
9e6c004fc4 | 9 months ago |
|
9f3efec14c | 9 months ago |
|
28bf09f24d | 9 months ago |
|
fdac0dfa68 | 9 months ago |
|
8396f30975 | 9 months ago |
![]() |
2cb65a4d16 | 9 months ago |
|
01816d000b | 9 months ago |
|
947afbdceb | 9 months ago |
|
68ad4ac632 | 9 months ago |
|
00e39f0cc4 | 9 months ago |
|
5e7ba770cd | 9 months ago |
|
148838aada | 9 months ago |
|
00398272bd | 9 months ago |
|
b6680d7cab | 9 months ago |
|
c956cfcb35 | 9 months ago |
|
f7ee5457ef | 9 months ago |
|
9659f1bbd2 | 9 months ago |
|
029276e205 | 9 months ago |
|
95ed77e414 | 9 months ago |
|
263df00e93 | 9 months ago |
|
b6db6b0d76 | 9 months ago |
|
9fbeccc3f5 | 9 months ago |
|
7c621509d2 | 9 months ago |
|
a8ec95a583 | 9 months ago |
|
ff379ccf65 | 9 months ago |
|
3f635248be | 9 months ago |
|
1bc2d46ba8 | 10 months ago |
|
b3a00f3963 | 10 months ago |
|
8c9147712d | 10 months ago |
|
707d105091 | 10 months ago |
|
5b7cb80142 | 10 months ago |
|
947e5f5de4 | 10 months ago |
|
c9630401f5 | 10 months ago |
|
81167ed5f3 | 10 months ago |
|
50153b2018 | 10 months ago |
|
b02375ff47 | 10 months ago |
|
abfe68b4ac | 10 months ago |
|
aa3b1321bd | 10 months ago |
|
700413d31a | 10 months ago |
|
a403ea31e7 | 10 months ago |
|
4860a943bb | 10 months ago |
|
dfa9c99615 | 10 months ago |
|
2dca4c0567 | 10 months ago |
![]() |
6362fb09f1 | 10 months ago |
![]() |
18101e4fae | 10 months ago |
|
bb6d118f34 | 10 months ago |
|
8b2558cd9c | 10 months ago |
![]() |
46c6228de2 | 10 months ago |
![]() |
a62c0cc342 | 10 months ago |
|
26e67a0bc4 | 10 months ago |
|
41cba12377 | 10 months ago |
|
ee385cbdfe | 10 months ago |
|
b06b31916e | 10 months ago |
|
fb0c161f7d | 10 months ago |
![]() |
e68bc0c4d6 | 10 months ago |
|
65b91ffc3f | 10 months ago |
![]() |
6f818448b3 | 10 months ago |
![]() |
4edb821e5e | 10 months ago |
![]() |
9882667604 | 10 months ago |
![]() |
a29db952e2 | 10 months ago |
|
f8a2f6ebb4 | 10 months ago |
|
104c796f68 | 10 months ago |
![]() |
1532213602 | 10 months ago |
|
e2c2596e1e | 10 months ago |
![]() |
3c0a1f8971 | 10 months ago |
|
ebd5b06a3c | 10 months ago |
|
98e70670af | 10 months ago |
|
f4675ac042 | 10 months ago |
![]() |
df5af0fe26 | 10 months ago |
![]() |
bf0efefd1f | 10 months ago |
![]() |
08168a0a33 | 10 months ago |
![]() |
3ad23d8a27 | 10 months ago |
|
760e63214a | 10 months ago |
![]() |
e68907869e | 10 months ago |
![]() |
b5542d5406 | 10 months ago |
|
ce2aeb326f | 10 months ago |
|
8975f26714 | 10 months ago |
|
3acb85b3ff | 10 months ago |
|
78a9b7f1af | 10 months ago |
|
2bf6e56d79 | 10 months ago |
|
ace0a30a91 | 10 months ago |
|
ccc23b8dda | 10 months ago |
|
71d1607693 | 10 months ago |
![]() |
16e0baa90a | 10 months ago |
![]() |
c17d9c538b | 10 months ago |
![]() |
ade307a61d | 10 months ago |
![]() |
c3ad6a60cc | 10 months ago |
![]() |
9a4d0d8c49 | 10 months ago |
![]() |
9a299d316b | 10 months ago |
![]() |
c3e2426ea8 | 10 months ago |
![]() |
ee58c8327e | 10 months ago |
![]() |
de8aa2129c | 10 months ago |
![]() |
2d0b8d5614 | 10 months ago |
![]() |
d79acc94d2 | 10 months ago |
![]() |
7547039998 | 10 months ago |
![]() |
d343837eb1 | 10 months ago |
![]() |
1d475fd9c2 | 10 months ago |
![]() |
7f24dfecd2 | 10 months ago |
![]() |
16466b720a | 10 months ago |
|
9227ae33a4 | 10 months ago |
![]() |
6ed4486fbc | 10 months ago |
![]() |
b39613117c | 10 months ago |
![]() |
230001274e | 10 months ago |
![]() |
3a2be2a217 | 10 months ago |
![]() |
89d3dbdd55 | 10 months ago |
![]() |
dfdce388a4 | 10 months ago |
![]() |
264f13f6b1 | 10 months ago |
![]() |
1be5c5be50 | 10 months ago |
![]() |
a4a1e63977 | 10 months ago |
![]() |
b6c2b40f14 | 10 months ago |
@ -1,3 +1,7 @@ |
||||
liberapay: nextgraph |
||||
ko_fi: nextgraph |
||||
custom: ["https://donate.stripe.com/8wMcOE3NI2B69NKeUU", "https://pay.vivawallet.com/par-le-peuple", "https://nextgraph.org/donate"] |
||||
custom: |
||||
[ |
||||
"https://donate.stripe.com/8wMcOE3NI2B69NKeUU", |
||||
"https://nextgraph.org/donate", |
||||
] |
||||
|
@ -0,0 +1,14 @@ |
||||
{ |
||||
"plugins": ["prettier-plugin-svelte"], |
||||
"overrides": [ |
||||
{ |
||||
"files": "*", |
||||
"excludeFiles": ["*.svelte", "*.html", "*.json"], |
||||
"options": { |
||||
"tabWidth": 4 |
||||
} |
||||
}, |
||||
{ "files": "*.svelte", "options": { "parser": "svelte" } } |
||||
], |
||||
"trailingComma": "es5" |
||||
} |
@ -0,0 +1,199 @@ |
||||
# Changelog |
||||
|
||||
Access the sub-sections directly : |
||||
|
||||
[App](#app) - [SDK](#sdk) - [Broker](#broker) - [CLI](#cli) |
||||
|
||||
## App |
||||
|
||||
### App [0.1.1-alpha] - 2024-09-02 |
||||
|
||||
#### Added |
||||
|
||||
- edit title and intro |
||||
|
||||
#### Fixed |
||||
|
||||
- bug doc not saved when back navigation |
||||
|
||||
### App [0.1.0-preview.8] - 2024-08-21 |
||||
|
||||
#### Added |
||||
|
||||
- signature tool: signs HEADS or a snapshot |
||||
|
||||
#### Fixed |
||||
|
||||
- bug in synchronization of stores content (container) on tauri native apps |
||||
- removed dark theme (that wasn't implemented properly) |
||||
- on web-app, detects jshelter and ask user to deactivate it |
||||
|
||||
### App [0.1.0-preview.7] - 2024-08-15 |
||||
|
||||
#### Added |
||||
|
||||
- Wallet Creation : Download Recovery PDF |
||||
- Wallet Creation : Download wallet file |
||||
- Wallet Login : with pazzle |
||||
- Wallet Login : correct errors while entering pazzle |
||||
- Wallet Login : with mnemonic |
||||
- Wallet Login : in-memory session (save nothing locally) |
||||
- Wallet Import : from file |
||||
- Wallet Import : from QR code |
||||
- Wallet Import : from TextCode |
||||
- User Panel : Online / Offline status |
||||
- User Panel : Toggle Personal Connection |
||||
- User Panel : Logout |
||||
- User Panel / Wallet : Export by scanning QRCode |
||||
- User Panel / Wallet : Export by generating QRCode |
||||
- User Panel / Wallet : Export by generating TextCode |
||||
- User Panel / Wallet : Download file |
||||
- User Panel / Accounts Info : basic info (not accurate) |
||||
- Document Menu : switch Viewer / Editor |
||||
- Document Menu : switch Graph / Document |
||||
- Document Menu : Live editing |
||||
- Document Menu : Upload binary file + Attachements and Files pane |
||||
- Document Menu : History pane |
||||
- Add Document : Save in current Store |
||||
- Document class: Source Code: Rust, JS, TS, Svelte, React |
||||
- Document class: Data : Graph, Container, JSON, Array, Object |
||||
- Document class: Post (rich text) |
||||
- Document class: Markdown (rich text) |
||||
- Document class: Plain Text |
||||
- A11Y : limited ARIA and tabulation navigation on all pages. not tested with screen-reader. |
||||
- I18N : english |
||||
- I18N : german (partial) |
||||
- Native app: macOS |
||||
- Native app: android |
||||
- Native app: linux and Ubuntu |
||||
- Native app: Windows |
||||
|
||||
## SDK |
||||
|
||||
### SDK [0.1.1-alpha.7] - 2025-04-03 |
||||
|
||||
#### Changed |
||||
|
||||
- js : doc_create : parameters are session_id, crdt, class_name, destination, store_repo (defaults to Private Store) |
||||
- nodejs & python : doc_create : parameters are session_id, crdt, class_name, destination, store_type (string), store_repo (string) if 2 last params omitted, defaults to Private Store. |
||||
- all : sparql_update : returns list of Nuri of new commits, in the form `did:ng:o:c` |
||||
|
||||
#### Added |
||||
|
||||
- python : wallet_open_with_mnemonic_words |
||||
- python : disconnect_and_close |
||||
- python : doc_create |
||||
- python : doc_sparql_update |
||||
- js & nodejs : fetch_header |
||||
- js & nodejs : update_header |
||||
- js & nodejs : signature_status |
||||
- js & nodejs : signed_snapshot_request |
||||
- js & nodejs : signature_request |
||||
- rust : app_request: Fetch : SignatureStatus , SignatureRequest SignedSnapshotRequest |
||||
|
||||
### SDK [0.1.0-preview.6] - 2024-08-15 |
||||
|
||||
#### Added |
||||
|
||||
- js : session_start |
||||
- js : session_start_remote |
||||
- js : session_stop |
||||
- js : user_connect |
||||
- js : user_disconnect |
||||
- js : discrete_update |
||||
- js : sparql_update |
||||
- js : sparql_query (returns SPARQL Query Results JSON Format, a list of turtle triples, or a boolean ) |
||||
- js : branch_history |
||||
- js : app_request_stream (fetch and subscribe) |
||||
- js : app_request |
||||
- js : doc_create |
||||
- js : file_get |
||||
- js : upload_start |
||||
- js : upload_done |
||||
- js : upload_chunk |
||||
- nodejs : init_headless |
||||
- nodejs : session_headless_start |
||||
- nodejs : session_headless_stop |
||||
- nodejs : sparql_query (returns SPARQL Query Results JSON Format, RDF-JS data model, or a boolean) |
||||
- nodejs : discrete_update |
||||
- nodejs : sparql_update |
||||
- nodejs : rdf_dump |
||||
- nodejs : admin_create_user |
||||
- nodejs : doc_create |
||||
- nodejs : file_get |
||||
- nodejs : file_put |
||||
- rust : session_start |
||||
- rust : session_stop |
||||
- rust : app_request_stream, gives access to: |
||||
- fetch and subscribe |
||||
- file_get |
||||
- rust : app_request, gives access to: |
||||
- create_doc |
||||
- sparql_query |
||||
- sparql_update |
||||
- discrete_update |
||||
- rdf_dump |
||||
- history |
||||
- file_put |
||||
|
||||
## Broker |
||||
|
||||
### Broker [0.1.1-alpha] - 2024-09-02 |
||||
|
||||
### Broker [0.1.0-preview.8] - 2024-08-21 |
||||
|
||||
#### Added |
||||
|
||||
- ExtProtocol : ObjectGet |
||||
|
||||
### Broker [0.1.0-preview.7] - 2024-08-15 |
||||
|
||||
#### Added |
||||
|
||||
- listen on localhost |
||||
- listen on domain |
||||
- listen on private LAN |
||||
- listen on public IP |
||||
- invite-admin |
||||
- broker service provider : add invitation for user |
||||
- serve web app |
||||
- ExtProtocol : WalletGetExport |
||||
- ClientProtocol : BlocksExist |
||||
- ClientProtocol : BlocksGet |
||||
- ClientProtocol : BlocksPut |
||||
- ClientProtocol : CommitGet |
||||
- ClientProtocol : Event |
||||
- ClientProtocol : PinRepo |
||||
- ClientProtocol : RepoPinStatus |
||||
- ClientProtocol : TopicSub |
||||
- ClientProtocol : TopicSyncReq |
||||
- ClientProtocol : WalletPutExport |
||||
- AppProtocol : AppRequest |
||||
- AppProtocol : AppSessionStart |
||||
- AppProtocol : AppSessionStop |
||||
- AdminProtocol : AddInvitation |
||||
- AdminProtocol : AddUser |
||||
- AdminProtocol : CreateUser |
||||
- AdminProtocol : DelUser |
||||
- AdminProtocol : ListInvitations |
||||
- AdminProtocol : ListUsers |
||||
|
||||
## CLI |
||||
|
||||
### CLI [0.1.1-alpha] - 2024-09-02 |
||||
|
||||
### CLI [0.1.0-preview.8] - 2024-08-21 |
||||
|
||||
#### Added |
||||
|
||||
- get : download binary files, snapshots, and head commits, and verify signature |
||||
|
||||
### CLI [0.1.0-preview.7] - 2024-08-15 |
||||
|
||||
#### Added |
||||
|
||||
- gen-key |
||||
- admin : add/remove admin user |
||||
- admin : add invitation |
||||
- admin : list users |
||||
- admin : list invitations |
@ -0,0 +1,242 @@ |
||||
# Contributors or compilation guide |
||||
|
||||
- [Install Rust](https://www.rust-lang.org/tools/install) minimum required MSRV 1.74.0 |
||||
- [Install Nodejs](https://nodejs.org/en/download/) |
||||
- [Install LLVM](https://rust-lang.github.io/rust-bindgen/requirements.html) |
||||
|
||||
On OpenBSD, for LLVM you need to choose llvm-17. |
||||
|
||||
Until this [PR](https://github.com/rustwasm/wasm-pack/pull/1271) is accepted, will have to install wasm-pack this way: |
||||
|
||||
``` |
||||
cargo install wasm-pack --git https://git.nextgraph.org/NextGraph/wasm-pack.git --branch master |
||||
``` |
||||
|
||||
On Debian distros |
||||
``` |
||||
sudo apt install pkg-config gcc build-essential libglib2.0-dev libgtk-3-dev libwebkit2gtk-4.1-dev |
||||
``` |
||||
|
||||
``` |
||||
cargo install cargo-watch |
||||
cargo install cargo-run-script |
||||
// optionally, if you want a Rust REPL: cargo install evcxr_repl |
||||
git clone git@git.nextgraph.org:NextGraph/nextgraph-rs.git |
||||
// or if you don't have a git account with us: git clone https://git.nextgraph.org/NextGraph/nextgraph-rs.git |
||||
cd nextgraph-rs |
||||
npm install -g pnpm |
||||
cd ng-sdk-js |
||||
cargo run-script app |
||||
cd .. |
||||
pnpm -C ./ng-app install |
||||
pnpm -C ./ng-app webfilebuild |
||||
pnpm -C ./helpers/app-auth run build |
||||
``` |
||||
|
||||
For building the native apps, see the [ng-app/README](ng-app/README.md) |
||||
|
||||
### First run |
||||
|
||||
The current directory will be used to save all the config, keys and storage data. |
||||
If you prefer to change the base directory, use the argument `--base [PATH]` when using `ngd` and/or `ngcli`. |
||||
|
||||
``` |
||||
// runs the daemon in one terminal |
||||
cargo run -p ngd -- -vv --save-key -l 14400 |
||||
``` |
||||
|
||||
If you are developing also the front-end, you should run it with this command in a separate terminal: |
||||
|
||||
``` |
||||
cd ng-app |
||||
pnpm -C ../helpers/net-auth run builddev |
||||
pnpm -C ../helpers/net-bootstrap run builddev |
||||
pnpm webdev |
||||
``` |
||||
|
||||
In the logs/output of ngd, you will see an invitation link that you should open in your web browser. If there are many links, choose the one that starts with `http://localhost:`, and if you run a local front-end, replace the prefix `http://localhost:14400/` with `http://localhost:1421/` before you open the link in your browser. |
||||
|
||||
The computer you use to open the link should have direct access to the ngd server on localhost. In most of the cases, it will work, as you are running ngd on localhost. If you are running ngd in a docker container, then you need to give access to the container to the local network of the host by using `docker run --network="host"`. see more here https://docs.docker.com/network/drivers/host/ |
||||
|
||||
Follow the steps on the screen to create your wallet :) |
||||
|
||||
Once your ngd server will run in your dev env, replace the string in `nextgraph/src/local_broker_dev_env.rs` with the actual PEER ID of your ngd server that is displayed when you first start `ngd`, with a line starting with `INFO ngd] PeerId of node:`. |
||||
|
||||
### Using ngcli with the account you just created |
||||
|
||||
The current directory will be used to save all the config, keys and storage data. |
||||
If you prefer to change the base directory, use the argument `--base [PATH]` when using `ngd` and/or `ngcli`. |
||||
|
||||
`PEER_ID_OF_SERVER` is displayed when you first start `ngd`, with a line starting with `INFO ngd] PeerId of node:`. |
||||
|
||||
`THE_PRIVATE_KEY_OF_THE_USER_YOU_JUST_CREATED` can be found in the app, after you opened your wallet, click on the logo of NextGraph, and you will see the User Panel. Click on `Accounts` and you will find the User Private Key. |
||||
|
||||
By example, to list all the admin users : |
||||
|
||||
``` |
||||
cargo run -p ngcli -- --save-key --save-config -s 127.0.0.1,14400,<PEER_ID_OF_SERVER> -u <THE_PRIVATE_KEY_OF_THE_USER_YOU_JUST_CREATED> admin list-users -a |
||||
``` |
||||
|
||||
### Adding more accounts and wallets |
||||
|
||||
In your dev env, if you want to create more wallets and accounts, you have 2 options: |
||||
|
||||
- creating an invitation link from the admin account |
||||
|
||||
``` |
||||
cargo run -p ngcli -- -s 127.0.0.1,14400,<PEER_ID_OF_SERVER> -u <THE_PRIVATE_KEY_OF_THE_USER_YOU_JUST_CREATED> admin add-invitation --notos |
||||
``` |
||||
|
||||
and then open the link after replacing the port number from `14400` to `1421` (if you are running the front-end in development mode). |
||||
|
||||
- run a local instance of `ngaccount`. this is useful if you want to test or develop the ngaccount part of the flow.. |
||||
|
||||
See the [README of ngaccount here](ngaccount/README.md). |
||||
|
||||
Then you need to stop your ngd and start it again with the additional option : |
||||
|
||||
``` |
||||
--registration-url="http://127.0.0.1:5173/#/create" |
||||
``` |
||||
|
||||
### Packages |
||||
|
||||
The crates are organized as follow : |
||||
|
||||
- [nextgraph](nextgraph/README.md) : Client library. Use this crate to embed NextGraph client in your Rust application |
||||
- [ngcli](ngcli/README.md) : CLI tool to manipulate the local documents and repos and administrate the server |
||||
- [ngd](ngd/README.md) : binary executable of the daemon (that can run a broker, verifier and/or Rust services) |
||||
- [ng-app](ng-app/README.md) : all the native apps, based on Tauri, and the official web app. |
||||
- [ng-sdk-js](ng-sdk-js/DEV.md) : contains the JS SDK, with example for: web app, react app, or node service. |
||||
- [ng-sdk-python](ng-sdk-python/README.md) : contains the Python SDK. |
||||
- ng-repo : Repositories common library |
||||
- ng-net : Network common library |
||||
- ng-oxigraph : Fork of OxiGraph. contains our CRDT of RDF |
||||
- ng-verifier : Verifier library, that exposes the document API to the app |
||||
- ng-wallet : keeps the secret keys of all identities of the user in a safe wallet |
||||
- ng-broker : Core and Server Broker library |
||||
- ng-client-ws : Websocket client library |
||||
- ng-storage-rocksdb : RocksDB backed stores. see also dependency [repo here](https://git.nextgraph.org/NextGraph/rust-rocksdb) |
||||
- helpers : all kind of servers and front end code needed for our infrastructure. |
||||
|
||||
### Test |
||||
|
||||
Please test by following this order (as we need to generate some files locally) |
||||
|
||||
``` |
||||
cargo test --package nextgraph -r --lib -- local_broker::test::gen_wallet_for_test --show-output --nocapture |
||||
cargo test -r |
||||
cargo test --package nextgraph -r --lib -- local_broker::test::import_session_for_test_to_disk --show-output --nocapture --ignored |
||||
``` |
||||
|
||||
Test a single crate: |
||||
|
||||
``` |
||||
cargo test --package ng-repo --lib -- --show-output --nocapture |
||||
cargo test --package ng-wallet --lib -- --show-output --nocapture |
||||
cargo test --package ng-verifier --lib -- --show-output --nocapture |
||||
cargo test --package ng-sdk-js --lib -- --show-output --nocapture |
||||
cargo test --package ng-broker --lib -- --show-output --nocapture |
||||
cargo test --package ng-client-ws --lib -- --show-output --nocapture |
||||
``` |
||||
|
||||
Test WASM websocket |
||||
|
||||
First you need to install the `chromedriver` that matches your version of Chrome |
||||
|
||||
https://googlechromelabs.github.io/chrome-for-testing/ |
||||
|
||||
then: |
||||
|
||||
``` |
||||
cd ng-sdk-js |
||||
wasm-pack test --chrome --headless |
||||
``` |
||||
|
||||
Test Rust websocket |
||||
|
||||
``` |
||||
cargo test --package ng-client-ws --lib -- remote_ws::test::test_ws --show-output --nocapture |
||||
``` |
||||
|
||||
### Build release binaries |
||||
|
||||
First you will need to have the production build of the frontend. |
||||
If you do not want to setup a whole development environment for the frontend, you can use the precompiled release of the frontend available in `dist-file.tar.gz` that you can download from the release page. |
||||
|
||||
``` |
||||
cd ng-app |
||||
tar -xzf dist-file.tar.gz |
||||
cd .. |
||||
``` |
||||
|
||||
Otherwise, build from source the single-file release of ng-app |
||||
|
||||
``` |
||||
cargo install cargo-run-script |
||||
npm install -g pnpm |
||||
cd ng-sdk-js |
||||
cargo run-script app |
||||
cd ../ng-app |
||||
pnpm install |
||||
pnpm webfilebuild |
||||
cd .. |
||||
``` |
||||
|
||||
then build the ngd daemon |
||||
|
||||
``` |
||||
cargo build -r -p ngd |
||||
``` |
||||
|
||||
you can then find the binary `ngd` in `target/release` |
||||
|
||||
The CLI tool can be obtained with : |
||||
|
||||
``` |
||||
cargo build -r -p ngcli |
||||
``` |
||||
|
||||
you can then use the binary `target/release/ngcli` |
||||
|
||||
For usage, see the documentation [here](ngd/README.md). |
||||
|
||||
For building the apps, see this [documentation](ng-app/README.md). |
||||
|
||||
#### OpenBSD |
||||
|
||||
On OpenBSD, a conflict between the installed LibreSSL library and the reqwest crate, needs a bit of attention. |
||||
Before compiling the daemon for OpenBSD, please comment out lines 41-42 of `ng-net/Cargo.toml`. This will be solved soon by using `resolver = "2"`. |
||||
|
||||
``` |
||||
#[target.'cfg(target_arch = "wasm32")'.dependencies] |
||||
#reqwest = { version = "0.11.18", features = ["json","native-tls-vendored"] } |
||||
``` |
||||
|
||||
to use the app on OpenBSD, you need to run the daemon locally. |
||||
|
||||
``` |
||||
ngd -l 14400 --save-key |
||||
``` |
||||
|
||||
then open chrome (previously installed with `doas pkg_add chrome`) |
||||
|
||||
``` |
||||
env ENABLE_WASM=1 chrome --enable-wasm --process-per-site --new-window --app=http://localhost:14400 |
||||
``` |
||||
|
||||
### Generate documentation |
||||
|
||||
Generate documentation for all packages without their dependencies: |
||||
|
||||
``` |
||||
cargo doc --no-deps |
||||
``` |
||||
|
||||
The generated documentation can be found in `target/doc/nextgraph`. |
||||
|
||||
### Contributions license |
||||
|
||||
Unless you explicitly state otherwise, any contribution intentionally submitted |
||||
for inclusion in the work by you shall be dual licensed as below, without any |
||||
additional terms or conditions. |
@ -0,0 +1,40 @@ |
||||
# Release 0.1.1-alpha |
||||
|
||||
_02 September 2024_ |
||||
|
||||
This release is not stable and should not be used for any productive work or to store personal documents. This release is meant as a **preview** of what NextGraph can do as of today and hints at its future potential. |
||||
|
||||
**Please note: The binary format of the Documents or Wallet might change, that might result in a complete loss of data. We will not provide migration scripts as the APIs and formats aren't stable yet.** |
||||
|
||||
If you previously installed any NextGraph app on your device, please uninstall it first, by following the normal uninstall procedure specific to your OS. If you have previously created a Wallet, it will not work with this new release. Please create a new one now. |
||||
|
||||
## App |
||||
|
||||
Please read the [Getting started](https://docs.nextgraph.org/en/getting-started) guide. |
||||
|
||||
[changelog](CHANGELOG.md#app-0-1-1-alpha-2024-09-02) |
||||
|
||||
## SDK |
||||
|
||||
The SDK for is not documented yet. |
||||
|
||||
[changelog](CHANGELOG.md#sdk-0-1-0-preview-6-2024-08-15) |
||||
|
||||
## Broker |
||||
|
||||
The `ngd` daemon is release with the basic features listed in `ngd --help`. More documentation will come soon |
||||
|
||||
[changelog](CHANGELOG.md#broker-0-1-1-alpha-2024-09-02) |
||||
|
||||
## CLI |
||||
|
||||
The `ngcli` daemon is release with the basic features listed in `ngcli --help`. More documentation will come soon. |
||||
|
||||
[changelog](CHANGELOG.md#cli-0-1-1-alpha-2024-09-02) |
||||
|
||||
## Limitations of this release |
||||
|
||||
- you cannot share documents with other users. Everything is ready for this internally, but there is still some wiring to do that will take some more time. |
||||
- the Rich text editors (both for normal Post/Article and in Markdown) do not let you insert images nor links to other documents. |
||||
- The webapp has some limitation for now when it is offline, because it doesn't have a UserStorage. it works differently than the native apps, as it has to replay all the commits at every load. This will stay like that for now, as the feature "Web UserStorage" based on IndexedDB will take some time to be coded. |
||||
- JSON-LD isn't ready yet as we need the "Context branch" feature in order to enter the list of ontologies each document is based on. |
@ -0,0 +1,28 @@ |
||||
# Logs |
||||
logs |
||||
*.log |
||||
npm-debug.log* |
||||
yarn-debug.log* |
||||
yarn-error.log* |
||||
pnpm-debug.log* |
||||
lerna-debug.log* |
||||
|
||||
index.html |
||||
|
||||
node_modules |
||||
dist |
||||
dist-web |
||||
dist-file |
||||
dist-ssr |
||||
*.local |
||||
|
||||
# Editor directories and files |
||||
.vscode/* |
||||
!.vscode/extensions.json |
||||
.idea |
||||
.DS_Store |
||||
*.suo |
||||
*.ntvs* |
||||
*.njsproj |
||||
*.sln |
||||
*.sw? |
@ -0,0 +1,6 @@ |
||||
{ |
||||
"recommendations": [ |
||||
"svelte.svelte-vscode", |
||||
"rust-lang.rust-analyzer" |
||||
] |
||||
} |
@ -0,0 +1,2 @@ |
||||
# NextGraph common Svelte components |
||||
|
@ -0,0 +1,68 @@ |
||||
{ |
||||
"name": "@nextgraph-monorepo/common", |
||||
"private": true, |
||||
"version": "0.1.1-alpha", |
||||
"type": "module", |
||||
"scripts": { |
||||
"dev": "vite", |
||||
"preview": "vite preview", |
||||
"check": "svelte-check --tsconfig ./tsconfig.json" |
||||
}, |
||||
"main": "src/main.ts", |
||||
"exports": { |
||||
".": "./src/main.ts", |
||||
"./store": "./src/store.ts", |
||||
"./api": "./src/api.ts", |
||||
"./routes": "./src/routes/index.ts", |
||||
"./lib": "./src/lib/index.ts", |
||||
"./lang": "./src/lang.ts", |
||||
"./components": "./src/lib/component.ts" |
||||
}, |
||||
"dependencies": { |
||||
"@sindresorhus/is": "4.6.0", |
||||
"@tailwindcss/typography": "^0.5.13", |
||||
"async-proxy": "^0.4.1", |
||||
"char-regex": "1.0.2", |
||||
"classnames": "^2.3.2", |
||||
"debug": "^4.3.6", |
||||
"emojilib": "2.4.0", |
||||
"extend": "3.0.2", |
||||
"flowbite": "^1.6.5", |
||||
"flowbite-svelte": "^0.43.3", |
||||
"html5-qrcode": "^2.3.8", |
||||
"immutable-json-patch": "^6.0.1", |
||||
"lodash.debounce": "4.0.8", |
||||
"skin-tone": "2.0.0", |
||||
"style-mod": "^4.1.2", |
||||
"svelte-i18n": "^4.0.0", |
||||
"svelte-inview": "^4.0.2", |
||||
"svelte-spa-router": "^3.3.0", |
||||
"vite-plugin-top-level-await": "1.3.1", |
||||
"xml-beautifier": "^0.5.0" |
||||
}, |
||||
"devDependencies": { |
||||
"@sveltejs/vite-plugin-svelte": "2.0.0", |
||||
"@swc/core": "~1.6.0", |
||||
"@tsconfig/svelte": "^3.0.0", |
||||
"@types/node": "^18.7.10", |
||||
"autoprefixer": "^10.4.14", |
||||
"dayjs": "^1.11.10", |
||||
"internal-ip": "^7.0.0", |
||||
"postcss": "^8.4.23", |
||||
"postcss-load-config": "^4.0.1", |
||||
"prettier": "^3.3.2", |
||||
"prettier-plugin-svelte": "^3.2.5", |
||||
"shx": "^0.3.4", |
||||
"svelte": "^3.54.0", |
||||
"svelte-check": "^3.0.0", |
||||
"svelte-heros-v2": "^0.10.12", |
||||
"svelte-preprocess": "^5.0.3", |
||||
"svelte-time": "^0.8.0", |
||||
"tailwindcss": "^3.3.1", |
||||
"tslib": "^2.4.1", |
||||
"typescript": "^4.9.5", |
||||
"vite": "4.2.1", |
||||
"vite-plugin-svelte-svg": "2.2.1", |
||||
"vite-plugin-wasm": "3.2.2" |
||||
} |
||||
} |
@ -0,0 +1,310 @@ |
||||
<!-- |
||||
// Copyright (c) 2022-2025 Niko Bonnieure, Par le Peuple, NextGraph.org developers |
||||
// All rights reserved. |
||||
// Licensed under the Apache License, Version 2.0 |
||||
// <LICENSE-APACHE2 or http://www.apache.org/licenses/LICENSE-2.0> |
||||
// or the MIT license <LICENSE-MIT or http://opensource.org/licenses/MIT>, |
||||
// at your option. All files in the project carrying such |
||||
// notice may not be copied, modified, or distributed except |
||||
// according to those terms. |
||||
--> |
||||
|
||||
<script lang="ts"> |
||||
import { push, default as Router } from "svelte-spa-router"; |
||||
import { isLoading } from "svelte-i18n"; |
||||
|
||||
import { onMount, tick, onDestroy } from "svelte"; |
||||
import { |
||||
wallets, |
||||
active_wallet, |
||||
opened_wallets, |
||||
close_active_session, |
||||
disconnections_subscribe, |
||||
} from "./store"; |
||||
|
||||
import { select_default_lang } from "./lang"; |
||||
|
||||
import Home from "./routes/Home.svelte"; |
||||
import Test from "./routes/Test.svelte"; |
||||
|
||||
import NURI from "./routes/NURI.svelte"; |
||||
import NotFound from "./routes/NotFound.svelte"; |
||||
import WalletCreate from "./routes/WalletCreate.svelte"; |
||||
import Invitation from "./routes/Invitation.svelte"; |
||||
import WalletLogin from "./routes/WalletLogin.svelte"; |
||||
import WalletInfo from "./routes/WalletInfo.svelte"; |
||||
import User from "./routes/User.svelte"; |
||||
import UserRegistered from "./routes/UserRegistered.svelte"; |
||||
import Install from "./routes/Install.svelte"; |
||||
import ScanQR from "./routes/ScanQR.svelte"; |
||||
import Shared from "./routes/Shared.svelte"; |
||||
import Site from "./routes/Site.svelte"; |
||||
|
||||
import ng from "./api"; |
||||
import AccountInfo from "./routes/AccountInfo.svelte"; |
||||
import WalletLoginUsername from "./routes/WalletLoginUsername.svelte"; |
||||
import WalletLoginQr from "./routes/WalletLoginQr.svelte"; |
||||
import WalletLoginTextCode from "./routes/WalletLoginTextCode.svelte"; |
||||
|
||||
const routes = new Map(); |
||||
routes.set("/", Home); |
||||
routes.set("/test", Test); |
||||
routes.set("/wallet/login", WalletLogin); |
||||
routes.set("/wallet/username", WalletLoginUsername); |
||||
routes.set("/wallet/login-qr", WalletLoginQr); |
||||
routes.set("/wallet/login-text-code", WalletLoginTextCode); |
||||
routes.set("/wallet/create", WalletCreate); |
||||
routes.set("/i/:invitation", Invitation); |
||||
routes.set("/user", User); |
||||
routes.set("/user/registered", UserRegistered); |
||||
routes.set("/wallet", WalletInfo); |
||||
routes.set("/user/accounts", AccountInfo); |
||||
routes.set("/wallet/scanqr", ScanQR); |
||||
routes.set("/install", Install); |
||||
routes.set("/shared", Shared); |
||||
routes.set("/site", Site); |
||||
routes.set(/^\/did:ng:(.*)/i, NURI); |
||||
routes.set("*", NotFound); |
||||
|
||||
let unsubscribe = () => {}; |
||||
|
||||
let wallet_channel; |
||||
let unsub_main_close; |
||||
|
||||
// window.refresh_wallets = async () => { |
||||
// let walls = await ng.get_wallets(); |
||||
// wallets.set(walls); |
||||
// }; |
||||
|
||||
onMount(async () => { |
||||
|
||||
//console.log("hide splash", window.supported); |
||||
if (window.supported) { |
||||
window.document.getElementById("splash").className="noshow"; |
||||
window.document.getElementById("app").className=""; |
||||
} |
||||
|
||||
//window.document.getElementById("splash").className="splash-loaded"; |
||||
try { |
||||
await disconnections_subscribe(); |
||||
await select_default_lang(); |
||||
} catch (e) { |
||||
console.warn(e); |
||||
//console.log("called disconnections_subscribe twice"); |
||||
} |
||||
let tauri_platform = import.meta.env.TAURI_PLATFORM; |
||||
//console.log(await ng.test()); |
||||
if (tauri_platform) { |
||||
let walls = await ng.get_wallets(); |
||||
wallets.set(walls); |
||||
|
||||
unsubscribe = active_wallet.subscribe(async (value) => { |
||||
if (value) { |
||||
if (value.wallet) { |
||||
opened_wallets.update((w) => { |
||||
w[value.id] = value.wallet; |
||||
return w; |
||||
}); |
||||
} else { |
||||
await ng.wallet_close(value.id); |
||||
active_wallet.set(undefined); |
||||
opened_wallets.update((w) => { |
||||
delete w[value.id]; |
||||
return w; |
||||
}); |
||||
push("#/wallet/login"); |
||||
} |
||||
} |
||||
}); |
||||
|
||||
let window_api = await import("@tauri-apps/plugin-window"); |
||||
let event_api = await import("@tauri-apps/api/event"); |
||||
let main = window_api.Window.getByLabel("main"); |
||||
unsub_main_close = await main.onCloseRequested(async (event) => { |
||||
//console.log("onCloseRequested main"); |
||||
await event_api.emit("close_all", {}); |
||||
let registration = window_api.Window.getByLabel("registration"); |
||||
if (registration) { |
||||
await registration.close(); |
||||
} |
||||
let viewer = window_api.Window.getByLabel("viewer"); |
||||
if (viewer) { |
||||
await viewer.close(); |
||||
} |
||||
}); |
||||
} else { |
||||
// ON WEB CLIENTS |
||||
window.addEventListener("storage", async (event) => { |
||||
//console.log("localStorage event", event); |
||||
if (event.storageArea != localStorage) return; |
||||
if (event.key === "ng_wallets") { |
||||
//console.log("localStorage", JSON.stringify($wallets)); |
||||
await ng.wallets_reload(); |
||||
wallets.set(await ng.get_wallets()); |
||||
//console.log("localStorage after", JSON.stringify($wallets)); |
||||
} |
||||
}); |
||||
wallets.set(await ng.get_wallets()); |
||||
// TODO: check the possibility of XS-Leaks. I don't see any, but it should be checked |
||||
// https://github.com/privacycg/storage-partitioning |
||||
// https://github.com/whatwg/html/issues/5803 |
||||
// https://w3cping.github.io/privacy-threat-model/ |
||||
// https://chromium.googlesource.com/chromium/src/+/fa17a6142f99d58de533d65cd8f3cd0e9a8ee58e |
||||
// https://bugs.webkit.org/show_bug.cgi?id=229814 |
||||
wallet_channel = new BroadcastChannel("ng_wallet"); |
||||
window.wallet_channel = wallet_channel; |
||||
wallet_channel.postMessage({ cmd: "startup" }, location.href); |
||||
wallet_channel.onmessage = async (event) => { |
||||
// console.log(event.data.cmd, event.data); |
||||
if (!location.href.startsWith(event.origin)) return; |
||||
switch (event.data.cmd) { |
||||
case "startup": |
||||
for (let saved_id of Object.keys($wallets)) { |
||||
if ($wallets[saved_id].in_memory) { |
||||
wallet_channel.postMessage( |
||||
{ |
||||
cmd: "new_in_mem", |
||||
name: saved_id, |
||||
lws: $wallets[saved_id], |
||||
}, |
||||
location.href |
||||
); |
||||
} |
||||
} |
||||
// if ($active_wallet && $active_wallet.wallet) { |
||||
// wallet_channel.postMessage( |
||||
// { cmd: "opened", wallet: $active_wallet }, |
||||
// location.href |
||||
// ); |
||||
// } |
||||
for (let opened of Object.keys($opened_wallets)) { |
||||
wallet_channel.postMessage( |
||||
{ |
||||
cmd: "opened", |
||||
wallet: { wallet: $opened_wallets[opened], id: opened }, |
||||
}, |
||||
location.href |
||||
); |
||||
} |
||||
|
||||
break; |
||||
case "opened": |
||||
if (!$opened_wallets[event.data.wallet.id]) { |
||||
//await tick(); |
||||
// console.log( |
||||
// "ADDING TO OPENED", |
||||
// event.data.wallet.id, |
||||
// JSON.stringify($opened_wallets), |
||||
// event.data.wallet.wallet |
||||
// ); |
||||
if (event.data.ng_wallets) { |
||||
localStorage.setItem("ng_wallets", event.data.ng_wallets); |
||||
await ng.wallets_reload(); |
||||
wallets.set(await ng.get_wallets()); |
||||
} |
||||
try { |
||||
await ng.wallet_was_opened(event.data.wallet.wallet); |
||||
} catch (e) { |
||||
console.error(e); |
||||
} |
||||
opened_wallets.update((w) => { |
||||
w[event.data.wallet.id] = event.data.wallet.wallet; |
||||
return w; |
||||
}); |
||||
} |
||||
break; |
||||
case "new_in_mem": |
||||
//console.log("GOT new_in_mem", event.data); |
||||
if (event.data.lws) { |
||||
if (!$wallets[event.data.name]) { |
||||
await ng.add_in_memory_wallet(event.data.lws); |
||||
wallets.update((w) => { |
||||
w[event.data.name] = event.data.lws; |
||||
return w; |
||||
}); |
||||
} |
||||
} |
||||
if (event.data.opened) { |
||||
if (!$opened_wallets[event.data.name]) { |
||||
await ng.wallet_was_opened(event.data.opened); |
||||
opened_wallets.update((w) => { |
||||
w[event.data.name] = event.data.opened; |
||||
return w; |
||||
}); |
||||
} |
||||
} |
||||
break; |
||||
case "closed": |
||||
opened_wallets.update((w) => { |
||||
delete w[event.data.walletid]; |
||||
return w; |
||||
}); |
||||
await ng.wallet_close(event.data.walletid); |
||||
if ($active_wallet && $active_wallet.id == event.data.walletid) { |
||||
await close_active_session(); |
||||
active_wallet.set(undefined); |
||||
push("#/wallet/login"); |
||||
} |
||||
break; |
||||
} |
||||
}; |
||||
unsubscribe = active_wallet.subscribe(async (value) => { |
||||
if (value) { |
||||
if (value.wallet) { |
||||
opened_wallets.update((w) => { |
||||
w[value.id] = value.wallet; |
||||
return w; |
||||
}); |
||||
//await tick(); |
||||
//console.log("posting opened"); |
||||
wallet_channel.postMessage( |
||||
{ |
||||
cmd: "opened", |
||||
wallet: value, |
||||
ng_wallets: localStorage.getItem("ng_wallets"), |
||||
}, |
||||
location.href |
||||
); |
||||
} else { |
||||
wallet_channel.postMessage( |
||||
{ cmd: "closed", walletid: value.id }, |
||||
location.href |
||||
); |
||||
active_wallet.set(undefined); |
||||
await ng.wallet_close(value.id); |
||||
//active_session.set(undefined); |
||||
opened_wallets.update((w) => { |
||||
delete w[value.id]; |
||||
return w; |
||||
}); |
||||
push("#/wallet/login"); |
||||
} |
||||
} else { |
||||
} |
||||
}); |
||||
} |
||||
|
||||
}); |
||||
|
||||
onDestroy(() => { |
||||
unsubscribe(); |
||||
if (unsub_main_close) unsub_main_close(); |
||||
}); |
||||
|
||||
// import { to_debug } from "./wallet_emojis"; |
||||
// to_debug(); |
||||
</script> |
||||
|
||||
<!-- <p> |
||||
{!$active_session} |
||||
{JSON.stringify(Object.keys($wallets))} |
||||
{JSON.stringify($active_wallet)} |
||||
{JSON.stringify(Object.keys($opened_wallets))} |
||||
{JSON.stringify($active_session)} |
||||
</p> --> |
||||
|
||||
{#if $isLoading} |
||||
<p class="text-center">Loading translations...</p> |
||||
{:else} |
||||
<Router {routes} /> |
||||
{/if} |
@ -0,0 +1,44 @@ |
||||
// Copyright (c) 2022-2025 Niko Bonnieure, Par le Peuple, NextGraph.org developers
|
||||
// All rights reserved.
|
||||
// Licensed under the Apache License, Version 2.0
|
||||
// <LICENSE-APACHE2 or http://www.apache.org/licenses/LICENSE-2.0>
|
||||
// or the MIT license <LICENSE-MIT or http://opensource.org/licenses/MIT>,
|
||||
// at your option. All files in the project carrying such
|
||||
// notice may not be copied, modified, or distributed except
|
||||
// according to those terms.
|
||||
import {createAsyncProxy} from "async-proxy"; |
||||
|
||||
let proxy = null; |
||||
|
||||
let api = createAsyncProxy({},{ |
||||
async apply(target, path, caller, args) { |
||||
if (proxy) { |
||||
//console.log("calling ",path, args);
|
||||
return Reflect.apply(proxy[path], caller, args) |
||||
} |
||||
else |
||||
throw new Error("You must call init_api() before using the API. load an API from @nextgraph-monorepo/app_api_tauri or @nextgraph-monorepo/app_api_web"); |
||||
} |
||||
}); |
||||
|
||||
export default api; |
||||
|
||||
export const NG_EU_BSP = "https://nextgraph.eu"; |
||||
export const NG_EU_BSP_REGISTER = import.meta.env.PROD |
||||
? "https://account.nextgraph.eu/#/create" |
||||
: "http://account-dev.nextgraph.eu:5173/#/create"; |
||||
|
||||
export const NG_NET_BSP = "https://nextgraph.net"; |
||||
export const NG_NET_BSP_REGISTER = import.meta.env.PROD |
||||
? "https://account.nextgraph.net/#/create" |
||||
: "http://account-dev.nextgraph.net:5173/#/create"; |
||||
|
||||
export const APP_ACCOUNT_REGISTERED_SUFFIX = "/#/user/registered"; |
||||
export const APP_WALLET_CREATE_SUFFIX = "/#/wallet/create"; |
||||
|
||||
export const LINK_NG_BOX = "https://nextgraph.org/ng-box/"; |
||||
export const LINK_SELF_HOST = "https://nextgraph.org/self-host/"; |
||||
|
||||
export const init_api = function (a) { |
||||
proxy = a; |
||||
} |
After Width: | Height: | Size: 1.1 KiB |
After Width: | Height: | Size: 2.8 KiB |
After Width: | Height: | Size: 2.9 KiB |
Before Width: | Height: | Size: 1.5 KiB After Width: | Height: | Size: 1.5 KiB |
Before Width: | Height: | Size: 16 KiB After Width: | Height: | Size: 16 KiB |
Before Width: | Height: | Size: 1.1 KiB After Width: | Height: | Size: 1.1 KiB |
Before Width: | Height: | Size: 2.1 KiB After Width: | Height: | Size: 2.1 KiB |
Before Width: | Height: | Size: 2.8 KiB After Width: | Height: | Size: 2.8 KiB |
Before Width: | Height: | Size: 6.5 KiB After Width: | Height: | Size: 6.5 KiB |
Before Width: | Height: | Size: 4.8 KiB After Width: | Height: | Size: 4.8 KiB |
Before Width: | Height: | Size: 7.2 KiB After Width: | Height: | Size: 7.2 KiB |
Before Width: | Height: | Size: 1.7 KiB After Width: | Height: | Size: 1.7 KiB |
Before Width: | Height: | Size: 3.5 KiB After Width: | Height: | Size: 3.5 KiB |
Before Width: | Height: | Size: 3.0 KiB After Width: | Height: | Size: 3.0 KiB |
Before Width: | Height: | Size: 7.4 KiB After Width: | Height: | Size: 7.4 KiB |
Before Width: | Height: | Size: 4.4 KiB After Width: | Height: | Size: 4.4 KiB |
Before Width: | Height: | Size: 4.1 KiB After Width: | Height: | Size: 4.1 KiB |
Before Width: | Height: | Size: 2.1 KiB After Width: | Height: | Size: 2.1 KiB |
Before Width: | Height: | Size: 1.9 KiB After Width: | Height: | Size: 1.9 KiB |
Before Width: | Height: | Size: 5.2 KiB After Width: | Height: | Size: 5.2 KiB |
Before Width: | Height: | Size: 3.0 KiB After Width: | Height: | Size: 3.0 KiB |
Before Width: | Height: | Size: 2.1 KiB After Width: | Height: | Size: 2.1 KiB |
Before Width: | Height: | Size: 3.1 KiB After Width: | Height: | Size: 3.1 KiB |
Before Width: | Height: | Size: 4.2 KiB After Width: | Height: | Size: 4.2 KiB |
Before Width: | Height: | Size: 2.1 KiB After Width: | Height: | Size: 2.1 KiB |
Before Width: | Height: | Size: 2.7 KiB After Width: | Height: | Size: 2.7 KiB |
Before Width: | Height: | Size: 5.0 KiB After Width: | Height: | Size: 5.0 KiB |
Before Width: | Height: | Size: 5.3 KiB After Width: | Height: | Size: 5.3 KiB |
Before Width: | Height: | Size: 3.6 KiB After Width: | Height: | Size: 3.6 KiB |
Before Width: | Height: | Size: 7.5 KiB After Width: | Height: | Size: 7.5 KiB |
Before Width: | Height: | Size: 3.5 KiB After Width: | Height: | Size: 3.5 KiB |
Before Width: | Height: | Size: 4.5 KiB After Width: | Height: | Size: 4.5 KiB |
Before Width: | Height: | Size: 3.6 KiB After Width: | Height: | Size: 3.6 KiB |
Before Width: | Height: | Size: 3.1 KiB After Width: | Height: | Size: 3.1 KiB |
Before Width: | Height: | Size: 5.5 KiB After Width: | Height: | Size: 5.5 KiB |
Before Width: | Height: | Size: 4.0 KiB After Width: | Height: | Size: 4.0 KiB |
Before Width: | Height: | Size: 3.9 KiB After Width: | Height: | Size: 3.9 KiB |
Before Width: | Height: | Size: 1.3 KiB After Width: | Height: | Size: 1.3 KiB |
Before Width: | Height: | Size: 4.7 KiB After Width: | Height: | Size: 4.7 KiB |
Before Width: | Height: | Size: 6.1 KiB After Width: | Height: | Size: 6.1 KiB |
Before Width: | Height: | Size: 3.3 KiB After Width: | Height: | Size: 3.3 KiB |
Before Width: | Height: | Size: 3.1 KiB After Width: | Height: | Size: 3.1 KiB |
Before Width: | Height: | Size: 786 B After Width: | Height: | Size: 786 B |
Before Width: | Height: | Size: 2.1 KiB After Width: | Height: | Size: 2.1 KiB |
Before Width: | Height: | Size: 7.5 KiB After Width: | Height: | Size: 7.5 KiB |
Before Width: | Height: | Size: 6.6 KiB After Width: | Height: | Size: 6.6 KiB |
Before Width: | Height: | Size: 2.3 KiB After Width: | Height: | Size: 2.3 KiB |
Before Width: | Height: | Size: 17 KiB After Width: | Height: | Size: 17 KiB |
Before Width: | Height: | Size: 12 KiB After Width: | Height: | Size: 12 KiB |
Before Width: | Height: | Size: 8.3 KiB After Width: | Height: | Size: 8.3 KiB |
Before Width: | Height: | Size: 24 KiB After Width: | Height: | Size: 24 KiB |
Before Width: | Height: | Size: 6.3 KiB After Width: | Height: | Size: 6.3 KiB |
Before Width: | Height: | Size: 2.2 KiB After Width: | Height: | Size: 2.2 KiB |
Before Width: | Height: | Size: 9.6 KiB After Width: | Height: | Size: 9.6 KiB |
Before Width: | Height: | Size: 7.6 KiB After Width: | Height: | Size: 7.6 KiB |
Before Width: | Height: | Size: 3.2 KiB After Width: | Height: | Size: 3.2 KiB |
Before Width: | Height: | Size: 4.1 KiB After Width: | Height: | Size: 4.1 KiB |
Before Width: | Height: | Size: 5.9 KiB After Width: | Height: | Size: 5.9 KiB |
Before Width: | Height: | Size: 13 KiB After Width: | Height: | Size: 13 KiB |
Before Width: | Height: | Size: 4.5 KiB After Width: | Height: | Size: 4.5 KiB |
Before Width: | Height: | Size: 3.6 KiB After Width: | Height: | Size: 3.6 KiB |
Before Width: | Height: | Size: 4.0 KiB After Width: | Height: | Size: 4.0 KiB |
Before Width: | Height: | Size: 5.4 KiB After Width: | Height: | Size: 5.4 KiB |
Before Width: | Height: | Size: 3.7 KiB After Width: | Height: | Size: 3.7 KiB |
Before Width: | Height: | Size: 3.3 KiB After Width: | Height: | Size: 3.3 KiB |
Before Width: | Height: | Size: 3.3 KiB After Width: | Height: | Size: 3.3 KiB |
Before Width: | Height: | Size: 3.8 KiB After Width: | Height: | Size: 3.8 KiB |
Before Width: | Height: | Size: 6.4 KiB After Width: | Height: | Size: 6.4 KiB |
Before Width: | Height: | Size: 2.9 KiB After Width: | Height: | Size: 2.9 KiB |
Before Width: | Height: | Size: 5.0 KiB After Width: | Height: | Size: 5.0 KiB |
Before Width: | Height: | Size: 4.4 KiB After Width: | Height: | Size: 4.4 KiB |
Before Width: | Height: | Size: 4.3 KiB After Width: | Height: | Size: 4.3 KiB |
Before Width: | Height: | Size: 3.4 KiB After Width: | Height: | Size: 3.4 KiB |
Before Width: | Height: | Size: 3.3 KiB After Width: | Height: | Size: 3.3 KiB |
Before Width: | Height: | Size: 3.0 KiB After Width: | Height: | Size: 3.0 KiB |
Before Width: | Height: | Size: 3.0 KiB After Width: | Height: | Size: 3.0 KiB |
Before Width: | Height: | Size: 4.1 KiB After Width: | Height: | Size: 4.1 KiB |
Before Width: | Height: | Size: 2.4 KiB After Width: | Height: | Size: 2.4 KiB |
Before Width: | Height: | Size: 4.1 KiB After Width: | Height: | Size: 4.1 KiB |
Before Width: | Height: | Size: 3.2 KiB After Width: | Height: | Size: 3.2 KiB |
Before Width: | Height: | Size: 3.0 KiB After Width: | Height: | Size: 3.0 KiB |
Before Width: | Height: | Size: 2.7 KiB After Width: | Height: | Size: 2.7 KiB |