@gjsify/v8 0.3.21 → 0.4.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/lib/esm/_virtual/_rolldown/runtime.js +1 -0
- package/lib/esm/heap.js +1 -1
- package/lib/esm/index.js +1 -1
- package/lib/esm/serdes.js +1 -1
- package/package.json +39 -36
- package/src/heap.ts +0 -53
- package/src/index.spec.ts +0 -270
- package/src/index.ts +0 -118
- package/src/serdes.ts +0 -609
- package/src/test.mts +0 -3
- package/tsconfig.json +0 -29
- package/tsconfig.tsbuildinfo +0 -1
|
@@ -0,0 +1 @@
|
|
|
1
|
+
var e=Object.defineProperty,__name=(t,n)=>e(t,`name`,{value:n,configurable:!0});export{__name};
|
package/lib/esm/heap.js
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import e from"@girs/glib-2.0";function readProcStatus(){let t=new Map;try{let[n,r]=e.file_get_contents(`/proc/self/status`);if(!n||!r)return t;let i=new TextDecoder().decode(r);for(let e of i.split(`
|
|
1
|
+
import"./_virtual/_rolldown/runtime.js";import e from"@girs/glib-2.0";function readProcStatus(){let t=new Map;try{let[n,r]=e.file_get_contents(`/proc/self/status`);if(!n||!r)return t;let i=new TextDecoder().decode(r);for(let e of i.split(`
|
|
2
2
|
`)){let n=/^(\w+):\s+(\d+)(\s+kB)?/.exec(e);n&&t.set(n[1],parseInt(n[2])*(n[3]?1024:1))}}catch{}return t}function getHeapStatistics(){let e=readProcStatus();return{total_heap_size:e.get(`VmSize`)??0,total_heap_size_executable:0,total_physical_size:e.get(`VmRSS`)??0,total_available_size:0,used_heap_size:e.get(`VmRSS`)??0,heap_size_limit:0,malloced_memory:e.get(`VmData`)??0,peak_malloced_memory:e.get(`VmPeak`)??0,does_zap_garbage:0,number_of_native_contexts:0,number_of_detached_contexts:0,total_global_handles_size:0,used_global_handles_size:0,external_memory:0}}export{getHeapStatistics};
|
package/lib/esm/index.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
import{getHeapStatistics as e}from"./heap.js";import{DefaultDeserializer as t,DefaultSerializer as n,Deserializer as r,Serializer as i}from"./serdes.js";function serialize(e){let t=new n;return t.writeHeader(),t.writeValue(e),t.releaseBuffer()}function deserialize(e){let n=new t(e);return n.readHeader(),n.readValue()}function getHeapSpaceStatistics(){return[]}function getHeapCodeStatistics(){return{code_and_metadata_size:0,bytecode_and_metadata_size:0,external_script_source_size:0,cpu_profiler_metadata_size:0}}function setFlagsFromString(e){}function getHeapSnapshot(e){return null}function writeHeapSnapshot(e){return``}function isStringOneByteRepresentation(e){for(let t=0;t<e.length;t++)if(e.charCodeAt(t)>255)return!1;return!0}var GCProfiler=class{#e=!1;#t=0;start(){this.#e||(this.#e=!0,this.#t=Date.now())}stop(){if(this.#e){this.#e=!1;try{let e=globalThis.imports?.system;typeof e?.gc==`function`&&e.gc()}catch{}return{version:1,startTime:this.#t,endTime:Date.now(),stats:[]}}}[Symbol.dispose](){this.stop()}},SyncCPUProfileHandle=class{stop(){}[Symbol.dispose](){this.stop()}};function startCpuProfile(){return new SyncCPUProfileHandle}var a={getHeapStatistics:e,getHeapSpaceStatistics,getHeapCodeStatistics,setFlagsFromString,getHeapSnapshot,writeHeapSnapshot,serialize,deserialize,isStringOneByteRepresentation,Serializer:i,Deserializer:r,DefaultSerializer:n,DefaultDeserializer:t,GCProfiler,startCpuProfile};export{t as DefaultDeserializer,n as DefaultSerializer,r as Deserializer,GCProfiler,i as Serializer,SyncCPUProfileHandle,a as default,deserialize,getHeapCodeStatistics,getHeapSnapshot,getHeapSpaceStatistics,e as getHeapStatistics,isStringOneByteRepresentation,serialize,setFlagsFromString,startCpuProfile,writeHeapSnapshot};
|
|
1
|
+
import"./_virtual/_rolldown/runtime.js";import{getHeapStatistics as e}from"./heap.js";import{DefaultDeserializer as t,DefaultSerializer as n,Deserializer as r,Serializer as i}from"./serdes.js";function serialize(e){let t=new n;return t.writeHeader(),t.writeValue(e),t.releaseBuffer()}function deserialize(e){let n=new t(e);return n.readHeader(),n.readValue()}function getHeapSpaceStatistics(){return[]}function getHeapCodeStatistics(){return{code_and_metadata_size:0,bytecode_and_metadata_size:0,external_script_source_size:0,cpu_profiler_metadata_size:0}}function setFlagsFromString(e){}function getHeapSnapshot(e){return null}function writeHeapSnapshot(e){return``}function isStringOneByteRepresentation(e){for(let t=0;t<e.length;t++)if(e.charCodeAt(t)>255)return!1;return!0}var GCProfiler=class{#e=!1;#t=0;start(){this.#e||(this.#e=!0,this.#t=Date.now())}stop(){if(this.#e){this.#e=!1;try{let e=globalThis.imports?.system;typeof e?.gc==`function`&&e.gc()}catch{}return{version:1,startTime:this.#t,endTime:Date.now(),stats:[]}}}[Symbol.dispose](){this.stop()}},SyncCPUProfileHandle=class{stop(){}[Symbol.dispose](){this.stop()}};function startCpuProfile(){return new SyncCPUProfileHandle}var a={getHeapStatistics:e,getHeapSpaceStatistics,getHeapCodeStatistics,setFlagsFromString,getHeapSnapshot,writeHeapSnapshot,serialize,deserialize,isStringOneByteRepresentation,Serializer:i,Deserializer:r,DefaultSerializer:n,DefaultDeserializer:t,GCProfiler,startCpuProfile};export{t as DefaultDeserializer,n as DefaultSerializer,r as Deserializer,GCProfiler,i as Serializer,SyncCPUProfileHandle,a as default,deserialize,getHeapCodeStatistics,getHeapSnapshot,getHeapSpaceStatistics,e as getHeapStatistics,isStringOneByteRepresentation,serialize,setFlagsFromString,startCpuProfile,writeHeapSnapshot};
|
package/lib/esm/serdes.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
import{Buffer as e}from"node:buffer";function writeVarint(e,t){for(t>>>=0;t>=128;)e.push(t&127|128),t>>>=7;e.push(t)}function readVarint(e,t){let n=0,r=0,i;do{if(t>=e.length)throw Error(`Unexpected end of buffer reading varint`);i=e[t++],n|=(i&127)<<r,r+=7}while(i&128);return[n>>>0,t]}function zigZagEncode(e){return e>=0?e*2:-e*2-1}function zigZagDecode(e){return e&1?-(e>>>1)-1:e>>>1}function writeFloat64(e,t){let n=new DataView(new ArrayBuffer(8));n.setFloat64(0,t,!0);for(let t=0;t<8;t++)e.push(n.getUint8(t))}function readFloat64(e,t){if(t+8>e.length)throw Error(`ReadDouble() failed`);return[new DataView(e.buffer,e.byteOffset+t,8).getFloat64(0,!0),t+8]}function isOneByte(e){for(let t=0;t<e.length;t++)if(e.charCodeAt(t)>255)return!1;return!0}function typedArrayToIndex(e){let t=Object.prototype.toString.call(e);return t===`[object Int8Array]`?0:t===`[object Uint8Array]`?1:t===`[object Uint8ClampedArray]`?2:t===`[object Int16Array]`?3:t===`[object Uint16Array]`?4:t===`[object Int32Array]`?5:t===`[object Uint32Array]`?6:t===`[object Float32Array]`?7:t===`[object Float64Array]`?8:t===`[object DataView]`?9:t===`[object BigInt64Array]`?11:t===`[object BigUint64Array]`?12:-1}function indexToTypedArray(t){switch(t){case 0:return Int8Array;case 1:return Uint8Array;case 2:return Uint8ClampedArray;case 3:return Int16Array;case 4:return Uint16Array;case 5:return Int32Array;case 6:return Uint32Array;case 7:return Float32Array;case 8:return Float64Array;case 9:return DataView;case 10:return e;case 11:return BigInt64Array;case 12:return BigUint64Array}}var Serializer=class{_bytes=[];_seen=[];_treatAbvAsHostObjects=!1;_getDataCloneError=Error;writeHeader(){this._bytes.push(255),writeVarint(this._bytes,15)}writeValue(t){if(typeof t==`object`&&t){let e=this._seen.indexOf(t);if(e!==-1){this._bytes.push(94),writeVarint(this._bytes,e);return}}if(t===void 0)this._bytes.push(95);else if(t===null)this._bytes.push(48);else if(t===!0)this._bytes.push(84);else if(t===!1)this._bytes.push(70);else if(typeof t==`number`)Number.isInteger(t)&&t>=-(2**31)&&t<=2**32-1?t>=0?(this._bytes.push(85),writeVarint(this._bytes,t)):(this._bytes.push(73),writeVarint(this._bytes,zigZagEncode(t))):(this._bytes.push(78),writeFloat64(this._bytes,t));else if(typeof t==`bigint`)this._writeBigInt(t);else if(typeof t==`string`)this._writeString(t);else if(typeof t==`object`){let n=t;if(t instanceof Date)this._seen.push(n),this._bytes.push(68),writeFloat64(this._bytes,t.getTime());else if(t instanceof RegExp)this._seen.push(n),this._bytes.push(82),this._writeString(t.source),writeVarint(this._bytes,regExpFlagsToInt(t));else if(t instanceof ArrayBuffer){this._seen.push(n);let e=new Uint8Array(t);this._bytes.push(66),writeVarint(this._bytes,e.length);for(let t=0;t<e.length;t++)this._bytes.push(e[t])}else if(this._treatAbvAsHostObjects&&(ArrayBuffer.isView(t)||e.isBuffer(t)))this._seen.push(n),this._bytes.push(92),this._writeHostObject(n);else if(Array.isArray(t)){this._seen.push(n);let e=t;this._bytes.push(65),writeVarint(this._bytes,e.length);for(let t=0;t<e.length;t++)this.writeValue(e[t]);this._bytes.push(36),writeVarint(this._bytes,0),writeVarint(this._bytes,e.length)}else{this._seen.push(n),this._bytes.push(111);let e=Object.keys(n);for(let t of e)this._writeString(t),this.writeValue(n[t]);this._bytes.push(123),writeVarint(this._bytes,e.length)}}else throw new this._getDataCloneError(`${String(t)} could not be cloned.`)}releaseBuffer(){let t=e.from(this._bytes);return this._bytes=[],this._seen=[],t}writeUint32(e){writeVarint(this._bytes,e>>>0)}writeUint64(e,t){writeVarint(this._bytes,e>>>0),writeVarint(this._bytes,t>>>0)}writeDouble(e){writeFloat64(this._bytes,e)}writeRawBytes(e){if(!ArrayBuffer.isView(e))throw TypeError(`source must be a TypedArray or a DataView`);let t=new Uint8Array(e.buffer,e.byteOffset,e.byteLength);for(let e=0;e<t.length;e++)this._bytes.push(t[e])}_writeHostObject(e){throw new this._getDataCloneError(`Unserializable host object: ${Object.prototype.toString.call(e)}`)}_setTreatArrayBufferViewsAsHostObjects(e){this._treatAbvAsHostObjects=e}_writeString(e){if(isOneByte(e)){this._bytes.push(34),writeVarint(this._bytes,e.length);for(let t=0;t<e.length;t++)this._bytes.push(e.charCodeAt(t)&255)}else{let t=new TextEncoder().encode(e);this._bytes.push(99),writeVarint(this._bytes,t.length);for(let e=0;e<t.length;e++)this._bytes.push(t[e])}}_writeBigInt(e){this._bytes.push(90);let t=e<0n,n=t?-e:e,r=[],i=n;for(;i>0n;)r.push(Number(i&4294967295n)),r.push(Number(i>>32n&4294967295n)),i>>=64n;let a=r.length<<1|!!t;writeVarint(this._bytes,a);for(let e of r)this._bytes.push(e&255),this._bytes.push(e>>8&255),this._bytes.push(e>>16&255),this._bytes.push(e>>24&255);r.length}},Deserializer=class{_pos=0;_wireVersion=0;_seen=[];buffer;constructor(t){if(!ArrayBuffer.isView(t)&&!(t instanceof ArrayBuffer))throw TypeError(`buffer must be a TypedArray or a DataView`);t instanceof ArrayBuffer?this.buffer=e.from(t):this.buffer=e.from(t.buffer,t.byteOffset,t.byteLength)}readHeader(){if(this.buffer[this._pos]!==255)throw Error(`ReadHeader() failed`);this._pos++;let[e,t]=readVarint(this.buffer,this._pos);return this._wireVersion=e,this._pos=t,!0}getWireFormatVersion(){return this._wireVersion}readValue(){if(this._pos>=this.buffer.length)throw Error(`Unexpected end of buffer`);let e=this.buffer[this._pos++];switch(e){case 95:return;case 48:return null;case 84:return!0;case 70:return!1;case 73:{let[e,t]=readVarint(this.buffer,this._pos);return this._pos=t,zigZagDecode(e)}case 85:{let[e,t]=readVarint(this.buffer,this._pos);return this._pos=t,e>>>0}case 78:{let[e,t]=readFloat64(this.buffer,this._pos);return this._pos=t,e}case 90:return this._readBigInt();case 34:{let[e,t]=readVarint(this.buffer,this._pos);this._pos=t;let n=``;for(let t=0;t<e;t++)n+=String.fromCharCode(this.buffer[this._pos++]);return n}case 99:{let[e,t]=readVarint(this.buffer,this._pos);this._pos=t;let n=this.buffer.slice(this._pos,this._pos+e);return this._pos+=e,new TextDecoder().decode(n)}case 68:{let[e,t]=readFloat64(this.buffer,this._pos);this._pos=t;let n=new Date(e);return this._seen.push(n),n}case 82:{let e=this.readValue(),[t,n]=readVarint(this.buffer,this._pos);this._pos=n;let r=intToRegExpFlags(t),i=new RegExp(e,r);return this._seen.push(i),i}case 66:{let[e,t]=readVarint(this.buffer,this._pos);this._pos=t;let n=new ArrayBuffer(e),r=new Uint8Array(n);for(let t=0;t<e;t++)r[t]=this.buffer[this._pos++];return this._seen.push(n),n}case 94:{let[e,t]=readVarint(this.buffer,this._pos);if(this._pos=t,e>=this._seen.length)throw Error(`Invalid object reference`);return this._seen[e]}case 65:{let[e,t]=readVarint(this.buffer,this._pos);this._pos=t;let n=Array(e);this._seen.push(n);for(let t=0;t<e;t++)n[t]=this.readValue();if(this.buffer[this._pos]!==36)throw Error(`Expected kEndDenseArray`);this._pos++;let[,r]=readVarint(this.buffer,this._pos);this._pos=r;let[,i]=readVarint(this.buffer,this._pos);return this._pos=i,n}case 111:{let e={};for(this._seen.push(e);this.buffer[this._pos]!==123;){let t=this.readValue();e[t]=this.readValue()}this._pos++;let[,t]=readVarint(this.buffer,this._pos);return this._pos=t,e}case 92:{let e=this._readHostObject();return e!=null&&this._seen.push(e),e}default:throw Error(`Unknown tag 0x${e.toString(16).padStart(2,`0`)} at position ${this._pos-1}`)}}readUint32(){let[e,t]=readVarint(this.buffer,this._pos);return this._pos=t,e>>>0}readUint64(){let[e,t]=readVarint(this.buffer,this._pos),[n,r]=readVarint(this.buffer,t);return this._pos=r,[e>>>0,n>>>0]}readDouble(){let[e,t]=readFloat64(this.buffer,this._pos);return this._pos=t,e}_readRawBytes(e){let t=this._pos;if(this._pos+=e,this._pos>this.buffer.length)throw Error(`Unexpected end of buffer reading raw bytes`);return t}readRawBytes(t){let n=this._readRawBytes(t);return e.from(this.buffer.buffer,this.buffer.byteOffset+n,t)}_readHostObject(){throw Error(`No host object deserializer installed`)}_readBigInt(){let[e,t]=readVarint(this.buffer,this._pos);this._pos=t;let n=(e&1)==1,r=e>>1,i=0n;for(let e=0;e<r;e++){let t=this.buffer[this._pos]|this.buffer[this._pos+1]<<8|this.buffer[this._pos+2]<<16|this.buffer[this._pos+3]<<24;this._pos+=4,i|=BigInt(t>>>0)<<BigInt(e*32)}return n?-i:i}};function regExpFlagsToInt(e){let t=0;return e.global&&(t|=1),e.ignoreCase&&(t|=2),e.multiline&&(t|=4),e.sticky&&(t|=8),e.unicode&&(t|=16),e.dotAll&&(t|=32),e.hasIndices&&(t|=64),e.unicodeSets&&(t|=128),t}function intToRegExpFlags(e){let t=``;return e&1&&(t+=`g`),e&2&&(t+=`i`),e&4&&(t+=`m`),e&8&&(t+=`y`),e&16&&(t+=`u`),e&32&&(t+=`s`),e&64&&(t+=`d`),e&128&&(t+=`v`),t}var DefaultSerializer=class extends Serializer{constructor(){super(),this._setTreatArrayBufferViewsAsHostObjects(!0)}_writeHostObject(t){let n;if(e.isBuffer(t))n=10;else if(n=typedArrayToIndex(t),n===-1)throw new this._getDataCloneError(`Unserializable host object: ${Object.prototype.toString.call(t)}`);this.writeUint32(n),this.writeUint32(t.byteLength),this.writeRawBytes(new Uint8Array(t.buffer,t.byteOffset,t.byteLength))}},DefaultDeserializer=class extends Deserializer{_readHostObject(){let t=this.readUint32(),n=this.readUint32(),r=this._readRawBytes(n);if(t===10){let t=e.allocUnsafe(n);return this.buffer.copy(t,0,this.buffer.byteOffset+r,this.buffer.byteOffset+r+n),t}let i=indexToTypedArray(t);if(!i)throw Error(`Unknown TypedArray type index ${t}`);let a=i.BYTES_PER_ELEMENT??1,o=n/a,s=this.buffer.byteOffset+r;if(s%a===0)return new i(this.buffer.buffer,s,o);let c=e.allocUnsafe(n);return this.buffer.copy(c,0,this.buffer.byteOffset+r,this.buffer.byteOffset+r+n),new i(c.buffer,c.byteOffset,o)}};export{DefaultDeserializer,DefaultSerializer,Deserializer,Serializer};
|
|
1
|
+
import"./_virtual/_rolldown/runtime.js";import{Buffer as e}from"node:buffer";function writeVarint(e,t){for(t>>>=0;t>=128;)e.push(t&127|128),t>>>=7;e.push(t)}function readVarint(e,t){let n=0,r=0,i;do{if(t>=e.length)throw Error(`Unexpected end of buffer reading varint`);i=e[t++],n|=(i&127)<<r,r+=7}while(i&128);return[n>>>0,t]}function zigZagEncode(e){return e>=0?e*2:-e*2-1}function zigZagDecode(e){return e&1?-(e>>>1)-1:e>>>1}function writeFloat64(e,t){let n=new DataView(new ArrayBuffer(8));n.setFloat64(0,t,!0);for(let t=0;t<8;t++)e.push(n.getUint8(t))}function readFloat64(e,t){if(t+8>e.length)throw Error(`ReadDouble() failed`);return[new DataView(e.buffer,e.byteOffset+t,8).getFloat64(0,!0),t+8]}function isOneByte(e){for(let t=0;t<e.length;t++)if(e.charCodeAt(t)>255)return!1;return!0}function typedArrayToIndex(e){let t=Object.prototype.toString.call(e);return t===`[object Int8Array]`?0:t===`[object Uint8Array]`?1:t===`[object Uint8ClampedArray]`?2:t===`[object Int16Array]`?3:t===`[object Uint16Array]`?4:t===`[object Int32Array]`?5:t===`[object Uint32Array]`?6:t===`[object Float32Array]`?7:t===`[object Float64Array]`?8:t===`[object DataView]`?9:t===`[object BigInt64Array]`?11:t===`[object BigUint64Array]`?12:-1}function indexToTypedArray(t){switch(t){case 0:return Int8Array;case 1:return Uint8Array;case 2:return Uint8ClampedArray;case 3:return Int16Array;case 4:return Uint16Array;case 5:return Int32Array;case 6:return Uint32Array;case 7:return Float32Array;case 8:return Float64Array;case 9:return DataView;case 10:return e;case 11:return BigInt64Array;case 12:return BigUint64Array}}var Serializer=class{_bytes=[];_seen=[];_treatAbvAsHostObjects=!1;_getDataCloneError=Error;writeHeader(){this._bytes.push(255),writeVarint(this._bytes,15)}writeValue(t){if(typeof t==`object`&&t){let e=this._seen.indexOf(t);if(e!==-1){this._bytes.push(94),writeVarint(this._bytes,e);return}}if(t===void 0)this._bytes.push(95);else if(t===null)this._bytes.push(48);else if(t===!0)this._bytes.push(84);else if(t===!1)this._bytes.push(70);else if(typeof t==`number`)Number.isInteger(t)&&t>=-(2**31)&&t<=2**32-1?t>=0?(this._bytes.push(85),writeVarint(this._bytes,t)):(this._bytes.push(73),writeVarint(this._bytes,zigZagEncode(t))):(this._bytes.push(78),writeFloat64(this._bytes,t));else if(typeof t==`bigint`)this._writeBigInt(t);else if(typeof t==`string`)this._writeString(t);else if(typeof t==`object`){let n=t;if(t instanceof Date)this._seen.push(n),this._bytes.push(68),writeFloat64(this._bytes,t.getTime());else if(t instanceof RegExp)this._seen.push(n),this._bytes.push(82),this._writeString(t.source),writeVarint(this._bytes,regExpFlagsToInt(t));else if(t instanceof ArrayBuffer){this._seen.push(n);let e=new Uint8Array(t);this._bytes.push(66),writeVarint(this._bytes,e.length);for(let t=0;t<e.length;t++)this._bytes.push(e[t])}else if(this._treatAbvAsHostObjects&&(ArrayBuffer.isView(t)||e.isBuffer(t)))this._seen.push(n),this._bytes.push(92),this._writeHostObject(n);else if(Array.isArray(t)){this._seen.push(n);let e=t;this._bytes.push(65),writeVarint(this._bytes,e.length);for(let t=0;t<e.length;t++)this.writeValue(e[t]);this._bytes.push(36),writeVarint(this._bytes,0),writeVarint(this._bytes,e.length)}else{this._seen.push(n),this._bytes.push(111);let e=Object.keys(n);for(let t of e)this._writeString(t),this.writeValue(n[t]);this._bytes.push(123),writeVarint(this._bytes,e.length)}}else throw new this._getDataCloneError(`${String(t)} could not be cloned.`)}releaseBuffer(){let t=e.from(this._bytes);return this._bytes=[],this._seen=[],t}writeUint32(e){writeVarint(this._bytes,e>>>0)}writeUint64(e,t){writeVarint(this._bytes,e>>>0),writeVarint(this._bytes,t>>>0)}writeDouble(e){writeFloat64(this._bytes,e)}writeRawBytes(e){if(!ArrayBuffer.isView(e))throw TypeError(`source must be a TypedArray or a DataView`);let t=new Uint8Array(e.buffer,e.byteOffset,e.byteLength);for(let e=0;e<t.length;e++)this._bytes.push(t[e])}_writeHostObject(e){throw new this._getDataCloneError(`Unserializable host object: ${Object.prototype.toString.call(e)}`)}_setTreatArrayBufferViewsAsHostObjects(e){this._treatAbvAsHostObjects=e}_writeString(e){if(isOneByte(e)){this._bytes.push(34),writeVarint(this._bytes,e.length);for(let t=0;t<e.length;t++)this._bytes.push(e.charCodeAt(t)&255)}else{let t=new TextEncoder().encode(e);this._bytes.push(99),writeVarint(this._bytes,t.length);for(let e=0;e<t.length;e++)this._bytes.push(t[e])}}_writeBigInt(e){this._bytes.push(90);let t=e<0n,n=t?-e:e,r=[],i=n;for(;i>0n;)r.push(Number(i&4294967295n)),r.push(Number(i>>32n&4294967295n)),i>>=64n;let a=r.length<<1|!!t;writeVarint(this._bytes,a);for(let e of r)this._bytes.push(e&255),this._bytes.push(e>>8&255),this._bytes.push(e>>16&255),this._bytes.push(e>>24&255);r.length}},Deserializer=class{_pos=0;_wireVersion=0;_seen=[];buffer;constructor(t){if(!ArrayBuffer.isView(t)&&!(t instanceof ArrayBuffer))throw TypeError(`buffer must be a TypedArray or a DataView`);t instanceof ArrayBuffer?this.buffer=e.from(t):this.buffer=e.from(t.buffer,t.byteOffset,t.byteLength)}readHeader(){if(this.buffer[this._pos]!==255)throw Error(`ReadHeader() failed`);this._pos++;let[e,t]=readVarint(this.buffer,this._pos);return this._wireVersion=e,this._pos=t,!0}getWireFormatVersion(){return this._wireVersion}readValue(){if(this._pos>=this.buffer.length)throw Error(`Unexpected end of buffer`);let e=this.buffer[this._pos++];switch(e){case 95:return;case 48:return null;case 84:return!0;case 70:return!1;case 73:{let[e,t]=readVarint(this.buffer,this._pos);return this._pos=t,zigZagDecode(e)}case 85:{let[e,t]=readVarint(this.buffer,this._pos);return this._pos=t,e>>>0}case 78:{let[e,t]=readFloat64(this.buffer,this._pos);return this._pos=t,e}case 90:return this._readBigInt();case 34:{let[e,t]=readVarint(this.buffer,this._pos);this._pos=t;let n=``;for(let t=0;t<e;t++)n+=String.fromCharCode(this.buffer[this._pos++]);return n}case 99:{let[e,t]=readVarint(this.buffer,this._pos);this._pos=t;let n=this.buffer.slice(this._pos,this._pos+e);return this._pos+=e,new TextDecoder().decode(n)}case 68:{let[e,t]=readFloat64(this.buffer,this._pos);this._pos=t;let n=new Date(e);return this._seen.push(n),n}case 82:{let e=this.readValue(),[t,n]=readVarint(this.buffer,this._pos);this._pos=n;let r=intToRegExpFlags(t),i=new RegExp(e,r);return this._seen.push(i),i}case 66:{let[e,t]=readVarint(this.buffer,this._pos);this._pos=t;let n=new ArrayBuffer(e),r=new Uint8Array(n);for(let t=0;t<e;t++)r[t]=this.buffer[this._pos++];return this._seen.push(n),n}case 94:{let[e,t]=readVarint(this.buffer,this._pos);if(this._pos=t,e>=this._seen.length)throw Error(`Invalid object reference`);return this._seen[e]}case 65:{let[e,t]=readVarint(this.buffer,this._pos);this._pos=t;let n=Array(e);this._seen.push(n);for(let t=0;t<e;t++)n[t]=this.readValue();if(this.buffer[this._pos]!==36)throw Error(`Expected kEndDenseArray`);this._pos++;let[,r]=readVarint(this.buffer,this._pos);this._pos=r;let[,i]=readVarint(this.buffer,this._pos);return this._pos=i,n}case 111:{let e={};for(this._seen.push(e);this.buffer[this._pos]!==123;){let t=this.readValue();e[t]=this.readValue()}this._pos++;let[,t]=readVarint(this.buffer,this._pos);return this._pos=t,e}case 92:{let e=this._readHostObject();return e!=null&&this._seen.push(e),e}default:throw Error(`Unknown tag 0x${e.toString(16).padStart(2,`0`)} at position ${this._pos-1}`)}}readUint32(){let[e,t]=readVarint(this.buffer,this._pos);return this._pos=t,e>>>0}readUint64(){let[e,t]=readVarint(this.buffer,this._pos),[n,r]=readVarint(this.buffer,t);return this._pos=r,[e>>>0,n>>>0]}readDouble(){let[e,t]=readFloat64(this.buffer,this._pos);return this._pos=t,e}_readRawBytes(e){let t=this._pos;if(this._pos+=e,this._pos>this.buffer.length)throw Error(`Unexpected end of buffer reading raw bytes`);return t}readRawBytes(t){let n=this._readRawBytes(t);return e.from(this.buffer.buffer,this.buffer.byteOffset+n,t)}_readHostObject(){throw Error(`No host object deserializer installed`)}_readBigInt(){let[e,t]=readVarint(this.buffer,this._pos);this._pos=t;let n=(e&1)==1,r=e>>1,i=0n;for(let e=0;e<r;e++){let t=this.buffer[this._pos]|this.buffer[this._pos+1]<<8|this.buffer[this._pos+2]<<16|this.buffer[this._pos+3]<<24;this._pos+=4,i|=BigInt(t>>>0)<<BigInt(e*32)}return n?-i:i}};function regExpFlagsToInt(e){let t=0;return e.global&&(t|=1),e.ignoreCase&&(t|=2),e.multiline&&(t|=4),e.sticky&&(t|=8),e.unicode&&(t|=16),e.dotAll&&(t|=32),e.hasIndices&&(t|=64),e.unicodeSets&&(t|=128),t}function intToRegExpFlags(e){let t=``;return e&1&&(t+=`g`),e&2&&(t+=`i`),e&4&&(t+=`m`),e&8&&(t+=`y`),e&16&&(t+=`u`),e&32&&(t+=`s`),e&64&&(t+=`d`),e&128&&(t+=`v`),t}var DefaultSerializer=class extends Serializer{constructor(){super(),this._setTreatArrayBufferViewsAsHostObjects(!0)}_writeHostObject(t){let n;if(e.isBuffer(t))n=10;else if(n=typedArrayToIndex(t),n===-1)throw new this._getDataCloneError(`Unserializable host object: ${Object.prototype.toString.call(t)}`);this.writeUint32(n),this.writeUint32(t.byteLength),this.writeRawBytes(new Uint8Array(t.buffer,t.byteOffset,t.byteLength))}},DefaultDeserializer=class extends Deserializer{_readHostObject(){let t=this.readUint32(),n=this.readUint32(),r=this._readRawBytes(n);if(t===10){let t=e.allocUnsafe(n);return this.buffer.copy(t,0,this.buffer.byteOffset+r,this.buffer.byteOffset+r+n),t}let i=indexToTypedArray(t);if(!i)throw Error(`Unknown TypedArray type index ${t}`);let a=i.BYTES_PER_ELEMENT??1,o=n/a,s=this.buffer.byteOffset+r;if(s%a===0)return new i(this.buffer.buffer,s,o);let c=e.allocUnsafe(n);return this.buffer.copy(c,0,this.buffer.byteOffset+r,this.buffer.byteOffset+r+n),new i(c.buffer,c.byteOffset,o)}};export{DefaultDeserializer,DefaultSerializer,Deserializer,Serializer};
|
package/package.json
CHANGED
|
@@ -1,38 +1,41 @@
|
|
|
1
1
|
{
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
2
|
+
"name": "@gjsify/v8",
|
|
3
|
+
"version": "0.4.3",
|
|
4
|
+
"description": "Node.js v8 module for Gjs",
|
|
5
|
+
"type": "module",
|
|
6
|
+
"module": "lib/esm/index.js",
|
|
7
|
+
"types": "lib/types/index.d.ts",
|
|
8
|
+
"exports": {
|
|
9
|
+
".": {
|
|
10
|
+
"types": "./lib/types/index.d.ts",
|
|
11
|
+
"default": "./lib/esm/index.js"
|
|
12
|
+
}
|
|
13
|
+
},
|
|
14
|
+
"files": [
|
|
15
|
+
"lib"
|
|
16
|
+
],
|
|
17
|
+
"scripts": {
|
|
18
|
+
"clear": "rm -rf lib tsconfig.tsbuildinfo tsconfig.types.tsbuildinfo test.gjs.mjs test.node.mjs || exit 0",
|
|
19
|
+
"check": "tsc --noEmit",
|
|
20
|
+
"build": "gjsify run build:gjsify && gjsify run build:types",
|
|
21
|
+
"build:gjsify": "gjsify build --library 'src/**/*.{ts,js}' --exclude 'src/**/*.spec.{mts,ts}' 'src/test.{mts,ts}'",
|
|
22
|
+
"build:types": "tsc",
|
|
23
|
+
"build:test": "gjsify run build:test:gjs && gjsify run build:test:node",
|
|
24
|
+
"build:test:gjs": "gjsify build src/test.mts --app gjs --outfile test.gjs.mjs",
|
|
25
|
+
"build:test:node": "gjsify build src/test.mts --app node --outfile test.node.mjs",
|
|
26
|
+
"test": "gjsify run build:gjsify && gjsify run build:test && gjsify run test:node && gjsify run test:gjs",
|
|
27
|
+
"test:gjs": "gjsify run test.gjs.mjs",
|
|
28
|
+
"test:node": "node test.node.mjs"
|
|
29
|
+
},
|
|
30
|
+
"keywords": [
|
|
31
|
+
"gjs",
|
|
32
|
+
"node",
|
|
33
|
+
"v8"
|
|
34
|
+
],
|
|
35
|
+
"devDependencies": {
|
|
36
|
+
"@gjsify/cli": "workspace:^",
|
|
37
|
+
"@gjsify/unit": "workspace:^",
|
|
38
|
+
"@types/node": "^25.6.2",
|
|
39
|
+
"typescript": "^6.0.3"
|
|
12
40
|
}
|
|
13
|
-
|
|
14
|
-
"scripts": {
|
|
15
|
-
"clear": "rm -rf lib tsconfig.tsbuildinfo tsconfig.types.tsbuildinfo test.gjs.mjs test.node.mjs || exit 0",
|
|
16
|
-
"check": "tsc --noEmit",
|
|
17
|
-
"build": "yarn build:gjsify && yarn build:types",
|
|
18
|
-
"build:gjsify": "gjsify build --library 'src/**/*.{ts,js}' --exclude 'src/**/*.spec.{mts,ts}' 'src/test.{mts,ts}'",
|
|
19
|
-
"build:types": "tsc",
|
|
20
|
-
"build:test": "yarn build:test:gjs && yarn build:test:node",
|
|
21
|
-
"build:test:gjs": "gjsify build src/test.mts --app gjs --outfile test.gjs.mjs",
|
|
22
|
-
"build:test:node": "gjsify build src/test.mts --app node --outfile test.node.mjs",
|
|
23
|
-
"test": "yarn build:gjsify && yarn build:test && yarn test:node && yarn test:gjs",
|
|
24
|
-
"test:gjs": "gjsify run test.gjs.mjs",
|
|
25
|
-
"test:node": "node test.node.mjs"
|
|
26
|
-
},
|
|
27
|
-
"keywords": [
|
|
28
|
-
"gjs",
|
|
29
|
-
"node",
|
|
30
|
-
"v8"
|
|
31
|
-
],
|
|
32
|
-
"devDependencies": {
|
|
33
|
-
"@gjsify/cli": "^0.3.21",
|
|
34
|
-
"@gjsify/unit": "^0.3.21",
|
|
35
|
-
"@types/node": "^25.6.2",
|
|
36
|
-
"typescript": "^6.0.3"
|
|
37
|
-
}
|
|
38
|
-
}
|
|
41
|
+
}
|
package/src/heap.ts
DELETED
|
@@ -1,53 +0,0 @@
|
|
|
1
|
-
// Reference: Node.js lib/v8.js (getHeapStatistics)
|
|
2
|
-
// Reimplemented for GJS using /proc/self/status (Linux)
|
|
3
|
-
|
|
4
|
-
import GLib from '@girs/glib-2.0';
|
|
5
|
-
|
|
6
|
-
function readProcStatus(): Map<string, number> {
|
|
7
|
-
const map = new Map<string, number>();
|
|
8
|
-
try {
|
|
9
|
-
const [ok, contents] = GLib.file_get_contents('/proc/self/status');
|
|
10
|
-
if (!ok || !contents) return map;
|
|
11
|
-
const text = new TextDecoder().decode(contents as unknown as Uint8Array);
|
|
12
|
-
for (const line of text.split('\n')) {
|
|
13
|
-
const m = /^(\w+):\s+(\d+)(\s+kB)?/.exec(line);
|
|
14
|
-
if (m) map.set(m[1], parseInt(m[2]) * (m[3] ? 1024 : 1));
|
|
15
|
-
}
|
|
16
|
-
} catch { /* /proc not available on non-Linux */ }
|
|
17
|
-
return map;
|
|
18
|
-
}
|
|
19
|
-
|
|
20
|
-
export function getHeapStatistics(): {
|
|
21
|
-
total_heap_size: number;
|
|
22
|
-
total_heap_size_executable: number;
|
|
23
|
-
total_physical_size: number;
|
|
24
|
-
total_available_size: number;
|
|
25
|
-
used_heap_size: number;
|
|
26
|
-
heap_size_limit: number;
|
|
27
|
-
malloced_memory: number;
|
|
28
|
-
peak_malloced_memory: number;
|
|
29
|
-
does_zap_garbage: number;
|
|
30
|
-
number_of_native_contexts: number;
|
|
31
|
-
number_of_detached_contexts: number;
|
|
32
|
-
total_global_handles_size: number;
|
|
33
|
-
used_global_handles_size: number;
|
|
34
|
-
external_memory: number;
|
|
35
|
-
} {
|
|
36
|
-
const proc = readProcStatus();
|
|
37
|
-
return {
|
|
38
|
-
total_heap_size: proc.get('VmSize') ?? 0,
|
|
39
|
-
total_heap_size_executable: 0,
|
|
40
|
-
total_physical_size: proc.get('VmRSS') ?? 0,
|
|
41
|
-
total_available_size: 0,
|
|
42
|
-
used_heap_size: proc.get('VmRSS') ?? 0,
|
|
43
|
-
heap_size_limit: 0,
|
|
44
|
-
malloced_memory: proc.get('VmData') ?? 0,
|
|
45
|
-
peak_malloced_memory: proc.get('VmPeak') ?? 0,
|
|
46
|
-
does_zap_garbage: 0,
|
|
47
|
-
number_of_native_contexts: 0,
|
|
48
|
-
number_of_detached_contexts: 0,
|
|
49
|
-
total_global_handles_size: 0,
|
|
50
|
-
used_global_handles_size: 0,
|
|
51
|
-
external_memory: 0,
|
|
52
|
-
};
|
|
53
|
-
}
|
package/src/index.spec.ts
DELETED
|
@@ -1,270 +0,0 @@
|
|
|
1
|
-
// Ported from refs/node-test/parallel/test-v8-stats.js,
|
|
2
|
-
// refs/node-test/parallel/test-v8-serdes.js,
|
|
3
|
-
// refs/node-test/parallel/test-v8-deserialize-buffer.js
|
|
4
|
-
// Original: MIT, Node.js contributors.
|
|
5
|
-
// Rewritten for @gjsify/unit — behavior preserved, assertion dialect adapted.
|
|
6
|
-
|
|
7
|
-
import { describe, it, expect } from '@gjsify/unit';
|
|
8
|
-
import {
|
|
9
|
-
getHeapStatistics,
|
|
10
|
-
getHeapCodeStatistics,
|
|
11
|
-
getHeapSpaceStatistics,
|
|
12
|
-
serialize,
|
|
13
|
-
deserialize,
|
|
14
|
-
Serializer,
|
|
15
|
-
Deserializer,
|
|
16
|
-
DefaultSerializer,
|
|
17
|
-
DefaultDeserializer,
|
|
18
|
-
isStringOneByteRepresentation,
|
|
19
|
-
GCProfiler,
|
|
20
|
-
startCpuProfile,
|
|
21
|
-
} from 'node:v8';
|
|
22
|
-
|
|
23
|
-
export default async () => {
|
|
24
|
-
await describe('v8.getHeapStatistics', async () => {
|
|
25
|
-
await it('returns an object with all 14 required fields', async () => {
|
|
26
|
-
const stats = getHeapStatistics();
|
|
27
|
-
const fields = [
|
|
28
|
-
'total_heap_size',
|
|
29
|
-
'total_heap_size_executable',
|
|
30
|
-
'total_physical_size',
|
|
31
|
-
'total_available_size',
|
|
32
|
-
'used_heap_size',
|
|
33
|
-
'heap_size_limit',
|
|
34
|
-
'malloced_memory',
|
|
35
|
-
'peak_malloced_memory',
|
|
36
|
-
'does_zap_garbage',
|
|
37
|
-
'number_of_native_contexts',
|
|
38
|
-
'number_of_detached_contexts',
|
|
39
|
-
'total_global_handles_size',
|
|
40
|
-
'used_global_handles_size',
|
|
41
|
-
'external_memory',
|
|
42
|
-
];
|
|
43
|
-
for (const field of fields) {
|
|
44
|
-
expect(typeof (stats as any)[field]).toBe('number');
|
|
45
|
-
}
|
|
46
|
-
});
|
|
47
|
-
|
|
48
|
-
await it('used_heap_size is a positive number on Linux (via /proc)', async () => {
|
|
49
|
-
const stats = getHeapStatistics();
|
|
50
|
-
expect(stats.used_heap_size).toBeGreaterThan(0);
|
|
51
|
-
});
|
|
52
|
-
});
|
|
53
|
-
|
|
54
|
-
await describe('v8.getHeapCodeStatistics', async () => {
|
|
55
|
-
await it('returns object with 4 numeric fields', async () => {
|
|
56
|
-
const stats = getHeapCodeStatistics() as any;
|
|
57
|
-
expect(typeof stats.code_and_metadata_size).toBe('number');
|
|
58
|
-
expect(typeof stats.bytecode_and_metadata_size).toBe('number');
|
|
59
|
-
expect(typeof stats.external_script_source_size).toBe('number');
|
|
60
|
-
expect(typeof stats.cpu_profiler_metadata_size).toBe('number');
|
|
61
|
-
});
|
|
62
|
-
});
|
|
63
|
-
|
|
64
|
-
await describe('v8.getHeapSpaceStatistics', async () => {
|
|
65
|
-
await it('returns an array', async () => {
|
|
66
|
-
expect(Array.isArray(getHeapSpaceStatistics())).toBe(true);
|
|
67
|
-
});
|
|
68
|
-
});
|
|
69
|
-
|
|
70
|
-
await describe('v8.serialize / v8.deserialize round-trips', async () => {
|
|
71
|
-
await it('null', async () => {
|
|
72
|
-
expect(deserialize(serialize(null))).toBe(null);
|
|
73
|
-
});
|
|
74
|
-
|
|
75
|
-
await it('undefined', async () => {
|
|
76
|
-
expect(deserialize(serialize(undefined))).toBe(undefined);
|
|
77
|
-
});
|
|
78
|
-
|
|
79
|
-
await it('boolean true', async () => {
|
|
80
|
-
expect(deserialize(serialize(true))).toBe(true);
|
|
81
|
-
});
|
|
82
|
-
|
|
83
|
-
await it('boolean false', async () => {
|
|
84
|
-
expect(deserialize(serialize(false))).toBe(false);
|
|
85
|
-
});
|
|
86
|
-
|
|
87
|
-
await it('integer', async () => {
|
|
88
|
-
expect(deserialize(serialize(42))).toBe(42);
|
|
89
|
-
});
|
|
90
|
-
|
|
91
|
-
await it('negative integer', async () => {
|
|
92
|
-
expect(deserialize(serialize(-7))).toBe(-7);
|
|
93
|
-
});
|
|
94
|
-
|
|
95
|
-
await it('float', async () => {
|
|
96
|
-
expect(deserialize(serialize(3.14))).toBe(3.14);
|
|
97
|
-
});
|
|
98
|
-
|
|
99
|
-
await it('ASCII string', async () => {
|
|
100
|
-
expect(deserialize(serialize('hello'))).toBe('hello');
|
|
101
|
-
});
|
|
102
|
-
|
|
103
|
-
await it('Unicode string', async () => {
|
|
104
|
-
expect(deserialize(serialize('héllo wörld'))).toBe('héllo wörld');
|
|
105
|
-
});
|
|
106
|
-
|
|
107
|
-
await it('Date', async () => {
|
|
108
|
-
const d = new Date('2020-01-01T00:00:00Z');
|
|
109
|
-
const result = deserialize(serialize(d)) as Date;
|
|
110
|
-
expect(result instanceof Date).toBe(true);
|
|
111
|
-
expect(result.getTime()).toBe(d.getTime());
|
|
112
|
-
});
|
|
113
|
-
|
|
114
|
-
await it('plain object', async () => {
|
|
115
|
-
const obj = { a: 1, b: 'two', c: true };
|
|
116
|
-
const result = deserialize(serialize(obj)) as typeof obj;
|
|
117
|
-
expect(result.a).toBe(1);
|
|
118
|
-
expect(result.b).toBe('two');
|
|
119
|
-
expect(result.c).toBe(true);
|
|
120
|
-
});
|
|
121
|
-
|
|
122
|
-
await it('array', async () => {
|
|
123
|
-
const arr = [1, 'two', null, true];
|
|
124
|
-
const result = deserialize(serialize(arr)) as typeof arr;
|
|
125
|
-
expect(result[0]).toBe(1);
|
|
126
|
-
expect(result[1]).toBe('two');
|
|
127
|
-
expect(result[2]).toBe(null);
|
|
128
|
-
expect(result[3]).toBe(true);
|
|
129
|
-
});
|
|
130
|
-
|
|
131
|
-
await it('Uint8Array', async () => {
|
|
132
|
-
const ta = new Uint8Array([1, 2, 3]);
|
|
133
|
-
const result = deserialize(serialize(ta)) as Uint8Array;
|
|
134
|
-
expect(result instanceof Uint8Array).toBe(true);
|
|
135
|
-
expect(result[0]).toBe(1);
|
|
136
|
-
expect(result[1]).toBe(2);
|
|
137
|
-
expect(result[2]).toBe(3);
|
|
138
|
-
});
|
|
139
|
-
|
|
140
|
-
await it('Int32Array', async () => {
|
|
141
|
-
const ta = new Int32Array([-1, 0, 1]);
|
|
142
|
-
const result = deserialize(serialize(ta)) as Int32Array;
|
|
143
|
-
expect(result instanceof Int32Array).toBe(true);
|
|
144
|
-
expect(result[0]).toBe(-1);
|
|
145
|
-
expect(result[2]).toBe(1);
|
|
146
|
-
});
|
|
147
|
-
|
|
148
|
-
await it('Float64Array', async () => {
|
|
149
|
-
const ta = new Float64Array([1.1, 2.2, 3.3]);
|
|
150
|
-
const result = deserialize(serialize(ta)) as Float64Array;
|
|
151
|
-
expect(result instanceof Float64Array).toBe(true);
|
|
152
|
-
expect(Math.abs(result[0] - 1.1) < 1e-9).toBe(true);
|
|
153
|
-
});
|
|
154
|
-
|
|
155
|
-
await it('Buffer', async () => {
|
|
156
|
-
const buf = Buffer.from([10, 20, 30]);
|
|
157
|
-
const result = deserialize(serialize(buf)) as Buffer;
|
|
158
|
-
expect(Buffer.isBuffer(result)).toBe(true);
|
|
159
|
-
expect(result[0]).toBe(10);
|
|
160
|
-
expect(result[2]).toBe(30);
|
|
161
|
-
});
|
|
162
|
-
|
|
163
|
-
await it('BigInt', async () => {
|
|
164
|
-
const big = 9007199254740993n;
|
|
165
|
-
expect(deserialize(serialize(big))).toBe(big);
|
|
166
|
-
});
|
|
167
|
-
|
|
168
|
-
await it('negative BigInt', async () => {
|
|
169
|
-
expect(deserialize(serialize(-42n))).toBe(-42n);
|
|
170
|
-
});
|
|
171
|
-
|
|
172
|
-
await it('circular object produces backref on deserialize', async () => {
|
|
173
|
-
const obj: any = { a: 1 };
|
|
174
|
-
obj.self = obj;
|
|
175
|
-
const result = deserialize(serialize(obj)) as any;
|
|
176
|
-
expect(result.a).toBe(1);
|
|
177
|
-
expect(result.self).toBe(result);
|
|
178
|
-
});
|
|
179
|
-
});
|
|
180
|
-
|
|
181
|
-
await describe('v8.Serializer / Deserializer classes', async () => {
|
|
182
|
-
await it('Serializer can write header + value → Buffer', async () => {
|
|
183
|
-
const s = new Serializer();
|
|
184
|
-
s.writeHeader();
|
|
185
|
-
s.writeValue(42);
|
|
186
|
-
const buf = s.releaseBuffer();
|
|
187
|
-
expect(Buffer.isBuffer(buf)).toBe(true);
|
|
188
|
-
expect(buf.length).toBeGreaterThan(0);
|
|
189
|
-
});
|
|
190
|
-
|
|
191
|
-
await it('Deserializer can read header + value', async () => {
|
|
192
|
-
const s = new Serializer();
|
|
193
|
-
s.writeHeader();
|
|
194
|
-
s.writeValue('test');
|
|
195
|
-
const buf = s.releaseBuffer();
|
|
196
|
-
|
|
197
|
-
const d = new Deserializer(buf);
|
|
198
|
-
d.readHeader();
|
|
199
|
-
expect(d.readValue()).toBe('test');
|
|
200
|
-
});
|
|
201
|
-
|
|
202
|
-
await it('getWireFormatVersion returns 15', async () => {
|
|
203
|
-
const s = new Serializer();
|
|
204
|
-
s.writeHeader();
|
|
205
|
-
s.writeValue(null);
|
|
206
|
-
const buf = s.releaseBuffer();
|
|
207
|
-
const d = new Deserializer(buf);
|
|
208
|
-
d.readHeader();
|
|
209
|
-
expect(d.getWireFormatVersion()).toBe(15);
|
|
210
|
-
});
|
|
211
|
-
});
|
|
212
|
-
|
|
213
|
-
await describe('v8.DefaultSerializer / DefaultDeserializer', async () => {
|
|
214
|
-
await it('TypedArray host-object round-trip', async () => {
|
|
215
|
-
const original = new Uint32Array([100, 200, 300]);
|
|
216
|
-
const s = new DefaultSerializer();
|
|
217
|
-
s.writeHeader();
|
|
218
|
-
s.writeValue(original);
|
|
219
|
-
const buf = s.releaseBuffer();
|
|
220
|
-
|
|
221
|
-
const d = new DefaultDeserializer(buf);
|
|
222
|
-
d.readHeader();
|
|
223
|
-
const result = d.readValue() as Uint32Array;
|
|
224
|
-
expect(result instanceof Uint32Array).toBe(true);
|
|
225
|
-
expect(result[0]).toBe(100);
|
|
226
|
-
expect(result[1]).toBe(200);
|
|
227
|
-
expect(result[2]).toBe(300);
|
|
228
|
-
});
|
|
229
|
-
});
|
|
230
|
-
|
|
231
|
-
await describe('v8.isStringOneByteRepresentation', async () => {
|
|
232
|
-
await it('ASCII string returns true', async () => {
|
|
233
|
-
expect(isStringOneByteRepresentation('hello')).toBe(true);
|
|
234
|
-
});
|
|
235
|
-
|
|
236
|
-
await it('string with ü (>255 codepoint) returns false', async () => {
|
|
237
|
-
// ü = U+00FC (fits in Latin-1), 日 = U+65E5 (does not)
|
|
238
|
-
expect(isStringOneByteRepresentation('日本語')).toBe(false);
|
|
239
|
-
});
|
|
240
|
-
|
|
241
|
-
await it('empty string returns true', async () => {
|
|
242
|
-
expect(isStringOneByteRepresentation('')).toBe(true);
|
|
243
|
-
});
|
|
244
|
-
});
|
|
245
|
-
|
|
246
|
-
await describe('v8.GCProfiler', async () => {
|
|
247
|
-
await it('start/stop returns defined object with version and timing', async () => {
|
|
248
|
-
const profiler = new GCProfiler();
|
|
249
|
-
profiler.start();
|
|
250
|
-
const stats = profiler.stop() as any;
|
|
251
|
-
expect(stats).toBeDefined();
|
|
252
|
-
expect(stats.version).toBe(1);
|
|
253
|
-
expect(typeof stats.startTime).toBe('number');
|
|
254
|
-
expect(typeof stats.endTime).toBe('number');
|
|
255
|
-
});
|
|
256
|
-
|
|
257
|
-
await it('stop without start returns undefined', async () => {
|
|
258
|
-
const profiler = new GCProfiler();
|
|
259
|
-
expect(profiler.stop()).toBe(undefined);
|
|
260
|
-
});
|
|
261
|
-
});
|
|
262
|
-
|
|
263
|
-
await describe('v8.startCpuProfile', async () => {
|
|
264
|
-
await it('returns an object with a stop() method that does not throw', async () => {
|
|
265
|
-
const handle = startCpuProfile();
|
|
266
|
-
expect(typeof handle.stop).toBe('function');
|
|
267
|
-
expect(() => handle.stop()).not.toThrow();
|
|
268
|
-
});
|
|
269
|
-
});
|
|
270
|
-
};
|
package/src/index.ts
DELETED
|
@@ -1,118 +0,0 @@
|
|
|
1
|
-
// Reference: Node.js lib/v8.js
|
|
2
|
-
// Reimplemented for GJS — heap stats via /proc/self/status, serialization via V8 wire format
|
|
3
|
-
|
|
4
|
-
import { getHeapStatistics } from './heap.js';
|
|
5
|
-
import {
|
|
6
|
-
Serializer, Deserializer, DefaultSerializer, DefaultDeserializer,
|
|
7
|
-
} from './serdes.js';
|
|
8
|
-
|
|
9
|
-
export { getHeapStatistics };
|
|
10
|
-
export { Serializer, Deserializer, DefaultSerializer, DefaultDeserializer };
|
|
11
|
-
|
|
12
|
-
export function serialize(value: unknown): Buffer {
|
|
13
|
-
const ser = new DefaultSerializer();
|
|
14
|
-
ser.writeHeader();
|
|
15
|
-
ser.writeValue(value);
|
|
16
|
-
return ser.releaseBuffer();
|
|
17
|
-
}
|
|
18
|
-
|
|
19
|
-
export function deserialize(buffer: NodeJS.ArrayBufferView | ArrayBuffer): unknown {
|
|
20
|
-
const des = new DefaultDeserializer(buffer);
|
|
21
|
-
des.readHeader();
|
|
22
|
-
return des.readValue();
|
|
23
|
-
}
|
|
24
|
-
|
|
25
|
-
// ─── Stubs — no GJS equivalent ────────────────────────────────────────────────
|
|
26
|
-
|
|
27
|
-
export interface HeapSpaceInfo {
|
|
28
|
-
space_name: string;
|
|
29
|
-
space_size: number;
|
|
30
|
-
space_used_size: number;
|
|
31
|
-
space_available_size: number;
|
|
32
|
-
physical_space_size: number;
|
|
33
|
-
}
|
|
34
|
-
|
|
35
|
-
export function getHeapSpaceStatistics(): HeapSpaceInfo[] { return []; }
|
|
36
|
-
|
|
37
|
-
export function getHeapCodeStatistics(): {
|
|
38
|
-
code_and_metadata_size: number;
|
|
39
|
-
bytecode_and_metadata_size: number;
|
|
40
|
-
external_script_source_size: number;
|
|
41
|
-
cpu_profiler_metadata_size: number;
|
|
42
|
-
} {
|
|
43
|
-
return {
|
|
44
|
-
code_and_metadata_size: 0,
|
|
45
|
-
bytecode_and_metadata_size: 0,
|
|
46
|
-
external_script_source_size: 0,
|
|
47
|
-
cpu_profiler_metadata_size: 0,
|
|
48
|
-
};
|
|
49
|
-
}
|
|
50
|
-
|
|
51
|
-
export function setFlagsFromString(_flags: string): void {}
|
|
52
|
-
|
|
53
|
-
export function getHeapSnapshot(_options?: object): null { return null; }
|
|
54
|
-
|
|
55
|
-
export function writeHeapSnapshot(_filename?: string): string { return ''; }
|
|
56
|
-
|
|
57
|
-
export function isStringOneByteRepresentation(content: string): boolean {
|
|
58
|
-
for (let i = 0; i < content.length; i++) {
|
|
59
|
-
if (content.charCodeAt(i) > 255) return false;
|
|
60
|
-
}
|
|
61
|
-
return true;
|
|
62
|
-
}
|
|
63
|
-
|
|
64
|
-
// ─── GCProfiler ───────────────────────────────────────────────────────────────
|
|
65
|
-
|
|
66
|
-
export class GCProfiler {
|
|
67
|
-
#running = false;
|
|
68
|
-
#startTime = 0;
|
|
69
|
-
|
|
70
|
-
start(): void {
|
|
71
|
-
if (this.#running) return;
|
|
72
|
-
this.#running = true;
|
|
73
|
-
this.#startTime = Date.now();
|
|
74
|
-
}
|
|
75
|
-
|
|
76
|
-
stop(): { version: number; startTime: number; endTime: number; stats: never[] } | undefined {
|
|
77
|
-
if (!this.#running) return undefined;
|
|
78
|
-
this.#running = false;
|
|
79
|
-
try {
|
|
80
|
-
const system = (globalThis as any).imports?.system;
|
|
81
|
-
if (typeof system?.gc === 'function') system.gc();
|
|
82
|
-
} catch { /* ignore */ }
|
|
83
|
-
return { version: 1, startTime: this.#startTime, endTime: Date.now(), stats: [] };
|
|
84
|
-
}
|
|
85
|
-
|
|
86
|
-
[Symbol.dispose](): void { this.stop(); }
|
|
87
|
-
}
|
|
88
|
-
|
|
89
|
-
// ─── SyncCPUProfileHandle / startCpuProfile ───────────────────────────────────
|
|
90
|
-
|
|
91
|
-
export class SyncCPUProfileHandle {
|
|
92
|
-
stop(): undefined { return undefined; }
|
|
93
|
-
[Symbol.dispose](): void { this.stop(); }
|
|
94
|
-
}
|
|
95
|
-
|
|
96
|
-
export function startCpuProfile(): SyncCPUProfileHandle {
|
|
97
|
-
return new SyncCPUProfileHandle();
|
|
98
|
-
}
|
|
99
|
-
|
|
100
|
-
// ─── default export ───────────────────────────────────────────────────────────
|
|
101
|
-
|
|
102
|
-
export default {
|
|
103
|
-
getHeapStatistics,
|
|
104
|
-
getHeapSpaceStatistics,
|
|
105
|
-
getHeapCodeStatistics,
|
|
106
|
-
setFlagsFromString,
|
|
107
|
-
getHeapSnapshot,
|
|
108
|
-
writeHeapSnapshot,
|
|
109
|
-
serialize,
|
|
110
|
-
deserialize,
|
|
111
|
-
isStringOneByteRepresentation,
|
|
112
|
-
Serializer,
|
|
113
|
-
Deserializer,
|
|
114
|
-
DefaultSerializer,
|
|
115
|
-
DefaultDeserializer,
|
|
116
|
-
GCProfiler,
|
|
117
|
-
startCpuProfile,
|
|
118
|
-
};
|