on master help sign in
worker: refactor to use comlink plugin

TODO: figure out why it's not working on deployment

commit80a2bcd418e1aa463cfa4b2359a819dcb96477f1 authortomholford <tomholford@users.noreply.github.com> dateTue 25 Oct 2022, 10:55 (4 years ago) parent7634ae3
7 files changed+38−37
src/lib/walletgen.js → src/lib/walletgen.ts+12−15 src/worker/WalletGenerator.ts−13 src/worker/index.ts+6 src/worker/worker.ts+8−3 tsconfig.json+1−1 vite.config.ts+10−4 window.d.ts+1−1
src/lib/walletgen.js → src/lib/walletgen.tsrenamed+12−15
@@ -1,9 +1,10 @@
11import ob from 'urbit-ob';
22import kg from 'urbit-key-generation';
3+// @ts-expect-error no types available for more-entropy
34import * as more from 'more-entropy';
45import { chunk, flatMap, zipWith } from 'lodash';
5−import { wrap } from 'comlink';
66import { shas } from 'lib/networkCode';
7+import { walletgenWorker } from 'worker/';
78
89import {
910 MIN_STAR,
@@ -16,13 +17,9 @@ import {
1617} from './constants';
1718import { stripHexPrefix } from './utils/address';
1819
19−const WalletGenerator = wrap(
20− new Worker('src/worker/worker.ts', { type: 'module' })
21−);
22−
2320const SEED_LENGTH_BYTES = SEED_ENTROPY_BITS / 8;
2421
25−const getTicketBitSize = point =>
22+const getTicketBitSize = (point: number) =>
2623 point < MIN_STAR
2724 ? GALAXY_ENTROPY_BITS
2825 : point < MIN_PLANET
@@ -30,7 +27,7 @@ const getTicketBitSize = point =>
3027 : PLANET_ENTROPY_BITS;
3128
3229// returns a promise for a ticket string
33−export const makeTicket = point => {
30+export const makeTicket = (point: number): Promise<string> => {
3431 const bits = getTicketBitSize(point);
3532
3633 const bytes = bits / 8;
@@ -39,7 +36,7 @@ export const makeTicket = point => {
3936
4037 const gen = new more.Generator();
4138
42− return new Promise((resolve, reject) => {
39+ return new Promise<string>((resolve, reject) => {
4340 gen.generate(bits, result => {
4441 const chunked = chunk(result, 2);
4542 const desired = chunked.slice(0, bytes); // only take required entropy
@@ -53,7 +50,7 @@ export const makeTicket = point => {
5350 });
5451};
5552
56−export const makeDeterministicTicket = (point, seed) => {
53+export const makeDeterministicTicket = (point: number, seed: string) => {
5754 const bits = getTicketBitSize(point);
5855
5956 const bytes = bits / 8;
@@ -71,7 +68,7 @@ export const makeDeterministicTicket = (point, seed) => {
7168};
7269
7370// return a wallet object
74−export const generateWallet = async (point, ticket, boot, revision = 0) => {
71+export const generateWallet = async (point: number, ticket: string, boot: boolean, revision = 0) => {
7572 const config = {
7673 ticket: ticket,
7774 seedSize: SEED_LENGTH_BYTES,
@@ -88,7 +85,7 @@ export const generateWallet = async (point, ticket, boot, revision = 0) => {
8885 return new Promise(async (resolve, reject) => {
8986 // Use a web worker to process the data
9087 try {
91− const processed = await WalletGenerator.generateWallet(JSON.stringify(config));
88+ const processed = await walletgenWorker.generate(JSON.stringify(config));
9289 resolve(processed);
9390 } catch (error) {
9491 reject(error);
@@ -96,23 +93,23 @@ export const generateWallet = async (point, ticket, boot, revision = 0) => {
9693 });
9794};
9895
99−export const generateOwnershipWallet = async (ship, ticket) => {
96+export const generateOwnershipWallet = async (ship: number, ticket: string) => {
10097 return kg.generateOwnershipWallet({ ship, ticket });
10198};
10299
103100// temporary wallets need to be derivable from just the ticket,
104101// so we always use ~zod as the wallet point.
105−export const generateTemporaryOwnershipWallet = ticket =>
102+export const generateTemporaryOwnershipWallet = (ticket: string) =>
106103 generateOwnershipWallet(ZOD, ticket);
107104
108−export const generateTemporaryTicketAndWallet = async point => {
105+export const generateTemporaryTicketAndWallet = async (point: number) => {
109106 const ticket = await makeTicket(point);
110107 const owner = await generateOwnershipWallet(ZOD, ticket);
111108
112109 return { ticket, owner };
113110};
114111
115−export const generateTemporaryDeterministicWallet = async (point, seed) => {
112+export const generateTemporaryDeterministicWallet = async (point: number, seed: string) => {
116113 const ticket = makeDeterministicTicket(point, seed);
117114 const owner = await generateOwnershipWallet(ZOD, ticket);
118115
src/worker/WalletGenerator.tsdeleted−13
@@ -1,13 +0,0 @@
1−import kg from 'urbit-key-generation';
2−
3−export const WalletGenerator = {
4− async generateWallet(data: string): Promise<UrbitWallet> {
5− // Process the data without stalling the UI
6− const config = JSON.parse(data);
7− const wallet = await kg.generateWallet(config);
8−
9− return wallet;
10− },
11−}
12−
13−export default WalletGenerator;
src/worker/index.tsnew file+6
@@ -0,0 +1,6 @@
1+import { Buffer } from 'buffer/';
2+self.Buffer = Buffer;
3+
4+export const walletgenWorker = new ComlinkWorker<typeof import('./worker')>(
5+ new URL('./worker.ts', import.meta.url)
6+)
src/worker/worker.ts+8−3
@@ -1,4 +1,9 @@
1−import { expose } from "comlink";
2−import { WalletGenerator } from './WalletGenerator';
1+import { generateWallet } from 'urbit-key-generation';
32
4−expose(WalletGenerator);
3+export const generate = async (data: string): Promise<UrbitWallet> => {
4+ // Process the data without stalling the UI
5+ const config = JSON.parse(data);
6+ const wallet = await generateWallet(config);
7+
8+ return wallet;
9+};
tsconfig.json+1−1
@@ -15,7 +15,7 @@
1515 "isolatedModules": true,
1616 "noEmit": true,
1717 "jsx": "react-jsx",
18− "types": ["vite/client", "@testing-library/jest-dom"],
18+ "types": ["vite/client", "vite-plugin-comlink/client", "@testing-library/jest-dom"],
1919 "paths": {
2020 "@/*": ["./src/*"]
2121 }
vite.config.ts+10−4
@@ -14,10 +14,9 @@ export default defineConfig(({ mode }) => {
1414 port: 3000,
1515 https: true,
1616 },
17− plugins: [basicSsl(), comlink(), svgr(), react(),],
17+ plugins: [comlink(), basicSsl(), svgr(), react(),],
1818 resolve: {
1919 alias: [
20− { find: 'buffer', replacement: 'buffer' },
2120 { find: 'process', replacement: 'process/browser' },
2221 { find: 'stream', replacement: 'stream-browserify' },
2322 { find: 'https', replacement: 'agent-base' },
@@ -36,15 +35,22 @@ export default defineConfig(({ mode }) => {
3635 },
3736 worker: {
3837 plugins: [
39− comlink()
40− ]
38+ comlink(),
39+ inject({ Buffer: ['buffer', 'Buffer'] }),
40+ ],
4141 },
4242 build: Object.assign({
4343 outDir: 'build',
44+ commonJsOptions: {
45+ esmExternals: ['urbit-key-generation'],
46+ include: ['urbit-key-generation'],
47+ requireReturnsDefault: 'auto',
48+ }
4449 },
4550 mode === 'development' ? { global: {} } : {}
4651 ),
4752 optimizeDeps: {
53+ include: ['urbit-key-generation'],
4854 esbuildOptions: {
4955 define: {
5056 global: 'globalThis',
window.d.ts+1−1
@@ -1,4 +1,4 @@
1−import Buffer from 'buffer';
1+import Buffer from 'buffer/';
22
33declare global {
44 interface Window {