Skip to content

Commit

Permalink
Initial implementation
Browse files Browse the repository at this point in the history
  • Loading branch information
ljharb committed Dec 1, 2019
1 parent 73bdefe commit dbebd3a
Show file tree
Hide file tree
Showing 3 changed files with 117 additions and 0 deletions.
6 changes: 6 additions & 0 deletions .eslintrc
Original file line number Diff line number Diff line change
Expand Up @@ -2,4 +2,10 @@
"root": true,

"extends": "@ljharb",

"rules": {
"max-lines-per-function": 0,
"max-params": 0,
"new-cap": [2, { "capIsNewExceptions": ["GetIntrinsic"] }],
},
}
107 changes: 107 additions & 0 deletions index.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,107 @@
'use strict';

var GetIntrinsic = require('es-abstract/GetIntrinsic');
var callBound = require('es-abstract/helpers/callBound');
var inspect = require('object-inspect');

var $TypeError = GetIntrinsic('%TypeError%');
var $WeakMap = GetIntrinsic('%WeakMap%', true);
var $Map = GetIntrinsic('%Map%', true);
var $push = callBound('Array.prototype.push');

var $weakMapGet = callBound('WeakMap.prototype.get', true);
var $weakMapSet = callBound('WeakMap.prototype.set', true);
var $weakMapHas = callBound('WeakMap.prototype.has', true);
var $mapGet = callBound('Map.prototype.get', true);
var $mapSet = callBound('Map.prototype.set', true);
var $mapHas = callBound('Map.prototype.has', true);
var objectGet = function (objects, key) { // eslint-disable-line consistent-return
for (var i = 0; i < objects.length; i += 1) {
if (objects[i].key === key) {
return objects[i].value;
}
}
};
var objectSet = function (objects, key, value) {
for (var i = 0; i < objects.length; i += 1) {
if (objects[i].key === key) {
objects[i].value = value; // eslint-disable-line no-param-reassign
return;
}
}
$push(objects, {
key: key,
value: value
});
};
var objectHas = function (objects, key) {
for (var i = 0; i < objects.length; i += 1) {
if (objects[i].key === key) {
return true;
}
}
return false;
};

module.exports = function getSideChannel() {
var $wm;
var $m;
var $o;
var channel = {
assert: function (key) {
if (!channel.has(key)) {
throw new $TypeError('Side channel does not contain ' + inspect(key));
}
},
get: function (key) { // eslint-disable-line consistent-return
if ($WeakMap && key && (typeof key === 'object' || typeof key === 'function')) {
if ($wm) {
return $weakMapGet($wm, key);
}
} else if ($Map) {
if ($m) {
return $mapGet($m, key);
}
} else {
if ($o) { // eslint-disable-line no-lonely-if
return objectGet($o, key);
}
}
},
has: function (key) {
if ($WeakMap && key && (typeof key === 'object' || typeof key === 'function')) {
if ($wm) {
return $weakMapHas($wm, key);
}
} else if ($Map) {
if ($m) {
return $mapHas($m, key);
}
} else {
if ($o) { // eslint-disable-line no-lonely-if
return objectHas($o, key);
}
}
return false;
},
set: function (key, value) {
if ($WeakMap && key && (typeof key === 'object' || typeof key === 'function')) {
if (!$wm) {
$wm = new $WeakMap();
}
$weakMapSet($wm, key, value);
} else if ($Map) {
if (!$m) {
$m = new $Map();
}
$mapSet($m, key, value);
} else {
if (!$o) {
$o = [];
}
objectSet($o, key, value);
}
}
};
return channel;
};
4 changes: 4 additions & 0 deletions package.json
Original file line number Diff line number Diff line change
Expand Up @@ -34,5 +34,9 @@
"@ljharb/eslint-config": "^15.0.2",
"eslint": "^6.7.2",
"tape": "^4.11.0"
},
"dependencies": {
"es-abstract": "^1.16.2",
"object-inspect": "^1.7.0"
}
}

0 comments on commit dbebd3a

Please sign in to comment.