From 40ce24be9a778e81c1a037524f2ad783aa8046c1 Mon Sep 17 00:00:00 2001 From: Paulo Pinto Date: Tue, 11 Apr 2023 17:46:19 +0100 Subject: [PATCH 1/9] Update hydrogen to latest version --- package.json | 2 +- yarn.lock | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/package.json b/package.json index b8bc96c..07f5f2d 100644 --- a/package.json +++ b/package.json @@ -38,7 +38,7 @@ "dependencies": { "@wordpress/compose": "^5.17.0", "bs58": "^5.0.0", - "hydrogen-web": "Automattic/hydrogen-web#chatrix-0.7.1", + "hydrogen-web": "Automattic/hydrogen-web#e1f235bda075d06b1f475f4d5dfa3bb3bf07ad0b", "node-html-parser": "^4.0.0" }, "resolutions": { diff --git a/yarn.lock b/yarn.lock index 035e125..3e32e79 100644 --- a/yarn.lock +++ b/yarn.lock @@ -5720,9 +5720,9 @@ human-signals@^2.1.0: resolved "https://registry.yarnpkg.com/human-signals/-/human-signals-2.1.0.tgz#dc91fcba42e4d06e4abaed33b3e7a3c02f514ea0" integrity sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw== -hydrogen-web@Automattic/hydrogen-web#chatrix-0.7.1: +hydrogen-web@Automattic/hydrogen-web#e1f235bda075d06b1f475f4d5dfa3bb3bf07ad0b: version "0.3.8" - resolved "https://codeload.github.com/Automattic/hydrogen-web/tar.gz/061341d494e0f29bf22b988ff4b1d089be1e76b7" + resolved "https://codeload.github.com/Automattic/hydrogen-web/tar.gz/e1f235bda075d06b1f475f4d5dfa3bb3bf07ad0b" dependencies: "@matrix-org/olm" "https://gitlab.matrix.org/api/v4/projects/27/packages/npm/@matrix-org/olm/-/@matrix-org/olm-3.2.8.tgz" another-json "^0.2.0" From 105bcf334e913188876aa4a73299c8d15fbd0b21 Mon Sep 17 00:00:00 2001 From: Paulo Pinto Date: Tue, 11 Apr 2023 17:47:42 +0100 Subject: [PATCH 2/9] Fix path of olm worker --- frontend/iframe/assets.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/frontend/iframe/assets.ts b/frontend/iframe/assets.ts index 17f0b67..c5e017b 100644 --- a/frontend/iframe/assets.ts +++ b/frontend/iframe/assets.ts @@ -2,7 +2,7 @@ import olmJsPath from "@matrix-org/olm/olm.js?url"; import olmWasmPath from "@matrix-org/olm/olm.wasm?url"; import olmLegacyJsPath from "@matrix-org/olm/olm_legacy.js?url"; import downloadSandboxPath from "hydrogen-web/src/platform/web/assets/download-sandbox.html?url"; -import workerPath from "hydrogen-web/src/platform/web/worker/main.js?url"; +import workerPath from "hydrogen-web/src/platform/workers/olm/main.js?url"; const paths = { downloadSandbox: downloadSandboxPath, From 30b3f88bb0b3cc8953df7201edaeb461abbd78dd Mon Sep 17 00:00:00 2001 From: Paulo Pinto Date: Tue, 11 Apr 2023 18:21:48 +0100 Subject: [PATCH 3/9] Don't generate manifest This brakes the iframe build as the manifest gets picked up, somehow. --- frontend/vite.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/frontend/vite.ts b/frontend/vite.ts index 042ffee..a24ac8e 100644 --- a/frontend/vite.ts +++ b/frontend/vite.ts @@ -42,7 +42,7 @@ export default defineConfig(({mode}) => { }, target: "esnext", assetsInlineLimit: 0, - manifest: true, + manifest: false, emptyOutDir: true, }, css: { From df04df419b5735eeb7e09222cc6b81929312a2a8 Mon Sep 17 00:00:00 2001 From: Paulo Pinto Date: Tue, 11 Apr 2023 18:43:07 +0100 Subject: [PATCH 4/9] Don't prevent concurrent session access when sync is running in a worker --- frontend/iframe/platform/Platform.ts | 3 --- frontend/iframe/platform/StorageFactory.ts | 8 ++++++-- 2 files changed, 6 insertions(+), 5 deletions(-) diff --git a/frontend/iframe/platform/Platform.ts b/frontend/iframe/platform/Platform.ts index 9dbe046..1519da7 100644 --- a/frontend/iframe/platform/Platform.ts +++ b/frontend/iframe/platform/Platform.ts @@ -6,7 +6,6 @@ import { IConfig } from "../config/IConfig"; import { History } from "./History"; import { Navigation } from "./Navigation"; import { ServiceWorkerHandler } from "./ServiceWorkerHandler"; -import { StorageFactory } from "./StorageFactory"; export class Platform extends BasePlatform { constructor(options) { @@ -23,9 +22,7 @@ export class Platform extends BasePlatform { serviceWorkerHandler.registerAndStart(assetPaths.serviceWorker); } - super.storageFactory = new StorageFactory(serviceWorkerHandler); super._serviceWorkerHandler = serviceWorkerHandler; - super.settingsStorage = new SettingsStorage("chatrix_setting_v1_"); super.sessionInfoStorage = new SessionInfoStorage("chatrix_sessions_v1"); super.history = new History(); diff --git a/frontend/iframe/platform/StorageFactory.ts b/frontend/iframe/platform/StorageFactory.ts index c05fe38..28ee340 100644 --- a/frontend/iframe/platform/StorageFactory.ts +++ b/frontend/iframe/platform/StorageFactory.ts @@ -56,11 +56,12 @@ async function requestPersistedStorage(): Promise { export class StorageFactory { private _serviceWorkerHandler: ServiceWorkerHandler; + private _runSyncInWorker: boolean; private _idbFactory: IDBFactory; private _IDBKeyRange: typeof IDBKeyRange; private _localStorage: IDOMStorage; - constructor(serviceWorkerHandler: ServiceWorkerHandler, idbFactory: IDBFactory = window.indexedDB, _IDBKeyRange = window.IDBKeyRange, localStorage: IDOMStorage = window.localStorage) { + constructor(serviceWorkerHandler: ServiceWorkerHandler, runSyncInWorker: boolean = false, idbFactory: IDBFactory = self.indexedDB, _IDBKeyRange = self.IDBKeyRange, localStorage: IDOMStorage = self.localStorage) { this._serviceWorkerHandler = serviceWorkerHandler; this._idbFactory = idbFactory; this._IDBKeyRange = _IDBKeyRange; @@ -68,7 +69,10 @@ export class StorageFactory { } async create(sessionId: string, log: ILogItem): Promise { - await this._serviceWorkerHandler?.preventConcurrentSessionAccess(sessionId); + // When sync is running in a worker, we do not need to prevent concurrent session access. + if (!this._runSyncInWorker) { + await this._serviceWorkerHandler?.preventConcurrentSessionAccess(sessionId); + } void requestPersistedStorage().then(persisted => { // Firefox lies here though, and returns true even if the user denied the request if (!persisted) { From b1a47933ac46ebf37c501285502ddfd9cd620c69 Mon Sep 17 00:00:00 2001 From: Paulo Pinto Date: Tue, 11 Apr 2023 18:52:42 +0100 Subject: [PATCH 5/9] Must return the promise --- frontend/iframe/platform/Platform.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/frontend/iframe/platform/Platform.ts b/frontend/iframe/platform/Platform.ts index 1519da7..2da1b3d 100644 --- a/frontend/iframe/platform/Platform.ts +++ b/frontend/iframe/platform/Platform.ts @@ -41,7 +41,7 @@ export class Platform extends BasePlatform { } async init() { - super.init(); + return super.init(); } get config(): IConfig { From 19849f2f52c24fd12d50a79f40fd92e53572470b Mon Sep 17 00:00:00 2001 From: Paulo Pinto Date: Tue, 11 Apr 2023 18:57:28 +0100 Subject: [PATCH 6/9] Reorder imports --- frontend/iframe/main.ts | 2 +- frontend/iframe/viewmodels/RootViewModel.ts | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/frontend/iframe/main.ts b/frontend/iframe/main.ts index 3ae6dfa..86e4139 100644 --- a/frontend/iframe/main.ts +++ b/frontend/iframe/main.ts @@ -1,4 +1,5 @@ import { parseUrlPath, stringifyPath } from "hydrogen-web/src/domain/navigation"; +import { FeatureSet } from "hydrogen-web/src/features"; import { NullLogger } from "hydrogen-web/src/logging/NullLogger"; import assetPaths from "./assets"; import { ConfigFactory } from "./config/ConfigFactory"; @@ -7,7 +8,6 @@ import { Platform } from "./platform/Platform"; import { URLRouter } from "./platform/URLRouter"; import { RootViewModel } from "./viewmodels/RootViewModel"; import { RootView } from "./views/RootView"; -import {FeatureSet} from "hydrogen-web/src/features"; export class Main { private readonly _platform: Platform; diff --git a/frontend/iframe/viewmodels/RootViewModel.ts b/frontend/iframe/viewmodels/RootViewModel.ts index 52488ff..29fd37b 100644 --- a/frontend/iframe/viewmodels/RootViewModel.ts +++ b/frontend/iframe/viewmodels/RootViewModel.ts @@ -2,14 +2,14 @@ import { ForcedLogoutViewModel } from "hydrogen-web/src/domain/ForcedLogoutViewM import { LoginViewModel } from "hydrogen-web/src/domain/login/LoginViewModel"; import { LogoutViewModel } from "hydrogen-web/src/domain/LogoutViewModel"; import { SegmentType } from "hydrogen-web/src/domain/navigation"; +import { UnknownRoomViewModel } from "hydrogen-web/src/domain/session/room/UnknownRoomViewModel"; import { SessionLoadViewModel } from "hydrogen-web/src/domain/SessionLoadViewModel"; import { SessionPickerViewModel } from "hydrogen-web/src/domain/SessionPickerViewModel"; -import { UnknownRoomViewModel } from "hydrogen-web/src/domain/session/room/UnknownRoomViewModel"; import { Options as BaseOptions, ViewModel } from "hydrogen-web/src/domain/ViewModel"; import { Client } from "hydrogen-web/src/matrix/Client.js"; import { HomeServerApi } from "hydrogen-web/src/matrix/net/HomeServerApi"; -import { allSections, Section } from "../platform/Navigation"; import { lookupHomeserver } from "hydrogen-web/src/matrix/well-known"; +import { allSections, Section } from "../platform/Navigation"; import { Platform } from "../platform/Platform"; import { SessionViewModel } from "./SessionViewModel"; From 8f6681b9a26b3fd06d308b0150eb66061dc479bf Mon Sep 17 00:00:00 2001 From: Paulo Pinto Date: Wed, 12 Apr 2023 11:27:06 +0100 Subject: [PATCH 7/9] Await promise --- frontend/iframe/viewmodels/RootViewModel.ts | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/frontend/iframe/viewmodels/RootViewModel.ts b/frontend/iframe/viewmodels/RootViewModel.ts index 29fd37b..9a58528 100644 --- a/frontend/iframe/viewmodels/RootViewModel.ts +++ b/frontend/iframe/viewmodels/RootViewModel.ts @@ -153,7 +153,7 @@ export class RootViewModel extends ViewModel { this._pendingClient.dispose(); this._pendingClient = null; } - this._showSessionLoader(sessionId); + await this._showSessionLoader(sessionId); } } } else if (loginToken) { @@ -282,9 +282,9 @@ export class RootViewModel extends ViewModel { } } - private _showSessionLoader(sessionId: string) { + private async _showSessionLoader(sessionId: string) { const client = new Client(this.platform, this.features); - client.startWithExistingSession(sessionId); + await client.startWithExistingSession(sessionId); this._setSection(() => { this._sessionLoadViewModel = new SessionLoadViewModel(this.childOptions({ From 34022105a5b71fe75ff1df45c1e7b4fbc0bce3b1 Mon Sep 17 00:00:00 2001 From: Paulo Pinto Date: Fri, 14 Apr 2023 10:25:37 +0100 Subject: [PATCH 8/9] Remove no-longer used file --- frontend/iframe/platform/StorageFactory.ts | 116 --------------------- 1 file changed, 116 deletions(-) delete mode 100644 frontend/iframe/platform/StorageFactory.ts diff --git a/frontend/iframe/platform/StorageFactory.ts b/frontend/iframe/platform/StorageFactory.ts deleted file mode 100644 index 28ee340..0000000 --- a/frontend/iframe/platform/StorageFactory.ts +++ /dev/null @@ -1,116 +0,0 @@ -/* -Copyright 2020 Bruno Windels - -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. -*/ - -import { ILogItem } from "hydrogen-web/src/logging/types"; -import { Export, exportSession, importSession } from "hydrogen-web/src/matrix/storage/idb/export"; -import { detectWebkitEarlyCloseTxnBug } from "hydrogen-web/src/matrix/storage/idb/quirks"; -import { schema } from "hydrogen-web/src/matrix/storage/idb/schema"; -import { Storage } from "hydrogen-web/src/matrix/storage/idb/Storage"; -import { clearKeysFromLocalStorage } from "hydrogen-web/src/matrix/storage/idb/stores/SessionStore"; -import { IDOMStorage } from "hydrogen-web/src/matrix/storage/idb/types"; -import { openDatabase, reqAsPromise } from "hydrogen-web/src/matrix/storage/idb/utils"; - -// This file is the same as hydrogen-web/src/matrix/storage/idb/StorageFactory.ts. -// The only change we've made is to make the following function use the prefix "chatrix" instead of "hydrogen". -const sessionName = (sessionId: string) => `chatrix_session_${sessionId}`; - -const openDatabaseWithSessionId = function(sessionId: string, idbFactory: IDBFactory, localStorage: IDOMStorage, log: ILogItem) { - const create = (db, txn, oldVersion, version) => createStores(db, txn, oldVersion, version, localStorage, log); - return openDatabase(sessionName(sessionId), create, schema.length, idbFactory); -}; - -interface ServiceWorkerHandler { - preventConcurrentSessionAccess: (sessionId: string) => Promise; -} - -async function requestPersistedStorage(): Promise { - // don't assume browser so we can run in node with fake-idb - const glob = this; - if (glob?.navigator?.storage?.persist) { - return await glob.navigator.storage.persist(); - } else if (glob?.document.requestStorageAccess) { - try { - await glob.document.requestStorageAccess(); - return true; - } catch (err) { - console.warn("requestStorageAccess threw an error:", err); - return false; - } - } else { - return false; - } -} - -export class StorageFactory { - private _serviceWorkerHandler: ServiceWorkerHandler; - private _runSyncInWorker: boolean; - private _idbFactory: IDBFactory; - private _IDBKeyRange: typeof IDBKeyRange; - private _localStorage: IDOMStorage; - - constructor(serviceWorkerHandler: ServiceWorkerHandler, runSyncInWorker: boolean = false, idbFactory: IDBFactory = self.indexedDB, _IDBKeyRange = self.IDBKeyRange, localStorage: IDOMStorage = self.localStorage) { - this._serviceWorkerHandler = serviceWorkerHandler; - this._idbFactory = idbFactory; - this._IDBKeyRange = _IDBKeyRange; - this._localStorage = localStorage; - } - - async create(sessionId: string, log: ILogItem): Promise { - // When sync is running in a worker, we do not need to prevent concurrent session access. - if (!this._runSyncInWorker) { - await this._serviceWorkerHandler?.preventConcurrentSessionAccess(sessionId); - } - void requestPersistedStorage().then(persisted => { - // Firefox lies here though, and returns true even if the user denied the request - if (!persisted) { - console.warn("no persisted storage, database can be evicted by browser"); - } - }); - - const hasWebkitEarlyCloseTxnBug = await detectWebkitEarlyCloseTxnBug(this._idbFactory); - const db = await openDatabaseWithSessionId(sessionId, this._idbFactory, this._localStorage, log); - return new Storage(db, this._idbFactory, this._IDBKeyRange, hasWebkitEarlyCloseTxnBug, this._localStorage, log.logger); - } - - delete(sessionId: string): Promise { - const databaseName = sessionName(sessionId); - clearKeysFromLocalStorage(this._localStorage, databaseName); - const req = this._idbFactory.deleteDatabase(databaseName); - return reqAsPromise(req); - } - - async export(sessionId: string, log: ILogItem): Promise { - const db = await openDatabaseWithSessionId(sessionId, this._idbFactory, this._localStorage, log); - return await exportSession(db); - } - - async import(sessionId: string, data: Export, log: ILogItem): Promise { - const db = await openDatabaseWithSessionId(sessionId, this._idbFactory, this._localStorage, log); - return await importSession(db, data); - } -} - -async function createStores(db: IDBDatabase, txn: IDBTransaction, oldVersion: number | null, version: number, localStorage: IDOMStorage, log: ILogItem): Promise { - const startIdx = oldVersion || 0; - return log.wrap( - { l: "storage migration", oldVersion, version }, - async (log) => { - for (let i = startIdx; i < version; ++i) { - const migrationFunc = schema[i]; - await log.wrap(`v${i + 1}`, (log) => migrationFunc(db, txn, localStorage, log)); - } - }); -} From 6380a7db6efc849fb1a7766486f5e9456bf27c02 Mon Sep 17 00:00:00 2001 From: Paulo Pinto Date: Fri, 14 Apr 2023 15:18:38 +0100 Subject: [PATCH 9/9] Depend on hydrogen tag --- package.json | 2 +- yarn.lock | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/package.json b/package.json index 07f5f2d..faa8095 100644 --- a/package.json +++ b/package.json @@ -38,7 +38,7 @@ "dependencies": { "@wordpress/compose": "^5.17.0", "bs58": "^5.0.0", - "hydrogen-web": "Automattic/hydrogen-web#e1f235bda075d06b1f475f4d5dfa3bb3bf07ad0b", + "hydrogen-web": "Automattic/hydrogen-web#chatrix-0.8.0", "node-html-parser": "^4.0.0" }, "resolutions": { diff --git a/yarn.lock b/yarn.lock index 3e32e79..892c9a1 100644 --- a/yarn.lock +++ b/yarn.lock @@ -5720,9 +5720,9 @@ human-signals@^2.1.0: resolved "https://registry.yarnpkg.com/human-signals/-/human-signals-2.1.0.tgz#dc91fcba42e4d06e4abaed33b3e7a3c02f514ea0" integrity sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw== -hydrogen-web@Automattic/hydrogen-web#e1f235bda075d06b1f475f4d5dfa3bb3bf07ad0b: +hydrogen-web@Automattic/hydrogen-web#chatrix-0.8.0: version "0.3.8" - resolved "https://codeload.github.com/Automattic/hydrogen-web/tar.gz/e1f235bda075d06b1f475f4d5dfa3bb3bf07ad0b" + resolved "https://codeload.github.com/Automattic/hydrogen-web/tar.gz/ded5651568465c594ada43fa2c75051073e45fa2" dependencies: "@matrix-org/olm" "https://gitlab.matrix.org/api/v4/projects/27/packages/npm/@matrix-org/olm/-/@matrix-org/olm-3.2.8.tgz" another-json "^0.2.0"