Compare commits

...

26 Commits

Author SHA1 Message Date
Niko PLP 0b4cdefe00 update funding attribution 3 weeks ago
Niko PLP 1cd249f356 2025 2 months ago
Niko PLP eb3765ea6e fix rocksdb plugin on macos 3 months ago
Niko PLP d51020dcda fix rocksdb plugin on macos 3 months ago
Niko PLP 9f91fcd014 fix build and doc 3 months ago
Niko PLP c969e49633 fix apple silicon build of rocksdb 3 months ago
Niko PLP ecf9b766d8 fix error message for security img too short 5 months ago
Niko PLP 9b239229b5 remove viva sponsorship 5 months ago
Niko PLP fcba2e867d remove log 5 months ago
Niko PLP bb518792eb alpha 0.1.1 5 months ago
Niko PLP 254ad56e5b edit title and intro 5 months ago
Niko PLP 711fa42621 small fix and doc changes 5 months ago
Niko PLP 513d7742f1 server locaction 6 months ago
Niko PLP 30f93e0797 fix bug save when nagivating away 6 months ago
Niko PLP 86a64d7ef5 new peer id for nextgraph.eu 6 months ago
Niko PLP b4ea570146 fix redirect_after_login 6 months ago
Niko PLP e4b96d96e5 enable TLS support in CLI 6 months ago
Niko PLP b7c5aa7cc4 v0.1.0-preview.8 6 months ago
Niko PLP 856d713a73 add ngcli get :j:k and fix bug in stores in tauri 6 months ago
Niko PLP 48c63ead2f signature verification in CLI with ExtRequest. Display snapshot 6 months ago
Niko PLP 17e1eb95e3 snapshot and async signature 6 months ago
Niko PLP 495340dabe updated error message in case of jshelter use 6 months ago
Niko PLP 4ef7e2730e force bright mode 6 months ago
Niko PLP b16e649d53 added error message in case web worker cannot be started on web-app 6 months ago
Niko PLP fa7cd603ee fix typo 6 months ago
Niko PLP f781f446fb adding native apps to changelog 6 months ago
  1. 6
      .github/FUNDING.yml
  2. 75
      CHANGELOG.md
  3. 126
      Cargo.lock
  4. 2
      Cargo.toml
  5. 2
      LICENSE-MIT
  6. 3
      README.md
  7. 19
      RELEASE-NOTE.md
  8. 14
      nextgraph/Cargo.toml
  9. 5
      nextgraph/README.md
  10. 2
      nextgraph/examples/in_memory.rs
  11. 2
      nextgraph/examples/open.rs
  12. 2
      nextgraph/examples/persistent.rs
  13. 14
      nextgraph/src/local_broker.rs
  14. 2
      ng-app/index-native.html
  15. 14
      ng-app/index-web.html
  16. 10
      ng-app/package.json
  17. 142
      ng-app/src-tauri/src/lib.rs
  18. 2
      ng-app/src-tauri/src/main.rs
  19. 2
      ng-app/src-tauri/src/mobile.rs
  20. 2
      ng-app/src-tauri/tauri.conf.json
  21. 2
      ng-app/src/App.svelte
  22. 7
      ng-app/src/api.ts
  23. 2
      ng-app/src/apps/AutomergeEditor.svelte
  24. 2
      ng-app/src/apps/AutomergeJsonSource.svelte
  25. 2
      ng-app/src/apps/AutomergeViewer.svelte
  26. 2
      ng-app/src/apps/CodeMirrorEditor.svelte
  27. 40
      ng-app/src/apps/ContainerView.svelte
  28. 4
      ng-app/src/apps/MdSource.svelte
  29. 5
      ng-app/src/apps/MilkDownEditor.svelte
  30. 4
      ng-app/src/apps/PostMdViewer.svelte
  31. 2
      ng-app/src/apps/ProseMirrorEditor.svelte
  32. 2
      ng-app/src/apps/ProseMirrorViewer.svelte
  33. 6
      ng-app/src/apps/SparqlQueryEditor.svelte
  34. 2
      ng-app/src/apps/SparqlUpdateEditor.svelte
  35. 2
      ng-app/src/apps/TextViewer.svelte
  36. 2
      ng-app/src/apps/TurtleViewer.svelte
  37. 2
      ng-app/src/apps/XmlSource.svelte
  38. 2
      ng-app/src/apps/YArrayEditor.svelte
  39. 2
      ng-app/src/apps/YArraySource.svelte
  40. 2
      ng-app/src/apps/YArrayViewer.svelte
  41. 3
      ng-app/src/apps/YMapEditor.svelte
  42. 2
      ng-app/src/apps/YMapSource.svelte
  43. 3
      ng-app/src/apps/YMapViewer.svelte
  44. 2
      ng-app/src/apps/automerge/ABoolean.svelte
  45. 2
      ng-app/src/apps/automerge/ACounter.svelte
  46. 2
      ng-app/src/apps/automerge/ADate.svelte
  47. 2
      ng-app/src/apps/automerge/AList.svelte
  48. 2
      ng-app/src/apps/automerge/AMap.svelte
  49. 2
      ng-app/src/apps/automerge/ANumber.svelte
  50. 2
      ng-app/src/apps/automerge/AString.svelte
  51. 2
      ng-app/src/apps/automerge/AValue.svelte
  52. 2
      ng-app/src/apps/automerge/utils.ts
  53. 81
      ng-app/src/classes.ts
  54. 2
      ng-app/src/lib/CenteredLayout.svelte
  55. 8
      ng-app/src/lib/Document.svelte
  56. 197
      ng-app/src/lib/FullLayout.svelte
  57. 2
      ng-app/src/lib/Home.svelte
  58. 2
      ng-app/src/lib/Install.svelte
  59. 3
      ng-app/src/lib/Login.svelte
  60. 2
      ng-app/src/lib/MobileBottomBar.svelte
  61. 13
      ng-app/src/lib/MobileBottomBarItem.svelte
  62. 2
      ng-app/src/lib/NoWallet.svelte
  63. 2
      ng-app/src/lib/Pane.svelte
  64. 2
      ng-app/src/lib/Test.svelte
  65. 2
      ng-app/src/lib/components/CopyToClipboard.svelte
  66. 2
      ng-app/src/lib/components/Logo.svelte
  67. 2
      ng-app/src/lib/components/MenuItem.svelte
  68. 2
      ng-app/src/lib/components/Message.svelte
  69. 2
      ng-app/src/lib/components/NavBar.svelte
  70. 2
      ng-app/src/lib/components/PaneHeader.svelte
  71. 2
      ng-app/src/lib/components/PasswordInput.svelte
  72. 2
      ng-app/src/lib/components/Spinner.svelte
  73. 12
      ng-app/src/lib/icons/DataClassIcon.svelte
  74. 2
      ng-app/src/lib/icons/DeviceIcon.svelte
  75. 2
      ng-app/src/lib/icons/NavIcon.svelte
  76. 2
      ng-app/src/lib/icons/ZeraIcon.svelte
  77. 2
      ng-app/src/lib/panes/Files.svelte
  78. 21
      ng-app/src/lib/panes/History.svelte
  79. 2
      ng-app/src/lib/panes/history/LICENSE.md
  80. 70
      ng-app/src/lib/popups/Header.svelte
  81. 151
      ng-app/src/lib/popups/Signature.svelte
  82. 36
      ng-app/src/locales/en.json
  83. 2
      ng-app/src/main-web.ts
  84. 2
      ng-app/src/main.ts
  85. 2
      ng-app/src/routes/AccountInfo.svelte
  86. 2
      ng-app/src/routes/Home.svelte
  87. 2
      ng-app/src/routes/Install.svelte
  88. 2
      ng-app/src/routes/Invitation.svelte
  89. 2
      ng-app/src/routes/NURI.svelte
  90. 2
      ng-app/src/routes/NotFound.svelte
  91. 2
      ng-app/src/routes/ScanQR.svelte
  92. 2
      ng-app/src/routes/Shared.svelte
  93. 2
      ng-app/src/routes/Site.svelte
  94. 2
      ng-app/src/routes/Test.svelte
  95. 5
      ng-app/src/routes/User.svelte
  96. 2
      ng-app/src/routes/UserRegistered.svelte
  97. 13
      ng-app/src/routes/WalletCreate.svelte
  98. 6
      ng-app/src/routes/WalletInfo.svelte
  99. 66
      ng-app/src/routes/WalletLogin.svelte
  100. 2
      ng-app/src/routes/WalletLoginQr.svelte
  101. Some files were not shown because too many files have changed in this diff Show More

