Skip to content
Open
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
15 changes: 15 additions & 0 deletions Makefile
Original file line number Diff line number Diff line change
Expand Up @@ -22,6 +22,8 @@ all: pack
@echo =================
@ls -l $(MODULES_SUMO_DIR)/

esm: $(MODULES_DIR)/libsodium.esm.js $(MODULES_DIR)/libsodium-esm-wrappers.js
@echo + Building standard ESM distribution

standard: $(MODULES_DIR)/libsodium.js $(MODULES_DIR)/libsodium-wrappers.js
@echo + Building standard distribution
Expand Down Expand Up @@ -49,11 +51,21 @@ $(MODULES_DIR)/libsodium-wrappers.js: wrapper/build-wrappers.js wrapper/build-do
mkdir -p $(MODULES_DIR)
$(NODE) wrapper/build-wrappers.js libsodium API.md $(MODULES_DIR)/libsodium-wrappers.js

$(MODULES_DIR)/libsodium-esm-wrappers.js: wrapper/build-wrappers.js wrapper/build-doc.js wrapper/wrap-esm-template.js
@echo +++ Building standard/libsodium-esm-wrappers.js
mkdir -p $(MODULES_DIR)
$(NODE) wrapper/build-wrappers.js libsodium API.md $(MODULES_DIR)/libsodium-esm-wrappers.js --esm

$(MODULES_SUMO_DIR)/libsodium-wrappers.js: wrapper/build-wrappers.js wrapper/build-doc.js wrapper/wrap-template.js
@echo +++ Building sumo/libsodium-wrappers.js
mkdir -p $(MODULES_SUMO_DIR)
$(NODE) wrapper/build-wrappers.js libsodium-sumo API_sumo.md $(MODULES_SUMO_DIR)/libsodium-wrappers.js

$(MODULES_DIR)/libsodium.esm.js: wrapper/libsodium-pre.js wrapper/libsodium-post.js $(MODULES_DIR)/libsodium-esm-wrappers.js $(LIBSODIUM_JS_DIR)/lib/libsodium.js
@echo +++ Building standard/libsodium ESM
mkdir -p $(MODULES_DIR)
cp $(LIBSODIUM_JS_DIR)/lib/libsodium.esm.js $(MODULES_DIR)/libsodium.esm.js

$(MODULES_DIR)/libsodium.js: wrapper/libsodium-pre.js wrapper/libsodium-post.js $(MODULES_DIR)/libsodium-wrappers.js $(LIBSODIUM_JS_DIR)/lib/libsodium.js
@echo +++ Building standard/libsodium
mkdir -p $(MODULES_DIR)
Expand All @@ -78,6 +90,9 @@ $(LIBSODIUM_DIR)/test/default/browser/sodium_core.html: $(LIBSODIUM_DIR)/configu
$(LIBSODIUM_JS_DIR)/lib/libsodium.js: $(LIBSODIUM_DIR)/configure
cd $(LIBSODIUM_DIR) && env CPPFLAGS="-DFAVOR_PERFORMANCE" ./dist-build/emscripten.sh --standard

$(LIBSODIUM_JS_DIR)/lib/libsodium.esm.js: $(LIBSODIUM_DIR)/configure
cd $(LIBSODIUM_DIR) && env CPPFLAGS="-DFAVOR_PERFORMANCE" ./dist-build/emscripten.sh --standard

$(LIBSODIUM_JS_SUMO_DIR)/lib/libsodium.js: $(LIBSODIUM_DIR)/configure
cd $(LIBSODIUM_DIR) && env CPPFLAGS="-DFAVOR_PERFORMANCE" ./dist-build/emscripten.sh --sumo

Expand Down
7,889 changes: 7,889 additions & 0 deletions dist/modules/libsodium-esm-wrappers.js

Large diffs are not rendered by default.

16 changes: 16 additions & 0 deletions dist/modules/libsodium.esm.js

Large diffs are not rendered by default.

58 changes: 51 additions & 7 deletions wrapper/build-wrappers.js
Original file line number Diff line number Diff line change
Expand Up @@ -4,15 +4,16 @@ var docBuilder = require("./build-doc");

