Skip to content

Commit

Permalink
Merge pull request #20 from nats-io/direct-esm
Browse files Browse the repository at this point in the history
[CHANGE] self processing the tweetnacl cjs module rather than use esm.sh as the size differential is huge
  • Loading branch information
aricart committed Jul 14, 2022
2 parents 4ce8f79 + 313d528 commit ebb4e0b
Show file tree
Hide file tree
Showing 7 changed files with 1,331 additions and 23 deletions.
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

0 comments on commit ebb4e0b

Please sign in to comment.