diff --git a/keyserver/src/responders/webworker-responders.js b/keyserver/src/responders/webworker-responders.js index 0ed5e9798..ca94a6de4 100644 --- a/keyserver/src/responders/webworker-responders.js +++ b/keyserver/src/responders/webworker-responders.js @@ -1,29 +1,31 @@ // @flow import type { $Request, $Response } from 'express'; import path from 'path'; function webWorkerResponder(req: $Request, res: $Response): void { let workerPath; let headers = { 'Content-Type': 'application/javascript' }; if (req.params.worker === 'notif') { workerPath = 'pushNotif.build.js'; headers = { ...headers, 'Service-Worker-Allowed': '/', }; + } else if (req.params.worker === 'database') { + workerPath = 'database.build.js'; } if (!workerPath) { res.sendStatus(404); return; } const filePath = path.resolve('app_compiled', 'webworkers', workerPath); res.sendFile(filePath, { headers, }); } export { webWorkerResponder }; diff --git a/web/database/worker/db-worker.js b/web/database/worker/db-worker.js new file mode 100644 index 000000000..570f6b411 --- /dev/null +++ b/web/database/worker/db-worker.js @@ -0,0 +1,19 @@ +// @flow + +import { type SharedWorkerMessageEvent } from '../../types/worker-types.js'; + +function connectHandler(event: SharedWorkerMessageEvent) { + if (!event.ports.length) { + return; + } + const port: MessagePort = event.ports[0]; + console.log('Web database worker alive!'); + + port.onmessage = async function (messageEvent: MessageEvent) { + console.log('message from main thread: ', messageEvent.data); + + port.postMessage({ message: 'response from worker' }); + }; +} + +self.addEventListener('connect', connectHandler); diff --git a/web/types/worker-types.js b/web/types/worker-types.js new file mode 100644 index 000000000..56695fb0d --- /dev/null +++ b/web/types/worker-types.js @@ -0,0 +1,6 @@ +// @flow + +export type SharedWorkerMessageEvent = MessageEvent & { + +ports: $ReadOnlyArray, + ... +}; diff --git a/web/webpack.config.cjs b/web/webpack.config.cjs index 3ffa8b99e..516a59d08 100644 --- a/web/webpack.config.cjs +++ b/web/webpack.config.cjs @@ -1,131 +1,132 @@ const CopyPlugin = require('copy-webpack-plugin'); const path = require('path'); const { WebpackManifestPlugin } = require('webpack-manifest-plugin'); const { createProdBrowserConfig, createDevBrowserConfig, createNodeServerRenderingConfig, createWebWorkersConfig, } = require('lib/webpack/shared.cjs'); const babelConfig = require('./babel.config.cjs'); const baseBrowserConfig = { entry: { browser: ['./script.js'], }, output: { filename: 'prod.[contenthash:12].build.js', path: path.join(__dirname, 'dist'), }, resolve: { alias: { '../images': path.resolve('../keyserver/images'), }, fallback: { crypto: false, fs: false, path: false, }, }, }; const baseDevBrowserConfig = { ...baseBrowserConfig, output: { ...baseBrowserConfig.output, filename: 'dev.build.js', pathinfo: true, publicPath: 'http://localhost:8080/', }, devServer: { port: 8080, headers: { 'Access-Control-Allow-Origin': '*' }, allowedHosts: ['all'], host: '0.0.0.0', static: { directory: path.join(__dirname, 'dist'), }, }, plugins: [ new CopyPlugin({ patterns: [ { from: 'node_modules/@matrix-org/olm/olm.wasm', to: path.join(__dirname, 'dist'), }, ], }), ], }; const baseProdBrowserConfig = { ...baseBrowserConfig, plugins: [ new CopyPlugin({ patterns: [ { from: 'node_modules/@matrix-org/olm/olm.wasm', to: path.join(__dirname, 'dist', 'olm.[contenthash:12].wasm'), }, ], }), new WebpackManifestPlugin({ publicPath: '', }), ], }; const baseNodeServerRenderingConfig = { externals: ['react', 'react-dom', 'react-redux'], entry: { keyserver: ['./loading.react.js'], }, output: { filename: 'app.build.cjs', library: 'app', libraryTarget: 'commonjs2', path: path.join(__dirname, 'dist'), }, }; const baseWebWorkersConfig = { plugins: [ new CopyPlugin({ patterns: [ { from: 'node_modules/sql.js/dist/sql-wasm.wasm', to: path.join(__dirname, 'dist'), }, ], }), ], entry: { pushNotif: './push-notif/service-worker.js', + database: './database/worker/db-worker.js', }, output: { filename: '[name].build.js', path: path.join(__dirname, 'dist', 'webworkers'), }, }; module.exports = function (env) { const browserConfig = env.prod ? createProdBrowserConfig(baseProdBrowserConfig, babelConfig) : createDevBrowserConfig(baseDevBrowserConfig, babelConfig); const nodeConfig = createNodeServerRenderingConfig( baseNodeServerRenderingConfig, babelConfig, ); const nodeServerRenderingConfig = { ...nodeConfig, mode: env.prod ? 'production' : 'development', }; const webWorkersConfig = createWebWorkersConfig( env, baseWebWorkersConfig, babelConfig, ); return [browserConfig, nodeServerRenderingConfig, webWorkersConfig]; };