44 lines
		
	
	
		
			1.2 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
			
		
		
	
	
			44 lines
		
	
	
		
			1.2 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
| 'use strict';
 | |
| 
 | |
| var $TypeError = require('es-errors/type');
 | |
| var inspect = require('object-inspect');
 | |
| var getSideChannelList = require('side-channel-list');
 | |
| var getSideChannelMap = require('side-channel-map');
 | |
| var getSideChannelWeakMap = require('side-channel-weakmap');
 | |
| 
 | |
| var makeChannel = getSideChannelWeakMap || getSideChannelMap || getSideChannelList;
 | |
| 
 | |
| /** @type {import('.')} */
 | |
| module.exports = function getSideChannel() {
 | |
| 	/** @typedef {ReturnType<typeof getSideChannel>} Channel */
 | |
| 
 | |
| 	/** @type {Channel | undefined} */ var $channelData;
 | |
| 
 | |
| 	/** @type {Channel} */
 | |
| 	var channel = {
 | |
| 		assert: function (key) {
 | |
| 			if (!channel.has(key)) {
 | |
| 				throw new $TypeError('Side channel does not contain ' + inspect(key));
 | |
| 			}
 | |
| 		},
 | |
| 		'delete': function (key) {
 | |
| 			return !!$channelData && $channelData['delete'](key);
 | |
| 		},
 | |
| 		get: function (key) {
 | |
| 			return $channelData && $channelData.get(key);
 | |
| 		},
 | |
| 		has: function (key) {
 | |
| 			return !!$channelData && $channelData.has(key);
 | |
| 		},
 | |
| 		set: function (key, value) {
 | |
| 			if (!$channelData) {
 | |
| 				$channelData = makeChannel();
 | |
| 			}
 | |
| 
 | |
| 			$channelData.set(key, value);
 | |
| 		}
 | |
| 	};
 | |
| 	// @ts-expect-error TODO: figure out why this is erroring
 | |
| 	return channel;
 | |
| };
 |