on master help sign in
worker: refactor to use comlink plugin
80a2bcdtomholford
src/lib/walletgen.js → src/lib/walletgen.tsrenamed+12−15
@@ -1,9 +1,10 @@
1import ob from 'urbit-ob';
1import ob from 'urbit-ob';
2import kg from 'urbit-key-generation';
2import kg from 'urbit-key-generation';
3+// @ts-expect-error no types available for more-entropy
3import * as more from 'more-entropy';
4import * as more from 'more-entropy';
4import { chunk, flatMap, zipWith } from 'lodash';
5import { chunk, flatMap, zipWith } from 'lodash';
5−import { wrap } from 'comlink';
6import { shas } from 'lib/networkCode';
6import { shas } from 'lib/networkCode';
7+import { walletgenWorker } from 'worker/';
7
8
8import {
9import {
9 MIN_STAR,
10 MIN_STAR,
@@ -16,13 +17,9 @@ import {
16} from './constants';
17} from './constants';
17import { stripHexPrefix } from './utils/address';
18import { stripHexPrefix } from './utils/address';
18
19
19−const WalletGenerator = wrap(
20− new Worker('src/worker/worker.ts', { type: 'module' })
21−);
22−
23const SEED_LENGTH_BYTES = SEED_ENTROPY_BITS / 8;
20const SEED_LENGTH_BYTES = SEED_ENTROPY_BITS / 8;
24
21
25−const getTicketBitSize = point =>
22+const getTicketBitSize = (point: number) =>
26 point < MIN_STAR
23 point < MIN_STAR
27 ? GALAXY_ENTROPY_BITS
24 ? GALAXY_ENTROPY_BITS
28 : point < MIN_PLANET
25 : point < MIN_PLANET
@@ -30,7 +27,7 @@ const getTicketBitSize = point =>
30 : PLANET_ENTROPY_BITS;
27 : PLANET_ENTROPY_BITS;
31
28
32// returns a promise for a ticket string
29// returns a promise for a ticket string
33−export const makeTicket = point => {
30+export const makeTicket = (point: number): Promise<string> => {
34 const bits = getTicketBitSize(point);
31 const bits = getTicketBitSize(point);
35
32
36 const bytes = bits / 8;
33 const bytes = bits / 8;
@@ -39,7 +36,7 @@ export const makeTicket = point => {
39
36
40 const gen = new more.Generator();
37 const gen = new more.Generator();
41
38
42− return new Promise((resolve, reject) => {
39+ return new Promise<string>((resolve, reject) => {
43 gen.generate(bits, result => {
40 gen.generate(bits, result => {
44 const chunked = chunk(result, 2);
41 const chunked = chunk(result, 2);
45 const desired = chunked.slice(0, bytes); // only take required entropy
42 const desired = chunked.slice(0, bytes); // only take required entropy
@@ -53,7 +50,7 @@ export const makeTicket = point => {
53 });
50 });
54};
51};
55
52
56−export const makeDeterministicTicket = (point, seed) => {
53+export const makeDeterministicTicket = (point: number, seed: string) => {
57 const bits = getTicketBitSize(point);
54 const bits = getTicketBitSize(point);
58
55
59 const bytes = bits / 8;
56 const bytes = bits / 8;
@@ -71,7 +68,7 @@ export const makeDeterministicTicket = (point, seed) => {
71};
68};
72
69
73// return a wallet object
70// 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) => {
75 const config = {
72 const config = {
76 ticket: ticket,
73 ticket: ticket,
77 seedSize: SEED_LENGTH_BYTES,
74 seedSize: SEED_LENGTH_BYTES,
@@ -88,7 +85,7 @@ export const generateWallet = async (point, ticket, boot, revision = 0) => {
88 return new Promise(async (resolve, reject) => {
85 return new Promise(async (resolve, reject) => {
89 // Use a web worker to process the data
86 // Use a web worker to process the data
90 try {
87 try {
91− const processed = await WalletGenerator.generateWallet(JSON.stringify(config));
88+ const processed = await walletgenWorker.generate(JSON.stringify(config));
92 resolve(processed);
89 resolve(processed);
93 } catch (error) {
90 } catch (error) {
94 reject(error);
91 reject(error);
@@ -96,23 +93,23 @@ export const generateWallet = async (point, ticket, boot, revision = 0) => {
96 });
93 });
97};
94};
98
95
99−export const generateOwnershipWallet = async (ship, ticket) => {
96+export const generateOwnershipWallet = async (ship: number, ticket: string) => {
100 return kg.generateOwnershipWallet({ ship, ticket });
97 return kg.generateOwnershipWallet({ ship, ticket });
101};
98};
102
99
103// temporary wallets need to be derivable from just the ticket,
100// temporary wallets need to be derivable from just the ticket,
104// so we always use ~zod as the wallet point.
101// so we always use ~zod as the wallet point.
105−export const generateTemporaryOwnershipWallet = ticket =>
102+export const generateTemporaryOwnershipWallet = (ticket: string) =>
106 generateOwnershipWallet(ZOD, ticket);
103 generateOwnershipWallet(ZOD, ticket);
107
104
108−export const generateTemporaryTicketAndWallet = async point => {
105+export const generateTemporaryTicketAndWallet = async (point: number) => {
109 const ticket = await makeTicket(point);
106 const ticket = await makeTicket(point);
110 const owner = await generateOwnershipWallet(ZOD, ticket);
107 const owner = await generateOwnershipWallet(ZOD, ticket);
111
108
112 return { ticket, owner };
109 return { ticket, owner };
113};
110};
114
111
115−export const generateTemporaryDeterministicWallet = async (point, seed) => {
112+export const generateTemporaryDeterministicWallet = async (point: number, seed: string) => {
116 const ticket = makeDeterministicTicket(point, seed);
113 const ticket = makeDeterministicTicket(point, seed);
117 const owner = await generateOwnershipWallet(ZOD, ticket);
114 const owner = await generateOwnershipWallet(ZOD, ticket);
118
115
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";
1+import { generateWallet } from 'urbit-key-generation';
2−import { WalletGenerator } from './WalletGenerator';
3
2
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 @@
15 "isolatedModules": true,
15 "isolatedModules": true,
16 "noEmit": true,
16 "noEmit": true,
17 "jsx": "react-jsx",
17 "jsx": "react-jsx",
18− "types": ["vite/client", "@testing-library/jest-dom"],
18+ "types": ["vite/client", "vite-plugin-comlink/client", "@testing-library/jest-dom"],
19 "paths": {
19 "paths": {
20 "@/*": ["./src/*"]
20 "@/*": ["./src/*"]
21 }
21 }
vite.config.ts+10−4
@@ -14,10 +14,9 @@ export default defineConfig(({ mode }) => {
14 port: 3000,
14 port: 3000,
15 https: true,
15 https: true,
16 },
16 },
17− plugins: [basicSsl(), comlink(), svgr(), react(),],
17+ plugins: [comlink(), basicSsl(), svgr(), react(),],
18 resolve: {
18 resolve: {
19 alias: [
19 alias: [
20− { find: 'buffer', replacement: 'buffer' },
21 { find: 'process', replacement: 'process/browser' },
20 { find: 'process', replacement: 'process/browser' },
22 { find: 'stream', replacement: 'stream-browserify' },
21 { find: 'stream', replacement: 'stream-browserify' },
23 { find: 'https', replacement: 'agent-base' },
22 { find: 'https', replacement: 'agent-base' },
@@ -36,15 +35,22 @@ export default defineConfig(({ mode }) => {
36 },
35 },
37 worker: {
36 worker: {
38 plugins: [
37 plugins: [
39− comlink()
38+ comlink(),
39+ inject({ Buffer: ['buffer', 'Buffer'] }),
40− ]
40+ ],
41 },
41 },
42 build: Object.assign({
42 build: Object.assign({
43 outDir: 'build',
43 outDir: 'build',
44+ commonJsOptions: {
45+ esmExternals: ['urbit-key-generation'],
46+ include: ['urbit-key-generation'],
47+ requireReturnsDefault: 'auto',
48+ }
44 },
49 },
45 mode === 'development' ? { global: {} } : {}
50 mode === 'development' ? { global: {} } : {}
46 ),
51 ),
47 optimizeDeps: {
52 optimizeDeps: {
53+ include: ['urbit-key-generation'],
48 esbuildOptions: {
54 esbuildOptions: {
49 define: {
55 define: {
50 global: 'globalThis',
56 global: 'globalThis',
window.d.ts+1−1
@@ -1,4 +1,4 @@
1−import Buffer from 'buffer';
1+import Buffer from 'buffer/';
2
2
3declare global {
3declare global {
4 interface Window {
4 interface Window {