index.js
 1  'use strict';
 2  
 3  var $TypeError = require('es-errors/type');
 4  var inspect = require('object-inspect');
 5  var getSideChannelList = require('side-channel-list');
 6  var getSideChannelMap = require('side-channel-map');
 7  var getSideChannelWeakMap = require('side-channel-weakmap');
 8  
 9  var makeChannel = getSideChannelWeakMap || getSideChannelMap || getSideChannelList;
10  
11  /** @type {import('.')} */
12  module.exports = function getSideChannel() {
13  	/** @typedef {ReturnType<typeof getSideChannel>} Channel */
14  
15  	/** @type {Channel | undefined} */ var $channelData;
16  
17  	/** @type {Channel} */
18  	var channel = {
19  		assert: function (key) {
20  			if (!channel.has(key)) {
21  				throw new $TypeError('Side channel does not contain ' + inspect(key));
22  			}
23  		},
24  		'delete': function (key) {
25  			return !!$channelData && $channelData['delete'](key);
26  		},
27  		get: function (key) {
28  			return $channelData && $channelData.get(key);
29  		},
30  		has: function (key) {
31  			return !!$channelData && $channelData.has(key);
32  		},
33  		set: function (key, value) {
34  			if (!$channelData) {
35  				$channelData = makeChannel();
36  			}
37  
38  			$channelData.set(key, value);
39  		}
40  	};
41  	// @ts-expect-error TODO: figure out why this is erroring
42  	return channel;
43  };