Skip to content

Commit

Permalink
feat(compartment-mapper): Add Node.js power adapter
Browse files Browse the repository at this point in the history
  • Loading branch information
kriskowal committed Jun 11, 2021
1 parent a9ce302 commit fd16355
Show file tree
Hide file tree
Showing 5 changed files with 75 additions and 0 deletions.
7 changes: 7 additions & 0 deletions packages/compartment-mapper/NEWS.md
@@ -1,5 +1,12 @@
User-visible changes to the compartment mapper:

# Next release

- Adds an `"@endo/compartment-mapper/node-powers.js"` entry point utility
module that exports `makeNodeReadPowers` and `makeNodeWritePowers` that adapt
the Node.js `fs` module to the promise and URL oriented interfaces expected
by compartment mapper functions.

# 0.3.0 (2021-06-01)

- Reenables CommonJS support with a fast lexer and without a dependency on
Expand Down
1 change: 1 addition & 0 deletions packages/compartment-mapper/node-powers.js
@@ -0,0 +1 @@
export { makeNodeReadPowers, makeNodeWritePowers } from './src/node-powers.js';
1 change: 1 addition & 0 deletions packages/compartment-mapper/package.json
Expand Up @@ -27,6 +27,7 @@
"./archive.js": "./archive.js",
"./import-archive.js": "./import-archive.js",
"./bundle.js": "./bundle.js",
"./node-powers.js": "./node-powers.js",
"./package.json": "./package.json"
},
"scripts": {
Expand Down
49 changes: 49 additions & 0 deletions packages/compartment-mapper/src/node-powers.js
@@ -0,0 +1,49 @@
// @ts-check

/**
* @param {typeof import('fs')} fs
* @returns {ReadPowers}
*/
export const makeNodeReadPowers = fs => {
/**
* @param {string} location
*/
const read = async location =>
fs.promises.readFile(new URL(location).pathname);

/**
* @param {string} location
*/
const canonical = async location => {
try {
if (location.endsWith('/')) {
const realPath = await fs.promises.realpath(
new URL(location).pathname.replace(/\/$/, ''),
);
return new URL(`${realPath}/`, location).toString();
} else {
const realPath = await fs.promises.realpath(new URL(location).pathname);
return new URL(realPath, location).toString();
}
} catch {
return location;
}
};

return { read, canonical };
};

/**
* @param {typeof import('fs')} fs
* @returns {WritePowers}
*/
export const makeNodeWritePowers = fs => {
/**
* @param {string} location
* @param {Uint8Array} data
*/
const write = async (location, data) =>
fs.promises.writeFile(new URL(location).pathname, data);

return { write };
};
17 changes: 17 additions & 0 deletions packages/compartment-mapper/src/types.js
Expand Up @@ -94,6 +94,12 @@
* @returns {Promise<Uint8Array>} bytes
*/

/**
* @callback CanonicalFn
* @param {string} location
* @returns {Promise<string>} canonical location
*/

/**
* @typedef {Object} Application
* @property {ExecuteFn} import
Expand All @@ -110,6 +116,17 @@
* @returns {Promise<Uint8Array>}
*/

/**
* @typedef {Object} ReadPowers
* @property {ReadFn} read
* @property {CanonicalFn} canonical
*/

/**
* @typedef {Object} WritePowers
* @property {WriteFn} write
*/

// /////////////////////////////////////////////////////////////////////////////

// Shared machinery for assembling applications:
Expand Down

0 comments on commit fd16355

Please sign in to comment.