//Parse arguments
const argv = process.argv;
if (argv.length != 5) {
if (argv.length < 5) {
console.error(
"Usage: build-wrappers.js <libsodium module name> <API.md path> <wrappers path>"
"Usage: build-wrappers.js <libsodium module name> <API.md path> <wrappers path> [--esm]"
);
process.exit(1);
}
const libsodiumModuleName = argv[2],
apiPath = argv[3],
wrappersPath = argv[4];
wrappersPath = argv[4],
esm = argv[5] === '--esm';

//Loading preset macros
var macros = {};
Expand All @@ -30,7 +31,14 @@ for (var i = 0; i < macrosFiles.length; i++) {
macros[macroName] = macroCode;
}

var templateCode = fs.readFileSync(path.join(__dirname, "wrap-template.js"), {
var utilsCode = fs.readFileSync(path.join(__dirname, "wrap-utils.js"), {
encoding: "utf8"
});
if (esm) {
utilsCode = utilsCode.replace(/\nfunction/g, "\nexport function");
}

var templateCode = fs.readFileSync(path.join(__dirname, esm ? "wrap-esm-template.js" : "wrap-template.js"), {
encoding: "utf8"
});

Expand Down Expand Up @@ -62,8 +70,14 @@ for (var i = 0; i < symbolsFiles.length; i++) {
for (var i = 0; i < symbols.length; i++) {
buildSymbol(symbols[i]);
}
exportFunctions(symbols);
exportConstants(loadConstants());
if (!esm) {
exportFunctions(symbols);
}
if (esm) {
exportConstantsESM(loadConstants());
} else {
exportConstants(loadConstants());
}
finalizeWrapper();

function exportFunctions(symbols) {
Expand All @@ -82,6 +96,30 @@ function exportFunctions(symbols) {
exportsCode += "}\n";
}

function exportConstantsESM(constSymbols) {
var keys = [];
for (var i = 0; i < constSymbols.length; i++) {
if (constSymbols[i].type === "uint") {
keys.push(constSymbols[i].name);
}
}
for (var i = 0; i < keys.length; i++) {
const key = keys[i];
exportsCode += `export const ${key} = libsodium._${key.toLowerCase()}?.();\n`;
}

keys = [];
for (i = 0; i < constSymbols.length; i++) {
if (constSymbols[i].type === "string") {
keys.push(constSymbols[i].name);
}
}
for (var i = 0; i < keys.length; i++) {
const key = keys[i];
exportsCode += `export const ${key} = libsodium.UTF8ToString(libsodium._${key.toLowerCase()}?.());\n`;
}
}

function exportConstants(constSymbols) {
var keys = [];
for (var i = 0; i < constSymbols.length; i++) {
Expand Down Expand Up @@ -114,6 +152,9 @@ function buildSymbol(symbolDescription) {
if (symbolDescription.type == "function") {
var targetName = "libsodium._" + symbolDescription.name;
var funcCode = "function " + symbolDescription.name + "(";
if (esm) {
funcCode = "export " + funcCode;
}
var funcBody = "";
//Adding parameters array in function's interface, their conversions in the function's body
var paramsArray = [];
Expand Down Expand Up @@ -242,8 +283,11 @@ function applyMacro(macroCode, symbols, substitutes) {
}

function finalizeWrapper() {
var subs = esm
? [utilsCode, functionsCode, exportsCode, libsodiumModuleName]
: [injectTabs(utilsCode, 2), injectTabs(functionsCode, 2), injectTabs(exportsCode, 3), libsodiumModuleName];
scriptBuf = applyMacro(
scriptBuf, ["/*{{wraps_here}}*/", "/*{{exports_here}}*/", "/*{{libsodium}}*/"], [injectTabs(functionsCode, 2), injectTabs(exportsCode, 3), libsodiumModuleName]
scriptBuf, ["/*{{utils_here}}*/", "/*{{wraps_here}}*/", "/*{{exports_here}}*/", "/*{{libsodium}}*/"], subs
);
fs.writeFileSync(wrappersPath, scriptBuf);
fs.writeFileSync(apiPath, docBuilder.getResultDoc());
Expand Down
34 changes: 34 additions & 0 deletions wrapper/wrap-esm-template.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,34 @@
"use strict";

import initSodiumESM from "./libsodium.esm.js";

const output_format = "uint8array";

export const libsodium = await initSodiumESM();

/* Initialize. */
if (libsodium._sodium_init() !== 0) {
throw new Error("libsodium was not correctly initialized.");
}

/*{{exports_here}}*/

/*{{utils_here}}*/

/*{{wraps_here}}*/

/* Test to make sure everything works. */
try {
var message = new Uint8Array([98, 97, 108, 108, 115]);
var nonce = randombytes_buf(crypto_secretbox_NONCEBYTES);
var key = randombytes_buf(crypto_secretbox_KEYBYTES);
var encrypted = crypto_secretbox_easy(message, nonce, key);
var decrypted = crypto_secretbox_open_easy(encrypted, nonce, key);

if (!memcmp(message, decrypted)) {
throw new Error("Init test failed");
}
}
catch (err) {
throw new Error("Failed to load" + err)
}
Loading