summaryrefslogtreecommitdiff
path: root/lib/internal/vm/module.js
diff options
context:
space:
mode:
Diffstat (limited to 'lib/internal/vm/module.js')
-rw-r--r--lib/internal/vm/module.js250
1 files changed, 0 insertions, 250 deletions
diff --git a/lib/internal/vm/module.js b/lib/internal/vm/module.js
deleted file mode 100644
index a799cf2c34..0000000000
--- a/lib/internal/vm/module.js
+++ /dev/null
@@ -1,250 +0,0 @@
-'use strict';
-
-const { internalBinding } = require('internal/bootstrap/loaders');
-const { URL } = require('internal/url');
-const { isContext } = process.binding('contextify');
-const {
- ERR_INVALID_ARG_TYPE,
- ERR_VM_MODULE_ALREADY_LINKED,
- ERR_VM_MODULE_DIFFERENT_CONTEXT,
- ERR_VM_MODULE_LINKING_ERRORED,
- ERR_VM_MODULE_NOT_LINKED,
- ERR_VM_MODULE_NOT_MODULE,
- ERR_VM_MODULE_STATUS
-} = require('internal/errors').codes;
-const {
- getConstructorOf,
- customInspectSymbol,
- emitExperimentalWarning
-} = require('internal/util');
-const { SafePromise } = require('internal/safe_globals');
-const { validateInt32, validateUint32 } = require('internal/validators');
-
-const {
- ModuleWrap,
- kUninstantiated,
- kInstantiating,
- kInstantiated,
- kEvaluating,
- kEvaluated,
- kErrored,
-} = internalBinding('module_wrap');
-
-const STATUS_MAP = {
- [kUninstantiated]: 'uninstantiated',
- [kInstantiating]: 'instantiating',
- [kInstantiated]: 'instantiated',
- [kEvaluating]: 'evaluating',
- [kEvaluated]: 'evaluated',
- [kErrored]: 'errored',
-};
-
-let globalModuleId = 0;
-const perContextModuleId = new WeakMap();
-const wrapMap = new WeakMap();
-const dependencyCacheMap = new WeakMap();
-const linkingStatusMap = new WeakMap();
-// vm.Module -> function
-const initImportMetaMap = new WeakMap();
-// ModuleWrap -> vm.Module
-const wrapToModuleMap = new WeakMap();
-const defaultModuleName = 'vm:module';
-
-class Module {
- constructor(src, options = {}) {
- emitExperimentalWarning('vm.Module');
-
- if (typeof src !== 'string')
- throw new ERR_INVALID_ARG_TYPE('src', 'string', src);
- if (typeof options !== 'object' || options === null)
- throw new ERR_INVALID_ARG_TYPE('options', 'Object', options);
-
- const {
- context,
- lineOffset = 0,
- columnOffset = 0,
- initializeImportMeta
- } = options;
-
- if (context !== undefined) {
- if (typeof context !== 'object' || context === null) {
- throw new ERR_INVALID_ARG_TYPE('options.context', 'Object', context);
- }
- if (!isContext(context)) {
- throw new ERR_INVALID_ARG_TYPE('options.context', 'vm.Context',
- context);
- }
- }
-
- let { url } = options;
- if (url !== undefined) {
- if (typeof url !== 'string') {
- throw new ERR_INVALID_ARG_TYPE('options.url', 'string', url);
- }
- url = new URL(url).href;
- } else if (context === undefined) {
- url = `${defaultModuleName}(${globalModuleId++})`;
- } else if (perContextModuleId.has(context)) {
- const curId = perContextModuleId.get(context);
- url = `${defaultModuleName}(${curId})`;
- perContextModuleId.set(context, curId + 1);
- } else {
- url = `${defaultModuleName}(0)`;
- perContextModuleId.set(context, 1);
- }
-
- validateInt32(lineOffset, 'options.lineOffset');
- validateInt32(columnOffset, 'options.columnOffset');
-
- if (initializeImportMeta !== undefined) {
- if (typeof initializeImportMeta === 'function') {
- initImportMetaMap.set(this, initializeImportMeta);
- } else {
- throw new ERR_INVALID_ARG_TYPE(
- 'options.initializeImportMeta', 'function', initializeImportMeta);
- }
- }
-
- const wrap = new ModuleWrap(src, url, context, lineOffset, columnOffset);
- wrapMap.set(this, wrap);
- linkingStatusMap.set(this, 'unlinked');
- wrapToModuleMap.set(wrap, this);
-
- Object.defineProperties(this, {
- url: { value: url, enumerable: true },
- context: { value: context, enumerable: true },
- });
- }
-
- get linkingStatus() {
- return linkingStatusMap.get(this);
- }
-
- get status() {
- return STATUS_MAP[wrapMap.get(this).getStatus()];
- }
-
- get namespace() {
- const wrap = wrapMap.get(this);
- if (wrap.getStatus() < kInstantiated)
- throw new ERR_VM_MODULE_STATUS(
- 'must not be uninstantiated or instantiating'
- );
- return wrap.namespace();
- }
-
- get dependencySpecifiers() {
- let deps = dependencyCacheMap.get(this);
- if (deps !== undefined)
- return deps;
-
- deps = wrapMap.get(this).getStaticDependencySpecifiers();
- Object.freeze(deps);
- dependencyCacheMap.set(this, deps);
- return deps;
- }
-
- get error() {
- const wrap = wrapMap.get(this);
- if (wrap.getStatus() !== kErrored)
- throw new ERR_VM_MODULE_STATUS('must be errored');
- return wrap.getError();
- }
-
- async link(linker) {
- if (typeof linker !== 'function')
- throw new ERR_INVALID_ARG_TYPE('linker', 'function', linker);
- if (linkingStatusMap.get(this) !== 'unlinked')
- throw new ERR_VM_MODULE_ALREADY_LINKED();
- const wrap = wrapMap.get(this);
- if (wrap.getStatus() !== kUninstantiated)
- throw new ERR_VM_MODULE_STATUS('must be uninstantiated');
-
- linkingStatusMap.set(this, 'linking');
-
- const promises = wrap.link(async (specifier) => {
- const m = await linker(specifier, this);
- if (!m || !wrapMap.has(m))
- throw new ERR_VM_MODULE_NOT_MODULE();
- if (m.context !== this.context)
- throw new ERR_VM_MODULE_DIFFERENT_CONTEXT();
- const childLinkingStatus = linkingStatusMap.get(m);
- if (childLinkingStatus === 'errored')
- throw new ERR_VM_MODULE_LINKING_ERRORED();
- if (childLinkingStatus === 'unlinked')
- await m.link(linker);
- return wrapMap.get(m);
- });
-
- try {
- if (promises !== undefined)
- await SafePromise.all(promises);
- linkingStatusMap.set(this, 'linked');
- } catch (err) {
- linkingStatusMap.set(this, 'errored');
- throw err;
- }
- }
-
- instantiate() {
- const wrap = wrapMap.get(this);
- const status = wrap.getStatus();
- if (status === kInstantiating || status === kEvaluating)
- throw new ERR_VM_MODULE_STATUS('must not be instantiating or evaluating');
- if (linkingStatusMap.get(this) !== 'linked')
- throw new ERR_VM_MODULE_NOT_LINKED();
- wrap.instantiate();
- }
-
- async evaluate(options = {}) {
- if (typeof options !== 'object' || options === null) {
- throw new ERR_INVALID_ARG_TYPE('options', 'Object', options);
- }
-
- let timeout = options.timeout;
- if (timeout === undefined) {
- timeout = -1;
- } else {
- validateUint32(timeout, 'options.timeout', true);
- }
-
- const { breakOnSigint = false } = options;
- if (typeof breakOnSigint !== 'boolean') {
- throw new ERR_INVALID_ARG_TYPE('options.breakOnSigint', 'boolean',
- breakOnSigint);
- }
-
- const wrap = wrapMap.get(this);
- const status = wrap.getStatus();
- if (status !== kInstantiated &&
- status !== kEvaluated &&
- status !== kErrored) {
- throw new ERR_VM_MODULE_STATUS(
- 'must be one of instantiated, evaluated, and errored'
- );
- }
- const result = wrap.evaluate(timeout, breakOnSigint);
- return { result, __proto__: null };
- }
-
- [customInspectSymbol](depth, options) {
- let ctor = getConstructorOf(this);
- ctor = ctor === null ? Module : ctor;
-
- if (typeof depth === 'number' && depth < 0)
- return options.stylize(`[${ctor.name}]`, 'special');
-
- const o = Object.create({ constructor: ctor });
- o.status = this.status;
- o.linkingStatus = this.linkingStatus;
- o.url = this.url;
- o.context = this.context;
- return require('util').inspect(o, options);
- }
-}
-
-module.exports = {
- Module,
- initImportMetaMap,
- wrapToModuleMap
-};