@ -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",
]

@ -6,11 +6,33 @@ Access the sub-sections directly :
## 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 : Downlaod Recovery PDF
- Wallet Creation : Download Recovery PDF
- Wallet Creation : Download wallet file
- Wallet Login : with pazzle
- Wallet Login : correct errors while entering pazzle
@ -41,9 +63,24 @@ Access the sub-sections directly :
- 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 [unreleased]
#### Added
- 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
@ -91,6 +128,14 @@ Access the sub-sections directly :
## 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
@ -102,9 +147,37 @@ Access the sub-sections directly :
- 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

126
Cargo.lock generated

@ -12,15 +12,6 @@ dependencies = [
"psl-types",
]
[[package]]
name = "addr2line"
version = "0.21.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "8a30b2e23b9e17a9f90641c7ab1549cd9b44f296d3ccbf309d2863cfe398a0cb"
dependencies = [
"gimli",
]
[[package]]
name = "adler"
version = "1.0.2"
@ -493,21 +484,6 @@ dependencies = [
"uuid",
]
[[package]]
name = "backtrace"
version = "0.3.69"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "2089b7e3f35b9dd2d0ed921ead4f6d318c27680d4a5bd167b3ee120edb105837"
dependencies = [
"addr2line",
"cc",
"cfg-if",
"libc",
"miniz_oxide",
"object",
"rustc-demangle",
]
[[package]]
name = "base64"
version = "0.13.1"
@ -1683,28 +1659,6 @@ dependencies = [
"zune-inflate",
]
[[package]]
name = "failure"
version = "0.1.8"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "d32e9bd16cc02eae7db7ef620b392808b89f6a5e16bb3497d159c6b92a0f4f86"
dependencies = [
"backtrace",
"failure_derive",
]
[[package]]
name = "failure_derive"
version = "0.1.8"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "aa4da3c766cd7a0db8242e326e9e4e081edd567072893ed320008189715366a4"
dependencies = [
"proc-macro2",
"quote",
"syn 1.0.109",
"synstructure",
]
[[package]]
name = "fastrand"
version = "1.9.0"
@ -2143,12 +2097,6 @@ dependencies = [
"weezl",
]
[[package]]
name = "gimli"
version = "0.28.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "4271d37baee1b8c7e4b708028c57d816cf9d2434acb33a549475f78c181f6253"
[[package]]
name = "gio"
version = "0.16.7"
@ -3276,7 +3224,7 @@ checksum = "e4a24736216ec316047a1fc4252e27dabb04218aa4a3f37c6e7ddbf1f9782b54"
[[package]]
name = "nextgraph"
version = "0.1.0-preview.7"
version = "0.1.1-alpha"
dependencies = [
"async-once-cell",
"async-std",
@ -3304,7 +3252,7 @@ dependencies = [
[[package]]
name = "ng-app"
version = "0.1.0-preview.7"
version = "0.1.1-alpha"
dependencies = [
"async-std",
"nextgraph",
@ -3342,7 +3290,7 @@ dependencies = [
[[package]]
name = "ng-broker"
version = "0.1.0-preview.7"
version = "0.1.1-alpha"
dependencies = [
"async-std",
"async-trait",
@ -3367,7 +3315,7 @@ dependencies = [
[[package]]
name = "ng-client-ws"
version = "0.1.0-preview.7"
version = "0.1.1-alpha"
dependencies = [
"async-std",
"async-trait",
@ -3386,7 +3334,7 @@ dependencies = [
[[package]]
name = "ng-net"
version = "0.1.0-preview.7"
version = "0.1.1-alpha"
dependencies = [
"async-recursion",
"async-std",
@ -3416,7 +3364,7 @@ dependencies = [
[[package]]
name = "ng-oxigraph"
version = "0.4.0-alpha.7-ngpreview7"
version = "0.4.0-alpha.7-ngalpha"
dependencies = [
"base64-url",
"codspeed-criterion-compat",
@ -3447,7 +3395,7 @@ dependencies = [
[[package]]
name = "ng-repo"
version = "0.1.0-preview.7"
version = "0.1.1-alpha"
dependencies = [
"base64-url",
"blake3",
@ -3481,8 +3429,8 @@ dependencies = [
[[package]]
name = "ng-rocksdb"
version = "0.21.0-ngpreview.4"
source = "git+https://git.nextgraph.org/NextGraph/rust-rocksdb.git?branch=master#f1ce2e345f3d729350a02bcffb47c526674edd85"
version = "0.21.0-ngpreview.6"
source = "git+https://git.nextgraph.org/NextGraph/rust-rocksdb.git?branch=master#75ee95166954e6ec67a229d5697b2319dd02efc6"
dependencies = [
"bindgen",
"bzip2-sys",
@ -3496,7 +3444,7 @@ dependencies = [
[[package]]
name = "ng-sdk-js"
version = "0.1.0-preview.7"
version = "0.1.1-alpha"
dependencies = [
"async-std",
"futures",
@ -3523,7 +3471,7 @@ dependencies = [
[[package]]
name = "ng-storage-rocksdb"
version = "0.1.0-preview.7"
version = "0.1.1-alpha"
dependencies = [
"ng-repo",
"ng-rocksdb",
@ -3551,7 +3499,7 @@ dependencies = [
[[package]]
name = "ng-verifier"
version = "0.1.0-preview.7"
version = "0.1.1-alpha"
dependencies = [
"async-std",
"async-trait",
@ -3559,6 +3507,7 @@ dependencies = [
"either",
"futures",
"getrandom 0.2.10",
"lazy_static",
"ng-net",
"ng-oxigraph",
"ng-repo",
@ -3575,7 +3524,7 @@ dependencies = [
[[package]]
name = "ng-wallet"
version = "0.1.0-preview.7"
version = "0.1.1-alpha"
dependencies = [
"aes-gcm-siv",
"argon2",
@ -3602,7 +3551,7 @@ dependencies = [
[[package]]
name = "ngaccount"
version = "0.1.0-preview.7"
version = "0.1.1-alpha"
dependencies = [
"anyhow",
"duration-str",
@ -3620,7 +3569,7 @@ dependencies = [
[[package]]
name = "ngcli"
version = "0.1.0-preview.7"
version = "0.1.1-alpha"
dependencies = [
"async-std",
"blake3",
@ -3629,6 +3578,7 @@ dependencies = [
"env_logger",
"getrandom 0.2.10",
"log",
"ng-async-tungstenite",
"ng-client-ws",
"ng-net",
"ng-repo",
@ -3639,7 +3589,7 @@ dependencies = [
[[package]]
name = "ngd"
version = "0.1.0-preview.7"
version = "0.1.1-alpha"
dependencies = [
"addr",
"async-std",
@ -3658,7 +3608,7 @@ dependencies = [
[[package]]
name = "ngone"
version = "0.1.0-preview.7"
version = "0.1.1-alpha"
dependencies = [
"base64-url",
"bytes",
@ -3854,15 +3804,6 @@ dependencies = [
"objc",
]
[[package]]
name = "object"
version = "0.32.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "a6a622008b6e321afc04970976f62ee297fdbaa6f95318ca343e3eebb9648441"
dependencies = [
"memchr",
]
[[package]]
name = "once_cell"
version = "1.18.0"
@ -4817,12 +4758,6 @@ dependencies = [
"num-traits",
]
[[package]]
name = "rustc-demangle"
version = "0.1.23"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "d626bb9dae77e28219937af045c257c28bfd3f69333c512553507f5f9798cb76"
[[package]]
name = "rustc-hash"
version = "1.1.0"
@ -5481,18 +5416,6 @@ dependencies = [
"unicode-ident",
]
[[package]]
name = "synstructure"
version = "0.12.6"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "f36bdaa60a83aca3921b5259d5400cbf5e90fc51931376a9bd4a0eb79aa7210f"
dependencies = [
"proc-macro2",
"quote",
"syn 1.0.109",
"unicode-xid",
]
[[package]]
name = "sys-locale"
version = "0.3.1"
@ -5893,11 +5816,9 @@ dependencies = [
[[package]]
name = "threshold_crypto"
version = "0.4.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "7f708705bce37e765c37a95a8e0221a327c880d5a5a148d522552e8daa85787a"
source = "git+https://github.com/nextgraph-org/threshold_crypto.git?branch=master#b60552e4d42f67058455779eed476a76986b5478"
dependencies = [
"byteorder",
"failure",
"ff",
"group",
"hex_fmt",
@ -5906,6 +5827,7 @@ dependencies = [
"rand 0.7.3",
"rand_chacha 0.2.2",
"serde",
"thiserror",
"tiny-keccak",
"zeroize",
]
@ -6287,12 +6209,6 @@ version = "1.10.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "1dd624098567895118886609431a7c3b8f516e41d30e0643f03d94592a147e36"
[[package]]
name = "unicode-xid"
version = "0.2.4"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "f962df74c8c05a667b5ee8bcf162993134c104e96440b663c8daa176dc772d8c"
[[package]]
name = "unique_id"
version = "0.1.5"

@ -19,7 +19,7 @@ members = [
default-members = [ "nextgraph", "ngcli", "ngd" ]
[workspace.package]
version = "0.1.0-preview.7"
version = "0.1.1-alpha"
edition = "2021"
rust-version = "1.74.0"
license = "MIT/Apache-2.0"

@ -1,6 +1,6 @@
MIT License
Copyright (c) 2022-2024 Niko Bonnieure, Par le Peuple, NextGraph.org developers
Copyright (c) 2022-2025 Niko Bonnieure, Par le Peuple, NextGraph.org developers
All rights reserved.
Permission is hereby granted, free of charge, to any person obtaining a copy

@ -60,7 +60,8 @@ Licensed under either of
---
NextGraph received funding through the [NGI Assure Fund](https://nlnet.nl/project/NextGraph/index.html), a fund established by [NLnet](https://nlnet.nl/) with financial support from the European Commission's [Next Generation Internet](https://ngi.eu/) programme, under the aegis of DG Communications Networks, Content and Technology under grant agreement No 957073.
NextGraph received funding through the [NGI Assure Fund](https://nlnet.nl/assure) and the [NGI Zero Commons Fund](https://nlnet.nl/commonsfund/), both funds established by [NLnet](https://nlnet.nl/) Foundation with financial support from the European Commission's [Next Generation Internet](https://ngi.eu/) programme, under the aegis of DG Communications Networks, Content and Technology under grant agreements No 957073 and No 101092990, respectively.
[rustc-image]: https://img.shields.io/badge/rustc-1.74+-blue.svg
[license-image]: https://img.shields.io/badge/license-Apache2.0-blue.svg

@ -1,6 +1,6 @@
# Release 0.1.0-preview.7
# Release 0.1.1-alpha
_15 August 2024_
_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.
@ -10,13 +10,9 @@ If you previously installed any NextGraph app on your device, please uninstall i
## App
Please read the :
Please read the [Getting started](https://docs.nextgraph.org/en/getting-started) guide.
- [Getting started](https://docs.nextgraph.org/en/getting-started) guide.
- list of [features](https://docs.nextgraph.org/en/features).
- the [CRDTs page](https://docs.nextgraph.org/en/framework/crdts) in the framework docs.
[changelog](CHANGELOG.md#app-0-1-0-preview-7-2024-08-15)
[changelog](CHANGELOG.md#app-0-1-1-alpha-2024-09-02)
## SDK
@ -28,18 +24,17 @@ The SDK for is not documented yet.
The `ngd` daemon is release with the basic features listed in `ngd --help`. More documentation will come soon
[changelog](CHANGELOG.md#broker-0-1-0-preview-7-2024-08-15)
[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-0-preview-7-2024-08-15)
[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.
- your documents listed in your 3 stores do not display any title or content type, making it difficult to understand which document is which by just reading the 7-character ID of the documents. This will be addressed very quickly, as soon as the "Header branch" feature will be implemented. For the same reason (lack of this feature), and in the web-app only, when you will have created many docs with many modifications, the loading of your app can take some time because it is loading all the content of all the docs at startup. The native apps are already working well and do not suffer from this caveat. For the web-app, it is not the intended behaviour of course, but we need the "Header branch" feature to fix this.
- 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 soe time to be coded.
- 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.

@ -2,7 +2,7 @@
name = "nextgraph"
description = "NextGraph client library. Nextgraph is a decentralized, secure and local-first web 3.0 ecosystem based on Semantic Web and CRDTs"
categories = ["asynchronous","text-editors","web-programming","development-tools","database-implementations"]
version = "0.1.0-preview.7"
version = "0.1.1-alpha"
edition.workspace = true
license.workspace = true
authors.workspace = true
@ -32,14 +32,14 @@ whoami = "1.5.1"
qrcode = { version = "0.14.1", default-features = false, features = ["svg"] }
svg2pdf = { version = "0.11.0", default-features = false }
pdf-writer = "0.10.0"
ng-repo = { path = "../ng-repo", version = "0.1.0-preview.7" }
ng-net = { path = "../ng-net", version = "0.1.0-preview.7" }
ng-wallet = { path = "../ng-wallet", version = "0.1.0-preview.7" }
ng-client-ws = { path = "../ng-client-ws", version = "0.1.0-preview.7" }
ng-verifier = { path = "../ng-verifier", version = "0.1.0-preview.7" }
ng-repo = { path = "../ng-repo", version = "0.1.1-alpha" }
ng-net = { path = "../ng-net", version = "0.1.1-alpha" }
ng-wallet = { path = "../ng-wallet", version = "0.1.1-alpha" }
ng-client-ws = { path = "../ng-client-ws", version = "0.1.1-alpha" }
ng-verifier = { path = "../ng-verifier", version = "0.1.1-alpha" }
[target.'cfg(all(not(target_family = "wasm"),not(docsrs)))'.dependencies]
ng-storage-rocksdb = { path = "../ng-storage-rocksdb", version = "0.1.0-preview.7" }
ng-storage-rocksdb = { path = "../ng-storage-rocksdb", version = "0.1.1-alpha" }
[[example]]
name = "in_memory"

@ -43,7 +43,7 @@ A tokio-based version (as a feature) might be available in the future.
```toml
[dependencies]
nextgraph = "0.1.0-preview.7"
nextgraph = "0.1.1-alpha"
async-std = "1.12.0"
```
@ -72,7 +72,8 @@ additional terms or conditions.
---
NextGraph received funding through the [NGI Assure Fund](https://nlnet.nl/project/NextGraph/index.html), a fund established by [NLnet](https://nlnet.nl/) with financial support from the European Commission's [Next Generation Internet](https://ngi.eu/) programme, under the aegis of DG Communications Networks, Content and Technology under grant agreement No 957073.
NextGraph received funding through the [NGI Assure Fund](https://nlnet.nl/assure) and the [NGI Zero Commons Fund](https://nlnet.nl/commonsfund/), both funds established by [NLnet](https://nlnet.nl/) Foundation with financial support from the European Commission's [Next Generation Internet](https://ngi.eu/) programme, under the aegis of DG Communications Networks, Content and Technology under grant agreements No 957073 and No 101092990, respectively.
[rustc-image]: https://img.shields.io/badge/rustc-1.74+-blue.svg
[license-image]: https://img.shields.io/badge/license-Apache2.0-blue.svg

@ -1,4 +1,4 @@
// Copyright (c) 2022-2024 Niko Bonnieure, Par le Peuple, NextGraph.org developers
// 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>

@ -1,4 +1,4 @@
// Copyright (c) 2022-2024 Niko Bonnieure, Par le Peuple, NextGraph.org developers
// 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>

@ -1,4 +1,4 @@
// Copyright (c) 2022-2024 Niko Bonnieure, Par le Peuple, NextGraph.org developers
// 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>

@ -1,4 +1,4 @@
// Copyright (c) 2022-2024 Niko Bonnieure, Par le Peuple, NextGraph.org developers
// 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>
@ -1312,6 +1312,15 @@ impl LocalBroker {
// user_id.to_hash_string(),
// key
// );
let locator = if let Ok(site) = opened_wallet.wallet.site(&user_id) {
let core = site.cores[0]; //TODO: cycle the other cores if failure to connect (failover)
let brokers = opened_wallet.wallet.broker(core.0)?;
BrokerInfoV0::vec_into_locator(brokers)
} else {
Locator::empty()
};
key_material.zeroize();
let mut verifier = Verifier::new(
VerifierConfig {
@ -1325,6 +1334,7 @@ impl LocalBroker {
private_store_id: credentials.2,
protected_store_id: credentials.3,
public_store_id: credentials.4,
locator,
},
block_storage,
)?;
@ -1809,7 +1819,7 @@ lazy_static! {
server_type: BrokerServerTypeV0::Domain("nextgraph.eu".to_string()),
can_verify: false,
can_forward: false,
peer_id: ng_repo::utils::decode_key("BVboIbTZzSgRzjtNSc0do8Uw2YlKk8m-4ePZ6CJkjgEA")
peer_id: ng_repo::utils::decode_key("qCDCdmh39BccRrIzuxiyGY7r2012mFeUmMV57-RbB-cA")
.unwrap(),
};
}

@ -1,5 +1,5 @@
<!--
// Copyright (c) 2022-2024 Niko Bonnieure, Par le Peuple, NextGraph.org developers
// 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>

@ -1,5 +1,5 @@
<!--
// Copyright (c) 2022-2024 Niko Bonnieure, Par le Peuple, NextGraph.org developers
// 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>
@ -102,7 +102,7 @@
<div id="error-no-wasm" class="error-no-wasm-hidden">
Your browser is too old and does not support NextGraph. <br/>Please upgrade to a newer version of this browser,<br/> try with another browser,<br/> <br/>or <a href="https://nextgraph.org/download">install our native apps on <br/>
Linux, macOS, Windows desktops and laptops,<br/> and iOS, Android mobiles.</a>
Linux, macOS, Windows desktops and laptops,<br/> and iOS, Android mobiles.</a><br/><br/>If you are using jshelter or another javascript protection mechanism, please deactivate it as we need access to the WebWorker facility of your browser.
</div>
<noscript style="display:grid;">
NextGraph cannot load as Javascript is deactivated.<br/>
@ -116,16 +116,24 @@
</div>
<script>
const supported = (() => {
if (RegExp().hasIndices === undefined) return false;
if (RegExp().hasIndices === undefined) {console.log("no RegExp().hasIndices");return false;}
try {
if (Worker === undefined) {console.log("no Worker");return false;}
new Worker(URL.createObjectURL(new Blob([';'], {type: 'application/javascript'})));
if (typeof WebAssembly === "object"
&& typeof WebAssembly.instantiate === "function") {
const module = new WebAssembly.Module(Uint8Array.of(0x0, 0x61, 0x73, 0x6d, 0x01, 0x00, 0x00, 0x00));
if (module instanceof WebAssembly.Module)
return new WebAssembly.Instance(module) instanceof WebAssembly.Instance;
else {
console.log("no WebAssembly module");
}
}
} catch (e) {
{console.log(e);return false;}
}
console.log("no WebAssembly");
return false;
})();
if (!supported ) {

@ -1,16 +1,16 @@
{
"name": "ng-app",
"private": true,
"version": "0.1.0-preview.7",
"version": "0.1.1-alpha",
"type": "module",
"scripts": {
"dev": "shx cp index-native.html index.html && vite",
"webdev": "shx cp index-web.html index.html && cross-env NG_APP_WEB=1 TAURI_DEBUG=1 vite",
"webbuild": "shx cp index-web.html index.html && cross-env NG_APP_WEB=1 vite build && rm -f ./dist-web/assets/*.svg && tar --exclude .DS_Store -zcvf dist-web.tar.gz dist-web",
"webfilebuild": "shx cp index-web.html index.html && cross-env NG_APP_WEB=1 NG_APP_FILE=1 vite build && node prepare-app-file.cjs && rm -rf ./dist-file/assets && tar --exclude .DS_Store -zcvf dist-file.tar.gz dist-file",
"webbuild": "shx cp index-web.html index.html && cross-env NG_APP_WEB=1 vite build && shx rm -f ./dist-web/assets/*.svg && tar --exclude .DS_Store -zcvf dist-web.tar.gz dist-web",
"webfilebuild": "shx cp index-web.html index.html && cross-env NG_APP_WEB=1 NG_APP_FILE=1 vite build && node prepare-app-file.cjs && shx rm -rf ./dist-file/assets && tar --exclude .DS_Store -zcvf dist-file.tar.gz dist-file",
"webfilebuilddebug": "shx cp index-web.html index.html && cross-env NG_APP_WEB=1 NG_APP_FILE=1 TAURI_DEBUG=1 vite build -m debug",
"build": "shx cp index-native.html index.html && vite build && shx rm -f ./dist/assets/*.svg",
"buildfile": "shx cp index-native.html index.html && cross-env NG_APP_FILE=1 vite build && rm -rf ./dist/assets && tar --exclude .DS_Store -zcvf dist.tar.gz dist",
"buildfile": "shx cp index-native.html index.html && cross-env NG_APP_FILE=1 vite build && shx rm -rf ./dist/assets && tar --exclude .DS_Store -zcvf dist.tar.gz dist",
"preview": "vite preview",
"check": "svelte-check --tsconfig ./tsconfig.json",
"tauri": "tauri"
@ -68,7 +68,7 @@
"immutable-json-patch": "^6.0.1",
"katex": "^0.16.11",
"lodash.debounce": "4.0.8",
"ng-sdk-js": "workspace:^0.1.0-preview.7",
"ng-sdk-js": "workspace:^0.1.1-alpha",
"prism-themes": "^1.9.0",
"prosemirror-model": "^1.7.1",
"prosemirror-state": "^1.2.3",

@ -1,4 +1,4 @@
// Copyright (c) 2022-2024 Niko Bonnieure, Par le Peuple, NextGraph.org developers
// 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>
@ -551,6 +551,53 @@ async fn branch_history(session_id: u64, nuri: String) -> Result<AppHistoryJs, S
}
}
#[tauri::command(rename_all = "snake_case")]
async fn update_header(
session_id: u64,
nuri: String,
title: Option<String>,
about: Option<String>,
) -> Result<(), String> {
let nuri = NuriV0::new_from(&nuri).map_err(|e| e.to_string())?;
let request = AppRequest::V0(AppRequestV0 {
command: AppRequestCommandV0::new_header(),
nuri,
payload: Some(AppRequestPayload::new_header(title, about)),
session_id,
});
let res = nextgraph::local_broker::app_request(request)
.await
.map_err(|e: NgError| e.to_string())?;
if let AppResponse::V0(AppResponseV0::Error(e)) = res {
Err(e)
} else {
Ok(())
}
}
#[tauri::command(rename_all = "snake_case")]
async fn fetch_header(session_id: u64, nuri: String) -> Result<AppHeader, String> {
let nuri = NuriV0::new_from(&nuri).map_err(|e| e.to_string())?;
let request = AppRequest::V0(AppRequestV0 {
command: AppRequestCommandV0::new_fetch_header(),
nuri,
payload: None,
session_id,
});
let res = nextgraph::local_broker::app_request(request)
.await
.map_err(|e: NgError| e.to_string())?;
match res {
AppResponse::V0(AppResponseV0::Error(e)) => Err(e),
AppResponse::V0(AppResponseV0::Header(h)) => Ok(h),
_ => Err("invalid response".to_string()),
}
}
#[tauri::command(rename_all = "snake_case")]
async fn sparql_update(
session_id: u64,
@ -641,6 +688,94 @@ async fn app_request(request: AppRequest) -> Result<AppResponse, String> {
.map_err(|e| e.to_string())
}
#[tauri::command(rename_all = "snake_case")]
async fn signature_status(
session_id: u64,
nuri: Option<String>,
) -> Result<Vec<(String, Option<String>, bool)>, String> {
let nuri = if nuri.is_some() {
NuriV0::new_from(&nuri.unwrap()).map_err(|e| e.to_string())?
} else {
NuriV0::new_private_store_target()
};
let request = AppRequest::V0(AppRequestV0 {
command: AppRequestCommandV0::new_signature_status(),
nuri,
payload: None,
session_id,
});
let res = nextgraph::local_broker::app_request(request)
.await
.map_err(|e: NgError| e.to_string())?;
let AppResponse::V0(res) = res;
//log_debug!("{:?}", res);
match res {
AppResponseV0::SignatureStatus(s) => Ok(s),
_ => Err("invalid response".to_string()),
}
}
#[tauri::command(rename_all = "snake_case")]
async fn signed_snapshot_request(session_id: u64, nuri: Option<String>) -> Result<bool, String> {
let nuri = if nuri.is_some() {
NuriV0::new_from(&nuri.unwrap()).map_err(|e| e.to_string())?
} else {
NuriV0::new_private_store_target()
};
let request = AppRequest::V0(AppRequestV0 {
command: AppRequestCommandV0::new_signed_snapshot_request(),
nuri,
payload: None,
session_id,
});
let res = nextgraph::local_broker::app_request(request)
.await
.map_err(|e: NgError| e.to_string())?;
let AppResponse::V0(res) = res;
//log_debug!("{:?}", res);
match res {
AppResponseV0::True => Ok(true),
AppResponseV0::False => Ok(false),
AppResponseV0::Error(e) => Err(e),
_ => Err("invalid response".to_string()),
}
}
#[tauri::command(rename_all = "snake_case")]
async fn signature_request(session_id: u64, nuri: Option<String>) -> Result<bool, String> {
let nuri = if nuri.is_some() {
NuriV0::new_from(&nuri.unwrap()).map_err(|e| e.to_string())?
} else {
NuriV0::new_private_store_target()
};
let request = AppRequest::V0(AppRequestV0 {
command: AppRequestCommandV0::new_signature_request(),
nuri,
payload: None,
session_id,
});
let res = nextgraph::local_broker::app_request(request)
.await
.map_err(|e: NgError| e.to_string())?;
let AppResponse::V0(res) = res;
//log_debug!("{:?}", res);
match res {
AppResponseV0::True => Ok(true),
AppResponseV0::False => Ok(false),
AppResponseV0::Error(e) => Err(e),
_ => Err("invalid response".to_string()),
}
}
#[tauri::command(rename_all = "snake_case")]
async fn doc_create(
session_id: u64,
@ -932,6 +1067,11 @@ impl AppBuilder {
sparql_query,
sparql_update,
branch_history,
signature_status,
signature_request,
signed_snapshot_request,
update_header,
fetch_header,
])
.run(tauri::generate_context!())
.expect("error while running tauri application");

@ -1,4 +1,4 @@
// Copyright (c) 2022-2024 Niko Bonnieure, Par le Peuple, NextGraph.org developers
// 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>

@ -1,4 +1,4 @@
// Copyright (c) 2022-2024 Niko Bonnieure, Par le Peuple, NextGraph.org developers
// 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>

@ -8,7 +8,7 @@
},
"package": {
"productName": "Nextgraph",
"version": "0.1.0-preview.7"
"version": "0.1.1-alpha"
},
"tauri": {
"bundle": {

@ -1,5 +1,5 @@
<!--
// Copyright (c) 2022-2024 Niko Bonnieure, Par le Peuple, NextGraph.org developers
// 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>

@ -1,4 +1,4 @@
// Copyright (c) 2022-2024 Niko Bonnieure, Par le Peuple, NextGraph.org developers
// 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>
@ -50,6 +50,11 @@ const mapping = {
"doc_fetch_repo_subscribe": ["repo_o"],
"branch_history": ["session_id", "nuri"],
"file_save_to_downloads": ["session_id", "reference", "filename", "branch_nuri"],
"signature_status": ["session_id", "nuri"],
"signed_snapshot_request": ["session_id", "nuri"],
"signature_request": ["session_id", "nuri"],
"update_header": ["session_id","nuri","title","about"],
"fetch_header": ["session_id", "nuri"]
}

@ -1,5 +1,5 @@
<!--
// Copyright (c) 2022-2024 Niko Bonnieure, Par le Peuple, NextGraph.org developers
// 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>

@ -1,5 +1,5 @@
<!--
// Copyright (c) 2022-2024 Niko Bonnieure, Par le Peuple, NextGraph.org developers
// 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>

@ -1,5 +1,5 @@
<!--
// Copyright (c) 2022-2024 Niko Bonnieure, Par le Peuple, NextGraph.org developers
// 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>

@ -1,5 +1,5 @@
<!--
// Copyright (c) 2022-2024 Niko Bonnieure, Par le Peuple, NextGraph.org developers
// 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>

@ -1,5 +1,5 @@
<!--
// Copyright (c) 2022-2024 Niko Bonnieure, Par le Peuple, NextGraph.org developers
// 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>
@ -11,18 +11,24 @@
<script lang="ts">
import {
} from "../store";
import ng from "../api";
import { link } from "svelte-spa-router";
import { Button, Progressbar, Spinner, Alert } from "flowbite-svelte";
import{ PencilSquare } from "svelte-heros-v2";
import{ PlusCircle } from "svelte-heros-v2";
import { t } from "svelte-i18n";
import {
in_memory_discrete, open_viewer, set_viewer, set_editor, set_view_or_edit, cur_tab_branch_class, cur_tab_doc_can_edit, cur_tab
} from "../tab";
import DataClassIcon from "../lib/icons/DataClassIcon.svelte";
import {
openModalCreate
openModalCreate,
sparql_query,
active_session
} from "../store";
import {
Clipboard
} from "svelte-heros-v2";
export let commits;
function contained(graph) {
@ -30,23 +36,41 @@
for (const g of graph) {
if (g.substring(57,90) === "http://www.w3.org/ns/ldp#contains") {
let nuri = g.substring(93,146);
let repo = nuri;
nuri = nuri + ":" + $cur_tab.store.overlay;
let hash = nuri.substring(9,16);
ret.push({nuri,hash});
ret.push({nuri,hash,repo});
}
}
ret.sort((a, b) => a.hash.localeCompare(b.hash));
return ret;
}
async function fetch_header(repo) {
try {
let res = await ng.fetch_header($active_session.session_id, repo);
return res;
}catch(e){
console.error(e);
return {};
}
}
const create = () => {
openModalCreate();
}
const config = {
class: "mr-2 w-6 h-6 shrink-0 focus:outline-none"
}
</script>
<div class="flex-col p-5">
{#each contained(commits.graph) as doc}
<div class="flex font-mono mb-3"> <a use:link href="/{doc.nuri}">{doc.hash}</a> </div>
{#await fetch_header(doc.repo)}
<div class="flex"> <Clipboard tabindex="-1" class="mr-2 w-6 h-6 shrink-0 focus:outline-none"/><div class="flex font-mono mb-3"> <a use:link href="/{doc.nuri}">{doc.hash}</a> </div> </div>
{:then header}
<div class="flex" title="{header.about || ''}"> {#if header.class}<DataClassIcon {config} dataClass={header.class}/>{:else}<Clipboard tabindex="-1" class="mr-2 w-6 h-6 shrink-0 focus:outline-none"/>{/if}<div class="flex font-mono mb-3"> <a use:link href="/{doc.nuri}">{header.title || doc.hash}</a> </div></div>
{/await}
{/each}
{#if commits.graph.length == 0 || contained(commits.graph).length == 0}
<p>{$t("doc.empty_container")}</p>
@ -56,7 +80,7 @@
on:keypress={create}
class="select-none ml-0 mt-2 mb-10 text-white bg-primary-700 hover:bg-primary-700/90 focus:ring-4 focus:ring-primary-500/50 rounded-lg text-base p-2 text-center inline-flex items-center dark:focus:ring-primary-700/55"
>
<PencilSquare tabindex="-1" class="mr-2 focus:outline-none" />
<PlusCircle tabindex="-1" class="mr-2 focus:outline-none" />
{$t("doc.create")}
</button>
{/if}

@ -1,5 +1,5 @@
<!--
// Copyright (c) 2022-2024 Niko Bonnieure, Par le Peuple, NextGraph.org developers
// 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>
@ -104,6 +104,7 @@
}
onMount(async ()=>{
if (editor) await editor.destroy();
await setup();
});
@ -112,6 +113,7 @@
ydoc.destroy();
commits.discrete?.deregisterOnUpdate();
if (editor) await editor.destroy();
editor = undefined;
});

@ -1,5 +1,5 @@
<!--
// Copyright (c) 2022-2024 Niko Bonnieure, Par le Peuple, NextGraph.org developers
// 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>
@ -181,7 +181,7 @@
}
onMount(async ()=>{
if (editor) await editor.destroy();
await setup();
});
@ -189,6 +189,7 @@
onDestroy(async ()=>{
ydoc.destroy();
if (editor) await editor.destroy();
editor = undefined;
});
</script>

@ -1,5 +1,5 @@
<!--
// Copyright (c) 2022-2024 Niko Bonnieure, Par le Peuple, NextGraph.org developers
// 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>
@ -129,6 +129,7 @@