Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[CHANGE] self processing the tweetnacl cjs module rather than use esm.sh as the size differential is huge #20

Merged
merged 2 commits into from
Jul 14, 2022
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
52 changes: 37 additions & 15 deletions bin/tweetnacl-esm.ts
Original file line number Diff line number Diff line change
@@ -1,21 +1,43 @@
// this scripts parses the version of tweetnacl referenced
// and uses the https://esm.sh service to convert it to an
// esm module which we download from fastly and cache locally

// this scripts parses the version of tweetnacl library
// copies some of the source files from the library
// while attribution of its origin, shims if necessary,
// and reworking it to allow running it in different
// runtimes
import data from "../package.json" assert { type: "json" };
const version = data.dependencies["tweetnacl"];

async function get(u: string): Promise<string> {
const r = await fetch(u);
if (!r.ok) {
return Promise.reject(new Error(`error fetching ${u}`));
}
return await r.text();
}
async function copyFromModulesDir(
from: string,
preamble = "",
tail = "",
): Promise<void> {
const head = `// this source from node_modules/tweetnacl@${version}/${from}\n
// deno-lint-ignore-file
// deno-fmt-ignore-file

const version = data.dependencies["tweetnacl"];
const url = `https://esm.sh/tweetnacl@${version}?target=es2022`;
const code = await get(url);
await Deno.writeTextFile(`${Deno.cwd()}/modules/esm/tweetnacl.js`, code, {create: true});
`;

let src = await Deno.readTextFile(
`${Deno.cwd()}/node_modules/tweetnacl/${from}`,
);

src = src.replaceAll("self", "globalThis");

await Deno.writeTextFile(
`${Deno.cwd()}/modules/esm/${from}`,
head + preamble + src + tail,
{
create: true,
},
);
}

await copyFromModulesDir(
"nacl.js",
"",
`
//added by nkeys.js export it
export const nacl = globalThis.nacl;
`,
);
await copyFromModulesDir("nacl.d.ts");
2 changes: 1 addition & 1 deletion modules/esm/deps.ts
Original file line number Diff line number Diff line change
Expand Up @@ -26,7 +26,7 @@
// OTHER DEALINGS IN THE SOFTWARE.
//
// For more information, please refer to <http://unlicense.org>
import nacl from "./tweetnacl.js";
import { nacl } from "./nacl.js";

import type { Ed25519Helper } from "../../src/helper.ts";

Expand Down
103 changes: 103 additions & 0 deletions modules/esm/nacl.d.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,103 @@
// this source from node_modules/tweetnacl@1.0.3/nacl.d.ts

// deno-lint-ignore-file
// deno-fmt-ignore-file

// Type definitions for TweetNaCl.js

export as namespace nacl;

declare var nacl: nacl;
export = nacl;

declare namespace nacl {
export interface BoxKeyPair {
publicKey: Uint8Array;
secretKey: Uint8Array;
}

export interface SignKeyPair {
publicKey: Uint8Array;
secretKey: Uint8Array;
}

export interface secretbox {
(msg: Uint8Array, nonce: Uint8Array, key: Uint8Array): Uint8Array;
open(box: Uint8Array, nonce: Uint8Array, key: Uint8Array): Uint8Array | null;
readonly keyLength: number;
readonly nonceLength: number;
readonly overheadLength: number;
}

export interface scalarMult {
(n: Uint8Array, p: Uint8Array): Uint8Array;
base(n: Uint8Array): Uint8Array;
readonly scalarLength: number;
readonly groupElementLength: number;
}

namespace boxProps {
export interface open {
(msg: Uint8Array, nonce: Uint8Array, publicKey: Uint8Array, secretKey: Uint8Array): Uint8Array | null;
after(box: Uint8Array, nonce: Uint8Array, key: Uint8Array): Uint8Array | null;
}

export interface keyPair {
(): BoxKeyPair;
fromSecretKey(secretKey: Uint8Array): BoxKeyPair;
}
}

export interface box {
(msg: Uint8Array, nonce: Uint8Array, publicKey: Uint8Array, secretKey: Uint8Array): Uint8Array;
before(publicKey: Uint8Array, secretKey: Uint8Array): Uint8Array;
after(msg: Uint8Array, nonce: Uint8Array, key: Uint8Array): Uint8Array;
open: boxProps.open;
keyPair: boxProps.keyPair;
readonly publicKeyLength: number;
readonly secretKeyLength: number;
readonly sharedKeyLength: number;
readonly nonceLength: number;
readonly overheadLength: number;
}

namespace signProps {
export interface detached {
(msg: Uint8Array, secretKey: Uint8Array): Uint8Array;
verify(msg: Uint8Array, sig: Uint8Array, publicKey: Uint8Array): boolean;
}

export interface keyPair {
(): SignKeyPair;
fromSecretKey(secretKey: Uint8Array): SignKeyPair;
fromSeed(secretKey: Uint8Array): SignKeyPair;
}
}

export interface sign {
(msg: Uint8Array, secretKey: Uint8Array): Uint8Array;
open(signedMsg: Uint8Array, publicKey: Uint8Array): Uint8Array | null;
detached: signProps.detached;
keyPair: signProps.keyPair;
readonly publicKeyLength: number;
readonly secretKeyLength: number;
readonly seedLength: number;
readonly signatureLength: number;
}

export interface hash {
(msg: Uint8Array): Uint8Array;
readonly hashLength: number;
}
}

declare interface nacl {
randomBytes(n: number): Uint8Array;
secretbox: nacl.secretbox;
scalarMult: nacl.scalarMult;
box: nacl.box;
sign: nacl.sign;
hash: nacl.hash;
verify(x: Uint8Array, y: Uint8Array): boolean;
setPRNG(fn: (x: Uint8Array, n: number) => void): void;
}
Loading