diff --git a/index.html b/index.html index cdf0ad4f..b09286a0 100644 --- a/index.html +++ b/index.html @@ -18,7 +18,11 @@ ` + + `` + `` + - ``); + ``); removeOrEnableScript(doc("script#service-worker"), offline); const versionScript = doc("script#version"); @@ -338,7 +346,7 @@ async function copyFolder(srcRoot, dstRoot, filter) { if (dirEnt.isDirectory()) { await fs.mkdir(dstPath); Object.assign(assetPaths, await copyFolder(srcPath, dstPath, filter)); - } else if (dirEnt.isFile() && filter(srcPath)) { + } else if ((dirEnt.isFile() || dirEnt.isSymbolicLink()) && (!filter || filter(srcPath))) { const content = await fs.readFile(srcPath); const hashedDstPath = resource(dstPath, content); await fs.writeFile(hashedDstPath, content); diff --git a/src/main.js b/src/main.js index 2c86b9d9..79f5698d 100644 --- a/src/main.js +++ b/src/main.js @@ -26,10 +26,39 @@ import {BrawlView} from "./ui/web/BrawlView.js"; import {Clock} from "./ui/web/dom/Clock.js"; import {OnlineStatus} from "./ui/web/dom/OnlineStatus.js"; +function addScript(src) { + return new Promise(function (resolve, reject) { + var s = document.createElement("script"); + s.setAttribute("src", src ); + s.onload=resolve; + s.onerror=reject; + document.body.appendChild(s); + }); +} + +async function loadOlm(olmPaths) { + // make crypto.getRandomValues available without + // a prefix on IE11, needed by olm to work + if (window.msCrypto && !window.crypto) { + window.crypto = window.msCrypto; + } + if (olmPaths) { + if (window.WebAssembly) { + await addScript(olmPaths.wasmBundle); + await window.Olm.init({locateFile: () => olmPaths.wasm}); + } else { + await addScript(olmPaths.legacyBundle); + await window.Olm.init(); + } + return window.Olm; + } + return null; +} + // Don't use a default export here, as we use multiple entries during legacy build, // which does not support default exports, // see https://github.com/rollup/plugins/tree/master/packages/multi-entry -export async function main(container) { +export async function main(container, olmPaths) { try { // to replay: // const fetchLog = await (await fetch("/fetchlogs/constrainterror.json")).json(); @@ -59,6 +88,7 @@ export async function main(container) { sessionInfoStorage, request, clock, + olmPromise: loadOlm(olmPaths), }); }, sessionInfoStorage, diff --git a/src/matrix/Session.js b/src/matrix/Session.js index 7a7dea52..f6db9c97 100644 --- a/src/matrix/Session.js +++ b/src/matrix/Session.js @@ -21,7 +21,7 @@ import {User} from "./User.js"; export class Session { // sessionInfo contains deviceId, userId and homeServer - constructor({storage, hsApi, sessionInfo}) { + constructor({storage, hsApi, sessionInfo, olm}) { this._storage = storage; this._hsApi = hsApi; this._session = null; @@ -30,6 +30,7 @@ export class Session { this._sendScheduler = new SendScheduler({hsApi, backoff: new RateLimitingBackoff()}); this._roomUpdateCallback = (room, params) => this._rooms.update(room.id, params); this._user = new User(sessionInfo.userId); + this._olm = olm; } async load() { diff --git a/src/matrix/SessionContainer.js b/src/matrix/SessionContainer.js index 74184a0a..eb025ec6 100644 --- a/src/matrix/SessionContainer.js +++ b/src/matrix/SessionContainer.js @@ -41,7 +41,7 @@ export const LoginFailure = createEnum( ); export class SessionContainer { - constructor({clock, random, onlineStatus, request, storageFactory, sessionInfoStorage}) { + constructor({clock, random, onlineStatus, request, storageFactory, sessionInfoStorage, olmPromise}) { this._random = random; this._clock = clock; this._onlineStatus = onlineStatus; @@ -57,6 +57,7 @@ export class SessionContainer { this._sync = null; this._sessionId = null; this._storage = null; + this._olmPromise = olmPromise; } createNewSessionId() { @@ -149,7 +150,8 @@ export class SessionContainer { userId: sessionInfo.userId, homeServer: sessionInfo.homeServer, }; - this._session = new Session({storage: this._storage, sessionInfo: filteredSessionInfo, hsApi}); + const olm = await this._olmPromise; + this._session = new Session({storage: this._storage, sessionInfo: filteredSessionInfo, hsApi, olm}); await this._session.load(); this._sync = new Sync({hsApi, storage: this._storage, session: this._session});