87 lines
		
	
	
		
			2.2 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
		
		
			
		
	
	
			87 lines
		
	
	
		
			2.2 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
|  | "use strict"; | ||
|  | 
 | ||
|  | // Returns "Type(value) is Object" in ES terminology.
 | ||
|  | function isObject(value) { | ||
|  |   return typeof value === "object" && value !== null || typeof value === "function"; | ||
|  | } | ||
|  | 
 | ||
|  | function getReferenceToBytes(bufferSource) { | ||
|  |   // Node.js' Buffer does not allow subclassing for now, so we can get away with a prototype object check for perf.
 | ||
|  |   if (Object.getPrototypeOf(bufferSource) === Buffer.prototype) { | ||
|  |     return bufferSource; | ||
|  |   } | ||
|  |   if (bufferSource instanceof ArrayBuffer) { | ||
|  |     return Buffer.from(bufferSource); | ||
|  |   } | ||
|  |   return Buffer.from(bufferSource.buffer, bufferSource.byteOffset, bufferSource.byteLength); | ||
|  | } | ||
|  | 
 | ||
|  | function getCopyToBytes(bufferSource) { | ||
|  |   return Buffer.from(getReferenceToBytes(bufferSource)); | ||
|  | } | ||
|  | 
 | ||
|  | function mixin(target, source) { | ||
|  |   const keys = Object.getOwnPropertyNames(source); | ||
|  |   for (let i = 0; i < keys.length; ++i) { | ||
|  |     if (keys[i] in target) { | ||
|  |       continue; | ||
|  |     } | ||
|  | 
 | ||
|  |     Object.defineProperty(target, keys[i], Object.getOwnPropertyDescriptor(source, keys[i])); | ||
|  |   } | ||
|  | } | ||
|  | 
 | ||
|  | const wrapperSymbol = Symbol("wrapper"); | ||
|  | const implSymbol = Symbol("impl"); | ||
|  | const sameObjectCaches = Symbol("SameObject caches"); | ||
|  | 
 | ||
|  | function getSameObject(wrapper, prop, creator) { | ||
|  |   if (!wrapper[sameObjectCaches]) { | ||
|  |     wrapper[sameObjectCaches] = Object.create(null); | ||
|  |   } | ||
|  | 
 | ||
|  |   if (prop in wrapper[sameObjectCaches]) { | ||
|  |     return wrapper[sameObjectCaches][prop]; | ||
|  |   } | ||
|  | 
 | ||
|  |   wrapper[sameObjectCaches][prop] = creator(); | ||
|  |   return wrapper[sameObjectCaches][prop]; | ||
|  | } | ||
|  | 
 | ||
|  | function wrapperForImpl(impl) { | ||
|  |   return impl ? impl[wrapperSymbol] : null; | ||
|  | } | ||
|  | 
 | ||
|  | function implForWrapper(wrapper) { | ||
|  |   return wrapper ? wrapper[implSymbol] : null; | ||
|  | } | ||
|  | 
 | ||
|  | function tryWrapperForImpl(impl) { | ||
|  |   const wrapper = wrapperForImpl(impl); | ||
|  |   return wrapper ? wrapper : impl; | ||
|  | } | ||
|  | 
 | ||
|  | function tryImplForWrapper(wrapper) { | ||
|  |   const impl = implForWrapper(wrapper); | ||
|  |   return impl ? impl : wrapper; | ||
|  | } | ||
|  | 
 | ||
|  | const iterInternalSymbol = Symbol("internal"); | ||
|  | const IteratorPrototype = Object.getPrototypeOf(Object.getPrototypeOf([][Symbol.iterator]())); | ||
|  | 
 | ||
|  | module.exports = exports = { | ||
|  |   isObject, | ||
|  |   getReferenceToBytes, | ||
|  |   getCopyToBytes, | ||
|  |   mixin, | ||
|  |   wrapperSymbol, | ||
|  |   implSymbol, | ||
|  |   getSameObject, | ||
|  |   wrapperForImpl, | ||
|  |   implForWrapper, | ||
|  |   tryWrapperForImpl, | ||
|  |   tryImplForWrapper, | ||
|  |   iterInternalSymbol, | ||
|  |   IteratorPrototype | ||
|  | }; |