Compare commits
7 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
| df42085be6 | |||
| b09d3065ae | |||
| c050f5a9e3 | |||
| 78e6c0eca0 | |||
| da4da45348 | |||
| dc2af86db8 | |||
| 7502004aba |
@@ -1,5 +1,10 @@
|
|||||||
# Changelog
|
# Changelog
|
||||||
|
|
||||||
|
# 1.4.1
|
||||||
|
|
||||||
|
* Improve data synchronization
|
||||||
|
* Fix app url on capacitor deployments
|
||||||
|
|
||||||
# 1.4.0
|
# 1.4.0
|
||||||
|
|
||||||
* Allow "editing" chat messages
|
* Allow "editing" chat messages
|
||||||
|
|||||||
@@ -7,8 +7,8 @@ android {
|
|||||||
applicationId "social.flotilla"
|
applicationId "social.flotilla"
|
||||||
minSdk rootProject.ext.minSdkVersion
|
minSdk rootProject.ext.minSdkVersion
|
||||||
targetSdk rootProject.ext.targetSdkVersion
|
targetSdk rootProject.ext.targetSdkVersion
|
||||||
versionCode 29
|
versionCode 30
|
||||||
versionName "1.4.0"
|
versionName "1.4.1"
|
||||||
testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
|
testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
|
||||||
aaptOptions {
|
aaptOptions {
|
||||||
// Files and dirs to omit from the packaged assets dir, modified to accommodate modern web apps.
|
// Files and dirs to omit from the packaged assets dir, modified to accommodate modern web apps.
|
||||||
|
|||||||
@@ -358,14 +358,14 @@
|
|||||||
CODE_SIGN_ENTITLEMENTS = "Flotilla Chat.entitlements";
|
CODE_SIGN_ENTITLEMENTS = "Flotilla Chat.entitlements";
|
||||||
CODE_SIGN_IDENTITY = "Apple Development";
|
CODE_SIGN_IDENTITY = "Apple Development";
|
||||||
CODE_SIGN_STYLE = Automatic;
|
CODE_SIGN_STYLE = Automatic;
|
||||||
CURRENT_PROJECT_VERSION = 20;
|
CURRENT_PROJECT_VERSION = 21;
|
||||||
DEVELOPMENT_TEAM = S26U9DYW3A;
|
DEVELOPMENT_TEAM = S26U9DYW3A;
|
||||||
INFOPLIST_FILE = App/Info.plist;
|
INFOPLIST_FILE = App/Info.plist;
|
||||||
INFOPLIST_KEY_CFBundleDisplayName = "Flotilla Chat";
|
INFOPLIST_KEY_CFBundleDisplayName = "Flotilla Chat";
|
||||||
INFOPLIST_KEY_LSApplicationCategoryType = "public.app-category.social-networking";
|
INFOPLIST_KEY_LSApplicationCategoryType = "public.app-category.social-networking";
|
||||||
IPHONEOS_DEPLOYMENT_TARGET = 14.0;
|
IPHONEOS_DEPLOYMENT_TARGET = 14.0;
|
||||||
LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks";
|
LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks";
|
||||||
MARKETING_VERSION = 1.4.0;
|
MARKETING_VERSION = 1.4.1;
|
||||||
OTHER_SWIFT_FLAGS = "$(inherited) \"-D\" \"COCOAPODS\" \"-DDEBUG\"";
|
OTHER_SWIFT_FLAGS = "$(inherited) \"-D\" \"COCOAPODS\" \"-DDEBUG\"";
|
||||||
PRODUCT_BUNDLE_IDENTIFIER = social.flotilla;
|
PRODUCT_BUNDLE_IDENTIFIER = social.flotilla;
|
||||||
PRODUCT_NAME = "$(TARGET_NAME)";
|
PRODUCT_NAME = "$(TARGET_NAME)";
|
||||||
@@ -384,14 +384,14 @@
|
|||||||
CODE_SIGN_ENTITLEMENTS = "Flotilla Chat.entitlements";
|
CODE_SIGN_ENTITLEMENTS = "Flotilla Chat.entitlements";
|
||||||
CODE_SIGN_IDENTITY = "Apple Development";
|
CODE_SIGN_IDENTITY = "Apple Development";
|
||||||
CODE_SIGN_STYLE = Automatic;
|
CODE_SIGN_STYLE = Automatic;
|
||||||
CURRENT_PROJECT_VERSION = 20;
|
CURRENT_PROJECT_VERSION = 21;
|
||||||
DEVELOPMENT_TEAM = S26U9DYW3A;
|
DEVELOPMENT_TEAM = S26U9DYW3A;
|
||||||
INFOPLIST_FILE = App/Info.plist;
|
INFOPLIST_FILE = App/Info.plist;
|
||||||
INFOPLIST_KEY_CFBundleDisplayName = "Flotilla Chat";
|
INFOPLIST_KEY_CFBundleDisplayName = "Flotilla Chat";
|
||||||
INFOPLIST_KEY_LSApplicationCategoryType = "public.app-category.social-networking";
|
INFOPLIST_KEY_LSApplicationCategoryType = "public.app-category.social-networking";
|
||||||
IPHONEOS_DEPLOYMENT_TARGET = 14.0;
|
IPHONEOS_DEPLOYMENT_TARGET = 14.0;
|
||||||
LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks";
|
LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks";
|
||||||
MARKETING_VERSION = 1.4.0;
|
MARKETING_VERSION = 1.4.1;
|
||||||
PRODUCT_BUNDLE_IDENTIFIER = social.flotilla;
|
PRODUCT_BUNDLE_IDENTIFIER = social.flotilla;
|
||||||
PRODUCT_NAME = "$(TARGET_NAME)";
|
PRODUCT_NAME = "$(TARGET_NAME)";
|
||||||
PROVISIONING_PROFILE_SPECIFIER = "";
|
PROVISIONING_PROFILE_SPECIFIER = "";
|
||||||
|
|||||||
+11
-11
@@ -1,6 +1,6 @@
|
|||||||
{
|
{
|
||||||
"name": "flotilla",
|
"name": "flotilla",
|
||||||
"version": "1.4.0",
|
"version": "1.4.1",
|
||||||
"private": true,
|
"private": true,
|
||||||
"scripts": {
|
"scripts": {
|
||||||
"dev": "vite dev",
|
"dev": "vite dev",
|
||||||
@@ -60,16 +60,16 @@
|
|||||||
"@types/throttle-debounce": "^5.0.2",
|
"@types/throttle-debounce": "^5.0.2",
|
||||||
"@vite-pwa/assets-generator": "^0.2.6",
|
"@vite-pwa/assets-generator": "^0.2.6",
|
||||||
"@vite-pwa/sveltekit": "^0.6.8",
|
"@vite-pwa/sveltekit": "^0.6.8",
|
||||||
"@welshman/app": "^0.6.2",
|
"@welshman/app": "^0.6.3",
|
||||||
"@welshman/content": "^0.6.2",
|
"@welshman/content": "^0.6.3",
|
||||||
"@welshman/editor": "^0.6.2",
|
"@welshman/editor": "^0.6.3",
|
||||||
"@welshman/feeds": "^0.6.2",
|
"@welshman/feeds": "^0.6.3",
|
||||||
"@welshman/lib": "^0.6.2",
|
"@welshman/lib": "^0.6.3",
|
||||||
"@welshman/net": "^0.6.2",
|
"@welshman/net": "^0.6.3",
|
||||||
"@welshman/router": "^0.6.2",
|
"@welshman/router": "^0.6.3",
|
||||||
"@welshman/signer": "^0.6.2",
|
"@welshman/signer": "^0.6.3",
|
||||||
"@welshman/store": "^0.6.2",
|
"@welshman/store": "^0.6.3",
|
||||||
"@welshman/util": "^0.6.2",
|
"@welshman/util": "^0.6.3",
|
||||||
"compressorjs": "^1.2.1",
|
"compressorjs": "^1.2.1",
|
||||||
"daisyui": "^4.12.24",
|
"daisyui": "^4.12.24",
|
||||||
"date-picker-svelte": "^2.16.0",
|
"date-picker-svelte": "^2.16.0",
|
||||||
|
|||||||
Generated
+76
-76
@@ -72,35 +72,35 @@ importers:
|
|||||||
specifier: ^0.6.8
|
specifier: ^0.6.8
|
||||||
version: 0.6.8(@sveltejs/kit@2.46.5(@sveltejs/vite-plugin-svelte@4.0.4(svelte@5.39.12)(vite@5.4.20(@types/node@24.7.2)(terser@5.44.0)))(svelte@5.39.12)(vite@5.4.20(@types/node@24.7.2)(terser@5.44.0)))(@vite-pwa/assets-generator@0.2.6)(vite-plugin-pwa@0.21.2(@vite-pwa/assets-generator@0.2.6)(vite@5.4.20(@types/node@24.7.2)(terser@5.44.0))(workbox-build@7.3.0)(workbox-window@7.3.0))
|
version: 0.6.8(@sveltejs/kit@2.46.5(@sveltejs/vite-plugin-svelte@4.0.4(svelte@5.39.12)(vite@5.4.20(@types/node@24.7.2)(terser@5.44.0)))(svelte@5.39.12)(vite@5.4.20(@types/node@24.7.2)(terser@5.44.0)))(@vite-pwa/assets-generator@0.2.6)(vite-plugin-pwa@0.21.2(@vite-pwa/assets-generator@0.2.6)(vite@5.4.20(@types/node@24.7.2)(terser@5.44.0))(workbox-build@7.3.0)(workbox-window@7.3.0))
|
||||||
'@welshman/app':
|
'@welshman/app':
|
||||||
specifier: ^0.6.2
|
specifier: ^0.6.3
|
||||||
version: 0.6.2(nostr-signer-capacitor-plugin@0.0.4(@capacitor/core@7.4.3))(typescript@5.9.3)(ws@8.18.3)
|
version: 0.6.3(nostr-signer-capacitor-plugin@0.0.4(@capacitor/core@7.4.3))(typescript@5.9.3)(ws@8.18.3)
|
||||||
'@welshman/content':
|
'@welshman/content':
|
||||||
specifier: ^0.6.2
|
specifier: ^0.6.3
|
||||||
version: 0.6.2(typescript@5.9.3)
|
version: 0.6.3(typescript@5.9.3)
|
||||||
'@welshman/editor':
|
'@welshman/editor':
|
||||||
specifier: ^0.6.2
|
specifier: ^0.6.3
|
||||||
version: 0.6.2(@tiptap/extension-image@2.26.3(@tiptap/core@2.26.3(@tiptap/pm@2.26.3)))(@tiptap/extension-link@2.26.3(@tiptap/core@2.26.3(@tiptap/pm@2.26.3))(@tiptap/pm@2.26.3))(linkifyjs@4.3.2)(prosemirror-markdown@1.13.2)(prosemirror-model@1.25.3)(prosemirror-state@1.4.3)(prosemirror-view@1.41.3)(tiptap-markdown@0.8.10(@tiptap/core@2.26.3(@tiptap/pm@2.26.3)))(typescript@5.9.3)
|
version: 0.6.3(@tiptap/extension-image@2.26.3(@tiptap/core@2.26.3(@tiptap/pm@2.26.3)))(@tiptap/extension-link@2.26.3(@tiptap/core@2.26.3(@tiptap/pm@2.26.3))(@tiptap/pm@2.26.3))(linkifyjs@4.3.2)(prosemirror-markdown@1.13.2)(prosemirror-model@1.25.3)(prosemirror-state@1.4.3)(prosemirror-view@1.41.3)(tiptap-markdown@0.8.10(@tiptap/core@2.26.3(@tiptap/pm@2.26.3)))(typescript@5.9.3)
|
||||||
'@welshman/feeds':
|
'@welshman/feeds':
|
||||||
specifier: ^0.6.2
|
specifier: ^0.6.3
|
||||||
version: 0.6.2(nostr-signer-capacitor-plugin@0.0.4(@capacitor/core@7.4.3))(typescript@5.9.3)(ws@8.18.3)
|
version: 0.6.3(nostr-signer-capacitor-plugin@0.0.4(@capacitor/core@7.4.3))(typescript@5.9.3)(ws@8.18.3)
|
||||||
'@welshman/lib':
|
'@welshman/lib':
|
||||||
specifier: ^0.6.2
|
specifier: ^0.6.3
|
||||||
version: 0.6.2
|
version: 0.6.3
|
||||||
'@welshman/net':
|
'@welshman/net':
|
||||||
specifier: ^0.6.2
|
specifier: ^0.6.3
|
||||||
version: 0.6.2(typescript@5.9.3)(ws@8.18.3)
|
version: 0.6.3(typescript@5.9.3)(ws@8.18.3)
|
||||||
'@welshman/router':
|
'@welshman/router':
|
||||||
specifier: ^0.6.2
|
specifier: ^0.6.3
|
||||||
version: 0.6.2(typescript@5.9.3)(ws@8.18.3)
|
version: 0.6.3(typescript@5.9.3)(ws@8.18.3)
|
||||||
'@welshman/signer':
|
'@welshman/signer':
|
||||||
specifier: ^0.6.2
|
specifier: ^0.6.3
|
||||||
version: 0.6.2(nostr-signer-capacitor-plugin@0.0.4(@capacitor/core@7.4.3))(typescript@5.9.3)(ws@8.18.3)
|
version: 0.6.3(nostr-signer-capacitor-plugin@0.0.4(@capacitor/core@7.4.3))(typescript@5.9.3)(ws@8.18.3)
|
||||||
'@welshman/store':
|
'@welshman/store':
|
||||||
specifier: ^0.6.2
|
specifier: ^0.6.3
|
||||||
version: 0.6.2(typescript@5.9.3)(ws@8.18.3)
|
version: 0.6.3(typescript@5.9.3)(ws@8.18.3)
|
||||||
'@welshman/util':
|
'@welshman/util':
|
||||||
specifier: ^0.6.2
|
specifier: ^0.6.3
|
||||||
version: 0.6.2(typescript@5.9.3)
|
version: 0.6.3(typescript@5.9.3)
|
||||||
compressorjs:
|
compressorjs:
|
||||||
specifier: ^1.2.1
|
specifier: ^1.2.1
|
||||||
version: 1.2.1
|
version: 1.2.1
|
||||||
@@ -1692,38 +1692,38 @@ packages:
|
|||||||
'@vite-pwa/assets-generator':
|
'@vite-pwa/assets-generator':
|
||||||
optional: true
|
optional: true
|
||||||
|
|
||||||
'@welshman/app@0.6.2':
|
'@welshman/app@0.6.3':
|
||||||
resolution: {integrity: sha512-URvw8IMCkZpotyKyCKYyyHkNmF9ghYUAelZmfQrC0YttiDUVQGE0qq5/3gwZ1HAy6f9hbMWH2hfPLVnaEh4K2A==}
|
resolution: {integrity: sha512-iCZj0b3D5Q7rSEUiON+nJEKIdYG3j6MdK3oSyFiiQQxa+TPArjEbWF5kkogp1J1GMGo7gzQ6owByPgDIdlNiZg==}
|
||||||
|
|
||||||
'@welshman/content@0.6.2':
|
'@welshman/content@0.6.3':
|
||||||
resolution: {integrity: sha512-eiDpxKhm87i2JCsINtt8SGkt58JCL0UB6i0rzHsyZC1oOSM0W3OJ3NkZGDNooneDe02GpvgzDAAJa3m8QgnnzA==}
|
resolution: {integrity: sha512-VvlW2kJ/lB6sy/Upa0nbKbO6rMwTO9Bi2iGXNiR9XFA8rlMUJc7Wl1Dcd3QZD3QHBTeTICOuFB4xopwQK3W0JQ==}
|
||||||
|
|
||||||
'@welshman/editor@0.6.2':
|
'@welshman/editor@0.6.3':
|
||||||
resolution: {integrity: sha512-+sCnDCvjPLy94maRPLJdZEdQgys6XyYPOmxpXaj/AmkhqGIGovA/7YiIB86vS1NHmRy02hgM/eMV311jaVe6ww==}
|
resolution: {integrity: sha512-oLOhUUYO+4vhOehEpVhmsGMhmiBsJa/jgSsVRuCpZRKi+jwrJsaC9J7AyUzbQmcA8e07oNsqfakDYFkbFAfUVQ==}
|
||||||
|
|
||||||
'@welshman/feeds@0.6.2':
|
'@welshman/feeds@0.6.3':
|
||||||
resolution: {integrity: sha512-bOgcLwVd/n5HlhxuflBZLXJZfKhQAJDbYh40sNr1dtKh4eM6vd5ujMZyj8D2OwdfazOAVX3ZwRenJCdy5+gwVw==}
|
resolution: {integrity: sha512-Q5Dupo+C/CIm7BMZ++7BhQdjgyu3tU4aK2w172cx0gTFfSTqKxFrbWX4ewUWqq8ex1/1Xd+heVheE1q54FCVNQ==}
|
||||||
|
|
||||||
'@welshman/lib@0.6.2':
|
'@welshman/lib@0.6.3':
|
||||||
resolution: {integrity: sha512-1GpCOr0pXTDdy87PEvAV0+lvjgQbFODU5RsNM0LTyeU0885uzPHrfoJbZoNXayY9klwuvS9NBHFkUN7lySITzA==}
|
resolution: {integrity: sha512-O632yJQ/1IUmb9FuC+O0TsOUl+UubYriU95LpKA9ZFAaogXLrzHZH0HZ/4xmdPj82kqBeS98EOb3GkSAOYZaLA==}
|
||||||
engines: {node: '>=12.0.0'}
|
engines: {node: '>=12.0.0'}
|
||||||
|
|
||||||
'@welshman/net@0.6.2':
|
'@welshman/net@0.6.3':
|
||||||
resolution: {integrity: sha512-MX2nGqH2/P/Q9WeIiN9AHo4/n2S4mABE6gCACB5vA1v3FdwKjinN/otoUJGo+fTlaIMJHnxoDYV4vOT3F9mZuA==}
|
resolution: {integrity: sha512-RlCYFFau6p2RZq3K4XMYhD7xvNFYjA6zpzHuM8iV4Xh8nL5b8tn6e6f6a4I2E5uZMfYdWstvcC6OhU/Z4NQZoA==}
|
||||||
|
|
||||||
'@welshman/router@0.6.2':
|
'@welshman/router@0.6.3':
|
||||||
resolution: {integrity: sha512-dyTFn5h1oxP7bh/G+kydqfvXTPjmq2aZ1ikwJ2rOsCaNNqBnm/d9o6r9knZoWGJpLD6a5szY5lA9Vo9DtUuouA==}
|
resolution: {integrity: sha512-lZaw166aJKhftakMGofzmFmtAqfQBGSur58/ANgLCwVy4b5riqempcPoH6EOgwqANye5YUlsUisxbx0r/2wXPA==}
|
||||||
|
|
||||||
'@welshman/signer@0.6.2':
|
'@welshman/signer@0.6.3':
|
||||||
resolution: {integrity: sha512-UYCr0c9xj2qbknDD5HH94+cfdX7v27PGJPZ9V7JuQQHdDzK8LUOLXf5NvGqcTbAb6IlUnTGbvA19oJZP6l0vNw==}
|
resolution: {integrity: sha512-O0cd5nV77Lt4vWRvb50l6U1wkhQF6LW3x+N4tspqWqo9BeIHTDlUtZMdsnhwfTjeVlLocSVkUValxhoxxt20SA==}
|
||||||
peerDependencies:
|
peerDependencies:
|
||||||
nostr-signer-capacitor-plugin: ~0.0.4
|
nostr-signer-capacitor-plugin: ~0.0.4
|
||||||
|
|
||||||
'@welshman/store@0.6.2':
|
'@welshman/store@0.6.3':
|
||||||
resolution: {integrity: sha512-ZRELLUtadbUoLV678qJ8Lt2KmcCe+Qi3frsKJmPW5HeuPHKgNJBY9QgqYK2D07T42nLGqrqLdVfv3Mz0xp3eGA==}
|
resolution: {integrity: sha512-3TMon00CF1l/LcWq+B3pq/FNs2Ie4Y9EdjiAcg4dvDeZPI9h1HoQPB/s2RcaG4FYPhkynvM5zL/eH+5GIe9kJw==}
|
||||||
|
|
||||||
'@welshman/util@0.6.2':
|
'@welshman/util@0.6.3':
|
||||||
resolution: {integrity: sha512-stBlkzlso4A0mpicQjwrHvfXdbZ5XTT2K4iuTFe9a4DN5bKkDiHYEWvEjbd3751TJK1BKH9snOfgdKuxnkvSeg==}
|
resolution: {integrity: sha512-ki2j3ADmxqI0rbdnkq0wS7PFXTY0dZ24yOgceyTizwF/dtcRKmH7YyvM+2YwgbgaUO6BtqKjktc3jrh6XaxOQg==}
|
||||||
|
|
||||||
'@xml-tools/parser@1.0.11':
|
'@xml-tools/parser@1.0.11':
|
||||||
resolution: {integrity: sha512-aKqQ077XnR+oQtHJlrAflaZaL7qZsulWc/i/ZEooar5JiWj1eLt0+Wg28cpa+XLney107wXqneC+oG1IZvxkTA==}
|
resolution: {integrity: sha512-aKqQ077XnR+oQtHJlrAflaZaL7qZsulWc/i/ZEooar5JiWj1eLt0+Wg28cpa+XLney107wXqneC+oG1IZvxkTA==}
|
||||||
@@ -6651,16 +6651,16 @@ snapshots:
|
|||||||
optionalDependencies:
|
optionalDependencies:
|
||||||
'@vite-pwa/assets-generator': 0.2.6
|
'@vite-pwa/assets-generator': 0.2.6
|
||||||
|
|
||||||
'@welshman/app@0.6.2(nostr-signer-capacitor-plugin@0.0.4(@capacitor/core@7.4.3))(typescript@5.9.3)(ws@8.18.3)':
|
'@welshman/app@0.6.3(nostr-signer-capacitor-plugin@0.0.4(@capacitor/core@7.4.3))(typescript@5.9.3)(ws@8.18.3)':
|
||||||
dependencies:
|
dependencies:
|
||||||
'@types/throttle-debounce': 5.0.2
|
'@types/throttle-debounce': 5.0.2
|
||||||
'@welshman/feeds': 0.6.2(nostr-signer-capacitor-plugin@0.0.4(@capacitor/core@7.4.3))(typescript@5.9.3)(ws@8.18.3)
|
'@welshman/feeds': 0.6.3(nostr-signer-capacitor-plugin@0.0.4(@capacitor/core@7.4.3))(typescript@5.9.3)(ws@8.18.3)
|
||||||
'@welshman/lib': 0.6.2
|
'@welshman/lib': 0.6.3
|
||||||
'@welshman/net': 0.6.2(typescript@5.9.3)(ws@8.18.3)
|
'@welshman/net': 0.6.3(typescript@5.9.3)(ws@8.18.3)
|
||||||
'@welshman/router': 0.6.2(typescript@5.9.3)(ws@8.18.3)
|
'@welshman/router': 0.6.3(typescript@5.9.3)(ws@8.18.3)
|
||||||
'@welshman/signer': 0.6.2(nostr-signer-capacitor-plugin@0.0.4(@capacitor/core@7.4.3))(typescript@5.9.3)(ws@8.18.3)
|
'@welshman/signer': 0.6.3(nostr-signer-capacitor-plugin@0.0.4(@capacitor/core@7.4.3))(typescript@5.9.3)(ws@8.18.3)
|
||||||
'@welshman/store': 0.6.2(typescript@5.9.3)(ws@8.18.3)
|
'@welshman/store': 0.6.3(typescript@5.9.3)(ws@8.18.3)
|
||||||
'@welshman/util': 0.6.2(typescript@5.9.3)
|
'@welshman/util': 0.6.3(typescript@5.9.3)
|
||||||
fuse.js: 7.1.0
|
fuse.js: 7.1.0
|
||||||
svelte: 4.2.20
|
svelte: 4.2.20
|
||||||
throttle-debounce: 5.0.2
|
throttle-debounce: 5.0.2
|
||||||
@@ -6669,14 +6669,14 @@ snapshots:
|
|||||||
- typescript
|
- typescript
|
||||||
- ws
|
- ws
|
||||||
|
|
||||||
'@welshman/content@0.6.2(typescript@5.9.3)':
|
'@welshman/content@0.6.3(typescript@5.9.3)':
|
||||||
dependencies:
|
dependencies:
|
||||||
'@braintree/sanitize-url': 7.1.1
|
'@braintree/sanitize-url': 7.1.1
|
||||||
nostr-tools: 2.17.0(typescript@5.9.3)
|
nostr-tools: 2.17.0(typescript@5.9.3)
|
||||||
transitivePeerDependencies:
|
transitivePeerDependencies:
|
||||||
- typescript
|
- typescript
|
||||||
|
|
||||||
'@welshman/editor@0.6.2(@tiptap/extension-image@2.26.3(@tiptap/core@2.26.3(@tiptap/pm@2.26.3)))(@tiptap/extension-link@2.26.3(@tiptap/core@2.26.3(@tiptap/pm@2.26.3))(@tiptap/pm@2.26.3))(linkifyjs@4.3.2)(prosemirror-markdown@1.13.2)(prosemirror-model@1.25.3)(prosemirror-state@1.4.3)(prosemirror-view@1.41.3)(tiptap-markdown@0.8.10(@tiptap/core@2.26.3(@tiptap/pm@2.26.3)))(typescript@5.9.3)':
|
'@welshman/editor@0.6.3(@tiptap/extension-image@2.26.3(@tiptap/core@2.26.3(@tiptap/pm@2.26.3)))(@tiptap/extension-link@2.26.3(@tiptap/core@2.26.3(@tiptap/pm@2.26.3))(@tiptap/pm@2.26.3))(linkifyjs@4.3.2)(prosemirror-markdown@1.13.2)(prosemirror-model@1.25.3)(prosemirror-state@1.4.3)(prosemirror-view@1.41.3)(tiptap-markdown@0.8.10(@tiptap/core@2.26.3(@tiptap/pm@2.26.3)))(typescript@5.9.3)':
|
||||||
dependencies:
|
dependencies:
|
||||||
'@tiptap/core': 2.26.3(@tiptap/pm@2.26.3)
|
'@tiptap/core': 2.26.3(@tiptap/pm@2.26.3)
|
||||||
'@tiptap/extension-code': 2.26.3(@tiptap/core@2.26.3(@tiptap/pm@2.26.3))
|
'@tiptap/extension-code': 2.26.3(@tiptap/core@2.26.3(@tiptap/pm@2.26.3))
|
||||||
@@ -6691,8 +6691,8 @@ snapshots:
|
|||||||
'@tiptap/extension-text': 2.26.3(@tiptap/core@2.26.3(@tiptap/pm@2.26.3))
|
'@tiptap/extension-text': 2.26.3(@tiptap/core@2.26.3(@tiptap/pm@2.26.3))
|
||||||
'@tiptap/pm': 2.26.3
|
'@tiptap/pm': 2.26.3
|
||||||
'@tiptap/suggestion': 2.26.3(@tiptap/core@2.26.3(@tiptap/pm@2.26.3))(@tiptap/pm@2.26.3)
|
'@tiptap/suggestion': 2.26.3(@tiptap/core@2.26.3(@tiptap/pm@2.26.3))(@tiptap/pm@2.26.3)
|
||||||
'@welshman/lib': 0.6.2
|
'@welshman/lib': 0.6.3
|
||||||
'@welshman/util': 0.6.2(typescript@5.9.3)
|
'@welshman/util': 0.6.3(typescript@5.9.3)
|
||||||
nostr-editor: 1.0.1(@tiptap/core@2.26.3(@tiptap/pm@2.26.3))(@tiptap/extension-image@2.26.3(@tiptap/core@2.26.3(@tiptap/pm@2.26.3)))(@tiptap/extension-link@2.26.3(@tiptap/core@2.26.3(@tiptap/pm@2.26.3))(@tiptap/pm@2.26.3))(@tiptap/pm@2.26.3)(linkifyjs@4.3.2)(nostr-tools@2.17.0(typescript@5.9.3))(prosemirror-markdown@1.13.2)(prosemirror-model@1.25.3)(prosemirror-state@1.4.3)(prosemirror-view@1.41.3)(tiptap-markdown@0.8.10(@tiptap/core@2.26.3(@tiptap/pm@2.26.3)))
|
nostr-editor: 1.0.1(@tiptap/core@2.26.3(@tiptap/pm@2.26.3))(@tiptap/extension-image@2.26.3(@tiptap/core@2.26.3(@tiptap/pm@2.26.3)))(@tiptap/extension-link@2.26.3(@tiptap/core@2.26.3(@tiptap/pm@2.26.3))(@tiptap/pm@2.26.3))(@tiptap/pm@2.26.3)(linkifyjs@4.3.2)(nostr-tools@2.17.0(typescript@5.9.3))(prosemirror-markdown@1.13.2)(prosemirror-model@1.25.3)(prosemirror-state@1.4.3)(prosemirror-view@1.41.3)(tiptap-markdown@0.8.10(@tiptap/core@2.26.3(@tiptap/pm@2.26.3)))
|
||||||
nostr-tools: 2.17.0(typescript@5.9.3)
|
nostr-tools: 2.17.0(typescript@5.9.3)
|
||||||
tippy.js: 6.3.7
|
tippy.js: 6.3.7
|
||||||
@@ -6707,71 +6707,71 @@ snapshots:
|
|||||||
- tiptap-markdown
|
- tiptap-markdown
|
||||||
- typescript
|
- typescript
|
||||||
|
|
||||||
'@welshman/feeds@0.6.2(nostr-signer-capacitor-plugin@0.0.4(@capacitor/core@7.4.3))(typescript@5.9.3)(ws@8.18.3)':
|
'@welshman/feeds@0.6.3(nostr-signer-capacitor-plugin@0.0.4(@capacitor/core@7.4.3))(typescript@5.9.3)(ws@8.18.3)':
|
||||||
dependencies:
|
dependencies:
|
||||||
'@welshman/lib': 0.6.2
|
'@welshman/lib': 0.6.3
|
||||||
'@welshman/net': 0.6.2(typescript@5.9.3)(ws@8.18.3)
|
'@welshman/net': 0.6.3(typescript@5.9.3)(ws@8.18.3)
|
||||||
'@welshman/router': 0.6.2(typescript@5.9.3)(ws@8.18.3)
|
'@welshman/router': 0.6.3(typescript@5.9.3)(ws@8.18.3)
|
||||||
'@welshman/signer': 0.6.2(nostr-signer-capacitor-plugin@0.0.4(@capacitor/core@7.4.3))(typescript@5.9.3)(ws@8.18.3)
|
'@welshman/signer': 0.6.3(nostr-signer-capacitor-plugin@0.0.4(@capacitor/core@7.4.3))(typescript@5.9.3)(ws@8.18.3)
|
||||||
'@welshman/util': 0.6.2(typescript@5.9.3)
|
'@welshman/util': 0.6.3(typescript@5.9.3)
|
||||||
trava: 1.2.1
|
trava: 1.2.1
|
||||||
transitivePeerDependencies:
|
transitivePeerDependencies:
|
||||||
- nostr-signer-capacitor-plugin
|
- nostr-signer-capacitor-plugin
|
||||||
- typescript
|
- typescript
|
||||||
- ws
|
- ws
|
||||||
|
|
||||||
'@welshman/lib@0.6.2':
|
'@welshman/lib@0.6.3':
|
||||||
dependencies:
|
dependencies:
|
||||||
'@scure/base': 1.2.6
|
'@scure/base': 1.2.6
|
||||||
'@types/events': 3.0.3
|
'@types/events': 3.0.3
|
||||||
events: 3.3.0
|
events: 3.3.0
|
||||||
|
|
||||||
'@welshman/net@0.6.2(typescript@5.9.3)(ws@8.18.3)':
|
'@welshman/net@0.6.3(typescript@5.9.3)(ws@8.18.3)':
|
||||||
dependencies:
|
dependencies:
|
||||||
'@welshman/lib': 0.6.2
|
'@welshman/lib': 0.6.3
|
||||||
'@welshman/util': 0.6.2(typescript@5.9.3)
|
'@welshman/util': 0.6.3(typescript@5.9.3)
|
||||||
events: 3.3.0
|
events: 3.3.0
|
||||||
isomorphic-ws: 5.0.0(ws@8.18.3)
|
isomorphic-ws: 5.0.0(ws@8.18.3)
|
||||||
transitivePeerDependencies:
|
transitivePeerDependencies:
|
||||||
- typescript
|
- typescript
|
||||||
- ws
|
- ws
|
||||||
|
|
||||||
'@welshman/router@0.6.2(typescript@5.9.3)(ws@8.18.3)':
|
'@welshman/router@0.6.3(typescript@5.9.3)(ws@8.18.3)':
|
||||||
dependencies:
|
dependencies:
|
||||||
'@welshman/lib': 0.6.2
|
'@welshman/lib': 0.6.3
|
||||||
'@welshman/net': 0.6.2(typescript@5.9.3)(ws@8.18.3)
|
'@welshman/net': 0.6.3(typescript@5.9.3)(ws@8.18.3)
|
||||||
'@welshman/util': 0.6.2(typescript@5.9.3)
|
'@welshman/util': 0.6.3(typescript@5.9.3)
|
||||||
transitivePeerDependencies:
|
transitivePeerDependencies:
|
||||||
- typescript
|
- typescript
|
||||||
- ws
|
- ws
|
||||||
|
|
||||||
'@welshman/signer@0.6.2(nostr-signer-capacitor-plugin@0.0.4(@capacitor/core@7.4.3))(typescript@5.9.3)(ws@8.18.3)':
|
'@welshman/signer@0.6.3(nostr-signer-capacitor-plugin@0.0.4(@capacitor/core@7.4.3))(typescript@5.9.3)(ws@8.18.3)':
|
||||||
dependencies:
|
dependencies:
|
||||||
'@noble/curves': 1.9.7
|
'@noble/curves': 1.9.7
|
||||||
'@noble/hashes': 1.8.0
|
'@noble/hashes': 1.8.0
|
||||||
'@welshman/lib': 0.6.2
|
'@welshman/lib': 0.6.3
|
||||||
'@welshman/net': 0.6.2(typescript@5.9.3)(ws@8.18.3)
|
'@welshman/net': 0.6.3(typescript@5.9.3)(ws@8.18.3)
|
||||||
'@welshman/util': 0.6.2(typescript@5.9.3)
|
'@welshman/util': 0.6.3(typescript@5.9.3)
|
||||||
nostr-signer-capacitor-plugin: 0.0.4(@capacitor/core@7.4.3)
|
nostr-signer-capacitor-plugin: 0.0.4(@capacitor/core@7.4.3)
|
||||||
nostr-tools: 2.17.0(typescript@5.9.3)
|
nostr-tools: 2.17.0(typescript@5.9.3)
|
||||||
transitivePeerDependencies:
|
transitivePeerDependencies:
|
||||||
- typescript
|
- typescript
|
||||||
- ws
|
- ws
|
||||||
|
|
||||||
'@welshman/store@0.6.2(typescript@5.9.3)(ws@8.18.3)':
|
'@welshman/store@0.6.3(typescript@5.9.3)(ws@8.18.3)':
|
||||||
dependencies:
|
dependencies:
|
||||||
'@welshman/lib': 0.6.2
|
'@welshman/lib': 0.6.3
|
||||||
'@welshman/net': 0.6.2(typescript@5.9.3)(ws@8.18.3)
|
'@welshman/net': 0.6.3(typescript@5.9.3)(ws@8.18.3)
|
||||||
'@welshman/util': 0.6.2(typescript@5.9.3)
|
'@welshman/util': 0.6.3(typescript@5.9.3)
|
||||||
svelte: 4.2.20
|
svelte: 4.2.20
|
||||||
transitivePeerDependencies:
|
transitivePeerDependencies:
|
||||||
- typescript
|
- typescript
|
||||||
- ws
|
- ws
|
||||||
|
|
||||||
'@welshman/util@0.6.2(typescript@5.9.3)':
|
'@welshman/util@0.6.3(typescript@5.9.3)':
|
||||||
dependencies:
|
dependencies:
|
||||||
'@types/ws': 8.18.1
|
'@types/ws': 8.18.1
|
||||||
'@welshman/lib': 0.6.2
|
'@welshman/lib': 0.6.3
|
||||||
js-base64: 3.7.8
|
js-base64: 3.7.8
|
||||||
nostr-tools: 2.17.0(typescript@5.9.3)
|
nostr-tools: 2.17.0(typescript@5.9.3)
|
||||||
nostr-wasm: 0.1.0
|
nostr-wasm: 0.1.0
|
||||||
|
|||||||
@@ -38,7 +38,7 @@
|
|||||||
import SocketStatusIndicator from "@app/components/SocketStatusIndicator.svelte"
|
import SocketStatusIndicator from "@app/components/SocketStatusIndicator.svelte"
|
||||||
import {
|
import {
|
||||||
ENABLE_ZAPS,
|
ENABLE_ZAPS,
|
||||||
MESSAGE_FILTER,
|
CONTENT_KINDS,
|
||||||
deriveSpaceMembers,
|
deriveSpaceMembers,
|
||||||
deriveEventsForUrl,
|
deriveEventsForUrl,
|
||||||
deriveUserRooms,
|
deriveUserRooms,
|
||||||
@@ -65,7 +65,7 @@
|
|||||||
const hasAlerts = $derived($alerts.some(a => getTagValue("feed", a.tags)?.includes(url)))
|
const hasAlerts = $derived($alerts.some(a => getTagValue("feed", a.tags)?.includes(url)))
|
||||||
|
|
||||||
const spaceKinds = derived(
|
const spaceKinds = derived(
|
||||||
deriveEventsForUrl(url, [MESSAGE_FILTER]),
|
deriveEventsForUrl(url, [{kinds: CONTENT_KINDS}]),
|
||||||
$events => new Set($events.map(e => e.kind)),
|
$events => new Set($events.map(e => e.kind)),
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|||||||
+3
-14
@@ -143,7 +143,7 @@ export const INDEXER_RELAYS = fromCsv(import.meta.env.VITE_INDEXER_RELAYS)
|
|||||||
|
|
||||||
export const SIGNER_RELAYS = fromCsv(import.meta.env.VITE_SIGNER_RELAYS)
|
export const SIGNER_RELAYS = fromCsv(import.meta.env.VITE_SIGNER_RELAYS)
|
||||||
|
|
||||||
export const PLATFORM_URL = window.location.origin
|
export const PLATFORM_URL = import.meta.env.VITE_PLATFORM_URL
|
||||||
|
|
||||||
export const PLATFORM_TERMS = import.meta.env.VITE_PLATFORM_TERMS
|
export const PLATFORM_TERMS = import.meta.env.VITE_PLATFORM_TERMS
|
||||||
|
|
||||||
@@ -310,20 +310,9 @@ if (ENABLE_ZAPS) {
|
|||||||
REACTION_KINDS.push(ZAP_RESPONSE)
|
REACTION_KINDS.push(ZAP_RESPONSE)
|
||||||
}
|
}
|
||||||
|
|
||||||
export const MESSAGE_KINDS = [ZAP_GOAL, EVENT_TIME, THREAD, MESSAGE]
|
export const CONTENT_KINDS = [ZAP_GOAL, EVENT_TIME, THREAD]
|
||||||
|
|
||||||
export const MESSAGE_FILTER = {kinds: MESSAGE_KINDS}
|
export const MESSAGE_KINDS = [...CONTENT_KINDS, MESSAGE]
|
||||||
|
|
||||||
export const COMMENT_FILTER = makeCommentFilter(MESSAGE_KINDS)
|
|
||||||
|
|
||||||
export const MEMBERSHIP_KINDS = [
|
|
||||||
ROOM_ADD_MEMBER,
|
|
||||||
ROOM_REMOVE_MEMBER,
|
|
||||||
RELAY_ADD_MEMBER,
|
|
||||||
RELAY_REMOVE_MEMBER,
|
|
||||||
]
|
|
||||||
|
|
||||||
export const MEMBERSHIP_FILTER = {kinds: MEMBERSHIP_KINDS}
|
|
||||||
|
|
||||||
// Settings
|
// Settings
|
||||||
|
|
||||||
|
|||||||
+220
-126
@@ -1,23 +1,12 @@
|
|||||||
import {page} from "$app/stores"
|
import {page} from "$app/stores"
|
||||||
import type {Unsubscriber} from "svelte/store"
|
import type {Unsubscriber} from "svelte/store"
|
||||||
import {derived, get} from "svelte/store"
|
import {derived, get} from "svelte/store"
|
||||||
import {
|
import {partition, call, sortBy, assoc, chunk, sleep, identity, WEEK, ago} from "@welshman/lib"
|
||||||
partition,
|
|
||||||
call,
|
|
||||||
sortBy,
|
|
||||||
assoc,
|
|
||||||
chunk,
|
|
||||||
sleep,
|
|
||||||
now,
|
|
||||||
identity,
|
|
||||||
WEEK,
|
|
||||||
MONTH,
|
|
||||||
ago,
|
|
||||||
} from "@welshman/lib"
|
|
||||||
import {
|
import {
|
||||||
getListTags,
|
getListTags,
|
||||||
getRelayTagValues,
|
getRelayTagValues,
|
||||||
WRAP,
|
WRAP,
|
||||||
|
MESSAGE,
|
||||||
ROOM_META,
|
ROOM_META,
|
||||||
ROOM_DELETE,
|
ROOM_DELETE,
|
||||||
ROOM_ADMINS,
|
ROOM_ADMINS,
|
||||||
@@ -26,6 +15,8 @@ import {
|
|||||||
ROOM_REMOVE_MEMBER,
|
ROOM_REMOVE_MEMBER,
|
||||||
ROOM_CREATE_PERMISSION,
|
ROOM_CREATE_PERMISSION,
|
||||||
RELAY_MEMBERS,
|
RELAY_MEMBERS,
|
||||||
|
RELAY_ADD_MEMBER,
|
||||||
|
RELAY_REMOVE_MEMBER,
|
||||||
isSignedEvent,
|
isSignedEvent,
|
||||||
} from "@welshman/util"
|
} from "@welshman/util"
|
||||||
import type {Filter, TrustedEvent} from "@welshman/util"
|
import type {Filter, TrustedEvent} from "@welshman/util"
|
||||||
@@ -45,19 +36,23 @@ import {
|
|||||||
repository,
|
repository,
|
||||||
shouldUnwrap,
|
shouldUnwrap,
|
||||||
hasNegentropy,
|
hasNegentropy,
|
||||||
|
relaysByUrl,
|
||||||
} from "@welshman/app"
|
} from "@welshman/app"
|
||||||
import {
|
import {
|
||||||
MESSAGE_FILTER,
|
MESSAGE_KINDS,
|
||||||
COMMENT_FILTER,
|
CONTENT_KINDS,
|
||||||
MEMBERSHIP_FILTER,
|
|
||||||
INDEXER_RELAYS,
|
INDEXER_RELAYS,
|
||||||
REACTION_KINDS,
|
|
||||||
loadSettings,
|
loadSettings,
|
||||||
loadGroupSelections,
|
loadGroupSelections,
|
||||||
userSpaceUrls,
|
userSpaceUrls,
|
||||||
|
userGroupSelections,
|
||||||
bootstrapPubkeys,
|
bootstrapPubkeys,
|
||||||
decodeRelay,
|
decodeRelay,
|
||||||
getUrlsForEvent,
|
getUrlsForEvent,
|
||||||
|
hasNip29,
|
||||||
|
getSpaceUrlsFromGroupSelections,
|
||||||
|
getSpaceRoomsFromGroupSelections,
|
||||||
|
makeCommentFilter,
|
||||||
} from "@app/core/state"
|
} from "@app/core/state"
|
||||||
import {loadAlerts, loadAlertStatuses} from "@app/core/requests"
|
import {loadAlerts, loadAlertStatuses} from "@app/core/requests"
|
||||||
import {hasBlossomSupport} from "@app/core/commands"
|
import {hasBlossomSupport} from "@app/core/commands"
|
||||||
@@ -70,7 +65,7 @@ type PullOpts = {
|
|||||||
signal: AbortSignal
|
signal: AbortSignal
|
||||||
}
|
}
|
||||||
|
|
||||||
const pullConservatively = ({relays, filters, signal}: PullOpts) => {
|
const pullWithFallback = ({relays, filters, signal}: PullOpts) => {
|
||||||
const $getUrlsForEvent = get(getUrlsForEvent)
|
const $getUrlsForEvent = get(getUrlsForEvent)
|
||||||
const [smart, dumb] = partition(hasNegentropy, relays)
|
const [smart, dumb] = partition(hasNegentropy, relays)
|
||||||
const events = repository.query(filters, {shouldSort: false}).filter(isSignedEvent)
|
const events = repository.query(filters, {shouldSort: false}).filter(isSignedEvent)
|
||||||
@@ -91,6 +86,20 @@ const pullConservatively = ({relays, filters, signal}: PullOpts) => {
|
|||||||
return Promise.all(promises)
|
return Promise.all(promises)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
const pullAndListen = ({relays, filters, signal}: PullOpts) => {
|
||||||
|
pullWithFallback({
|
||||||
|
relays,
|
||||||
|
signal,
|
||||||
|
filters: filters.map(f => ({limit: 100, ...f})),
|
||||||
|
})
|
||||||
|
|
||||||
|
request({
|
||||||
|
relays,
|
||||||
|
signal,
|
||||||
|
filters: filters.map(assoc("limit", 0)),
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
// Relays
|
// Relays
|
||||||
|
|
||||||
const syncRelays = () => {
|
const syncRelays = () => {
|
||||||
@@ -121,10 +130,80 @@ const syncRelays = () => {
|
|||||||
|
|
||||||
// User data
|
// User data
|
||||||
|
|
||||||
|
const syncUserSpaceMembership = (url: string) => {
|
||||||
|
const $pubkey = pubkey.get()
|
||||||
|
const controller = new AbortController()
|
||||||
|
|
||||||
|
if ($pubkey) {
|
||||||
|
pullAndListen({
|
||||||
|
relays: [url],
|
||||||
|
signal: controller.signal,
|
||||||
|
filters: [
|
||||||
|
{
|
||||||
|
kinds: [RELAY_ADD_MEMBER, RELAY_REMOVE_MEMBER, ROOM_CREATE_PERMISSION],
|
||||||
|
"#p": [$pubkey],
|
||||||
|
},
|
||||||
|
],
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
return () => controller.abort()
|
||||||
|
}
|
||||||
|
|
||||||
|
const syncUserRoomMembership = (url: string, room: string) => {
|
||||||
|
const $pubkey = pubkey.get()
|
||||||
|
const controller = new AbortController()
|
||||||
|
|
||||||
|
if ($pubkey) {
|
||||||
|
pullAndListen({
|
||||||
|
relays: [url],
|
||||||
|
signal: controller.signal,
|
||||||
|
filters: [
|
||||||
|
{
|
||||||
|
kinds: [ROOM_ADD_MEMBER, ROOM_REMOVE_MEMBER],
|
||||||
|
"#p": [$pubkey],
|
||||||
|
"#h": [room],
|
||||||
|
},
|
||||||
|
],
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
return () => controller.abort()
|
||||||
|
}
|
||||||
|
|
||||||
const syncUserData = () => {
|
const syncUserData = () => {
|
||||||
const unsubscribePubkey = pubkey.subscribe($pubkey => {
|
const unsubscribersByKey = new Map<string, Unsubscriber>()
|
||||||
|
|
||||||
|
const unsubscribeGroupSelections = userGroupSelections.subscribe($l => {
|
||||||
|
const $pubkey = pubkey.get()
|
||||||
|
|
||||||
if ($pubkey) {
|
if ($pubkey) {
|
||||||
loadRelaySelections($pubkey)
|
const keys = new Set<string>()
|
||||||
|
|
||||||
|
for (const url of getSpaceUrlsFromGroupSelections($l)) {
|
||||||
|
if (!unsubscribersByKey.has(url)) {
|
||||||
|
unsubscribersByKey.set(url, syncUserSpaceMembership(url))
|
||||||
|
}
|
||||||
|
|
||||||
|
keys.add(url)
|
||||||
|
|
||||||
|
for (const room of getSpaceRoomsFromGroupSelections(url, $l)) {
|
||||||
|
const key = `${url}'${room}`
|
||||||
|
|
||||||
|
if (!unsubscribersByKey.has(key)) {
|
||||||
|
unsubscribersByKey.set(key, syncUserRoomMembership(url, room))
|
||||||
|
}
|
||||||
|
|
||||||
|
keys.add(key)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
for (const [key, unsubscribe] of unsubscribersByKey.entries()) {
|
||||||
|
if (!keys.has(key)) {
|
||||||
|
unsubscribersByKey.delete(key)
|
||||||
|
unsubscribe()
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
|
|
||||||
@@ -148,154 +227,175 @@ const syncUserData = () => {
|
|||||||
// This isn't urgent, avoid clogging other stuff up
|
// This isn't urgent, avoid clogging other stuff up
|
||||||
await sleep(1000)
|
await sleep(1000)
|
||||||
|
|
||||||
for (const pk of pubkeys) {
|
await Promise.all(
|
||||||
loadRelaySelections(pk).then(() => {
|
pubkeys.map(async pk => {
|
||||||
loadGroupSelections(pk)
|
await loadRelaySelections(pk)
|
||||||
loadProfile(pk)
|
await loadGroupSelections(pk)
|
||||||
loadFollows(pk)
|
await loadProfile(pk)
|
||||||
loadMutes(pk)
|
await loadFollows(pk)
|
||||||
})
|
await loadMutes(pk)
|
||||||
}
|
}),
|
||||||
|
)
|
||||||
|
}
|
||||||
|
})
|
||||||
|
|
||||||
|
const unsubscribePubkey = pubkey.subscribe($pubkey => {
|
||||||
|
if ($pubkey) {
|
||||||
|
loadRelaySelections($pubkey)
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
|
|
||||||
return () => {
|
return () => {
|
||||||
unsubscribePubkey()
|
unsubscribersByKey.forEach(call)
|
||||||
|
unsubscribeGroupSelections()
|
||||||
unsubscribeSelections()
|
unsubscribeSelections()
|
||||||
unsubscribeFollows()
|
unsubscribeFollows()
|
||||||
|
unsubscribePubkey()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// Memberships
|
// Spaces
|
||||||
|
|
||||||
const syncMembership = (url: string) => {
|
|
||||||
const controller = new AbortController()
|
|
||||||
const relayFilter = {kinds: [RELAY_MEMBERS, ROOM_CREATE_PERMISSION]}
|
|
||||||
const roomsFilter = {kinds: [ROOM_ADMINS, ROOM_MEMBERS, ROOM_META, ROOM_DELETE]}
|
|
||||||
|
|
||||||
// Load group metadata and member lists
|
|
||||||
pullConservatively({
|
|
||||||
relays: [url],
|
|
||||||
signal: controller.signal,
|
|
||||||
filters: [relayFilter, roomsFilter],
|
|
||||||
})
|
|
||||||
|
|
||||||
// Load historical data from up to a month ago for quick page loading
|
|
||||||
pullConservatively({
|
|
||||||
relays: [url],
|
|
||||||
signal: controller.signal,
|
|
||||||
filters: [MESSAGE_FILTER, COMMENT_FILTER, MEMBERSHIP_FILTER].map(assoc("since", ago(MONTH))),
|
|
||||||
})
|
|
||||||
|
|
||||||
// Listen for new events
|
|
||||||
request({
|
|
||||||
relays: [url],
|
|
||||||
signal: controller.signal,
|
|
||||||
filters: [relayFilter, roomsFilter, MESSAGE_FILTER, COMMENT_FILTER, MEMBERSHIP_FILTER].map(
|
|
||||||
assoc("since", now()),
|
|
||||||
),
|
|
||||||
})
|
|
||||||
|
|
||||||
return () => controller.abort()
|
|
||||||
}
|
|
||||||
|
|
||||||
const syncMemberships = () => {
|
|
||||||
const unsubscribersByUrl = new Map<string, Unsubscriber>()
|
|
||||||
|
|
||||||
const unsubscribeSpaceUrls = userSpaceUrls.subscribe(urls => {
|
|
||||||
// stop syncing removed spaces
|
|
||||||
for (const [url, unsubscribe] of unsubscribersByUrl.entries()) {
|
|
||||||
if (!urls.includes(url)) {
|
|
||||||
unsubscribersByUrl.delete(url)
|
|
||||||
unsubscribe()
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// Start syncing newly added spaces
|
|
||||||
for (const url of urls) {
|
|
||||||
if (!unsubscribersByUrl.has(url)) {
|
|
||||||
unsubscribersByUrl.set(url, syncMembership(url))
|
|
||||||
}
|
|
||||||
}
|
|
||||||
})
|
|
||||||
|
|
||||||
return () => {
|
|
||||||
Array.from(unsubscribersByUrl.values()).forEach(call)
|
|
||||||
unsubscribeSpaceUrls()
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// Sync extra stuff for the current space
|
|
||||||
|
|
||||||
const syncSpace = (url: string) => {
|
const syncSpace = (url: string) => {
|
||||||
const $pubkey = pubkey.get()
|
|
||||||
const controller = new AbortController()
|
const controller = new AbortController()
|
||||||
|
|
||||||
// Load all membership changes for the current user
|
pullAndListen({
|
||||||
if ($pubkey) {
|
|
||||||
pullConservatively({
|
|
||||||
relays: [url],
|
|
||||||
signal: controller.signal,
|
|
||||||
filters: [
|
|
||||||
{
|
|
||||||
kinds: [ROOM_ADD_MEMBER, ROOM_REMOVE_MEMBER],
|
|
||||||
"#p": [$pubkey],
|
|
||||||
},
|
|
||||||
],
|
|
||||||
})
|
|
||||||
}
|
|
||||||
|
|
||||||
// Listen actively for all current membership changes, reports, reactions, zaps, etc
|
|
||||||
request({
|
|
||||||
relays: [url],
|
relays: [url],
|
||||||
signal: controller.signal,
|
signal: controller.signal,
|
||||||
filters: [
|
filters: [
|
||||||
{
|
{kinds: [RELAY_MEMBERS]},
|
||||||
kinds: [ROOM_ADD_MEMBER, ROOM_REMOVE_MEMBER, ...REACTION_KINDS],
|
{kinds: [ROOM_META]},
|
||||||
since: now(),
|
{kinds: [RELAY_ADD_MEMBER, RELAY_REMOVE_MEMBER]},
|
||||||
},
|
...MESSAGE_KINDS.map(kind => ({kinds: [kind]})),
|
||||||
|
makeCommentFilter(CONTENT_KINDS),
|
||||||
],
|
],
|
||||||
})
|
})
|
||||||
|
|
||||||
return () => controller.abort()
|
return () => controller.abort()
|
||||||
}
|
}
|
||||||
|
|
||||||
const syncCurrentSpace = () => {
|
const syncSpaces = () => {
|
||||||
const unsubscribersByUrl = new Map<string, Unsubscriber>()
|
const membershipUnsubscribersByUrl = new Map<string, Unsubscriber>()
|
||||||
|
|
||||||
|
const unsubscribeSpaceUrls = userSpaceUrls.subscribe(urls => {
|
||||||
|
// stop syncing removed spaces
|
||||||
|
for (const [url, unsubscribe] of membershipUnsubscribersByUrl.entries()) {
|
||||||
|
if (!urls.includes(url)) {
|
||||||
|
membershipUnsubscribersByUrl.delete(url)
|
||||||
|
unsubscribe()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Start syncing newly added spaces
|
||||||
|
for (const url of urls) {
|
||||||
|
if (!membershipUnsubscribersByUrl.has(url)) {
|
||||||
|
membershipUnsubscribersByUrl.set(url, syncSpace(url))
|
||||||
|
}
|
||||||
|
}
|
||||||
|
})
|
||||||
|
|
||||||
|
const pageUnsubscribersByUrl = new Map<string, Unsubscriber>()
|
||||||
|
|
||||||
// Sync the space the user is currently visiting
|
// Sync the space the user is currently visiting
|
||||||
const unsubscribePage = page.subscribe($page => {
|
const unsubscribePage = page.subscribe($page => {
|
||||||
if ($page.params.relay) {
|
if ($page.params.relay) {
|
||||||
const url = decodeRelay($page.params.relay)
|
const url = decodeRelay($page.params.relay)
|
||||||
|
|
||||||
if (!unsubscribersByUrl.has(url)) {
|
// Don't subscribe twice if the user is a member
|
||||||
unsubscribersByUrl.set(url, syncSpace(url))
|
if (!pageUnsubscribersByUrl.has(url) && !get(userSpaceUrls).includes(url)) {
|
||||||
|
pageUnsubscribersByUrl.set(url, syncSpace(url))
|
||||||
}
|
}
|
||||||
|
|
||||||
for (const [oldUrl, unsubscribe] of unsubscribersByUrl.entries()) {
|
// Clean up old subscriptions
|
||||||
|
for (const [oldUrl, unsubscribe] of pageUnsubscribersByUrl.entries()) {
|
||||||
if (url !== oldUrl) {
|
if (url !== oldUrl) {
|
||||||
unsubscribersByUrl.delete(oldUrl)
|
pageUnsubscribersByUrl.delete(oldUrl)
|
||||||
unsubscribe()
|
unsubscribe()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
Array.from(unsubscribersByUrl.values()).forEach(call)
|
Array.from(pageUnsubscribersByUrl.values()).forEach(call)
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
|
|
||||||
return () => {
|
return () => {
|
||||||
Array.from(unsubscribersByUrl.values()).forEach(call)
|
Array.from(membershipUnsubscribersByUrl.values()).forEach(call)
|
||||||
|
Array.from(pageUnsubscribersByUrl.values()).forEach(call)
|
||||||
|
unsubscribeSpaceUrls()
|
||||||
unsubscribePage()
|
unsubscribePage()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Chat
|
||||||
|
|
||||||
|
const syncRoomChat = (url: string, room: string) => {
|
||||||
|
const controller = new AbortController()
|
||||||
|
|
||||||
|
pullAndListen({
|
||||||
|
relays: [url],
|
||||||
|
signal: controller.signal,
|
||||||
|
filters: [
|
||||||
|
{kinds: [ROOM_ADMINS, ROOM_MEMBERS], "#d": [room]},
|
||||||
|
{kinds: [ROOM_ADD_MEMBER, ROOM_REMOVE_MEMBER], "#h": [room]},
|
||||||
|
{kinds: [ROOM_DELETE], "#h": [room]},
|
||||||
|
{kinds: [MESSAGE], "#h": [room]},
|
||||||
|
],
|
||||||
|
})
|
||||||
|
|
||||||
|
return () => controller.abort()
|
||||||
|
}
|
||||||
|
|
||||||
|
const syncRooms = () => {
|
||||||
|
const unsubscribersByKey = new Map<string, Unsubscriber>()
|
||||||
|
|
||||||
|
const unsubscribeSpaceUrls = derived([userGroupSelections, relaysByUrl], identity).subscribe(
|
||||||
|
([$l, $relaysByUrl]) => {
|
||||||
|
const keys = new Set<string>()
|
||||||
|
const newUnsubscribersByKey = new Map<string, Unsubscriber>()
|
||||||
|
|
||||||
|
// Add new subscriptions, depending on whether nip 29 is supported
|
||||||
|
for (const url of getRelayTagValues(getListTags($l))) {
|
||||||
|
if (hasNip29($relaysByUrl.get(url))) {
|
||||||
|
for (const room of getSpaceRoomsFromGroupSelections(url, $l)) {
|
||||||
|
const id = `${url}'${room}`
|
||||||
|
|
||||||
|
if (!unsubscribersByKey.has(id)) {
|
||||||
|
newUnsubscribersByKey.set(url, syncRoomChat(url, room))
|
||||||
|
}
|
||||||
|
|
||||||
|
keys.add(id)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Stop syncing removed selections
|
||||||
|
for (const [key, unsubscribe] of unsubscribersByKey.entries()) {
|
||||||
|
if (!keys.has(key)) {
|
||||||
|
unsubscribersByKey.delete(key)
|
||||||
|
unsubscribe()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Start syncing newly added spaces
|
||||||
|
for (const [key, unsubscriber] of newUnsubscribersByKey.entries()) {
|
||||||
|
unsubscribersByKey.set(key, unsubscriber)
|
||||||
|
}
|
||||||
|
},
|
||||||
|
)
|
||||||
|
|
||||||
|
return () => {
|
||||||
|
Array.from(unsubscribersByKey.values()).forEach(call)
|
||||||
|
unsubscribeSpaceUrls()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
// DMs
|
// DMs
|
||||||
|
|
||||||
const syncDMRelay = (url: string, pubkey: string) => {
|
const syncDMRelay = (url: string, pubkey: string) => {
|
||||||
const controller = new AbortController()
|
const controller = new AbortController()
|
||||||
|
|
||||||
// Load historical data
|
// Load historical data
|
||||||
pullConservatively({
|
pullWithFallback({
|
||||||
relays: [url],
|
relays: [url],
|
||||||
signal: controller.signal,
|
signal: controller.signal,
|
||||||
filters: [{kinds: [WRAP], "#p": [pubkey], until: ago(WEEK, 2)}],
|
filters: [{kinds: [WRAP], "#p": [pubkey], until: ago(WEEK, 2)}],
|
||||||
@@ -378,13 +478,7 @@ const syncDMs = () => {
|
|||||||
// Merge all synchronization functions
|
// Merge all synchronization functions
|
||||||
|
|
||||||
export const syncApplicationData = () => {
|
export const syncApplicationData = () => {
|
||||||
const unsubscribers = [
|
const unsubscribers = [syncRelays(), syncUserData(), syncSpaces(), syncRooms(), syncDMs()]
|
||||||
syncRelays(),
|
|
||||||
syncUserData(),
|
|
||||||
syncMemberships(),
|
|
||||||
syncCurrentSpace(),
|
|
||||||
syncDMs(),
|
|
||||||
]
|
|
||||||
|
|
||||||
return () => unsubscribers.forEach(call)
|
return () => unsubscribers.forEach(call)
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user