buffer-backed-object
Advanced tools
Comparing version
@@ -345,1 +345,71 @@ import { expect, test } from "vitest"; | ||
}); | ||
test("NestedArrayOfBufferBackedObjects test raw bufferview", function () { | ||
const BBOVec3 = BBO.NestedBufferBackedObject({ | ||
x: BBO.Float32(), | ||
y: BBO.Float32(), | ||
z: BBO.Float32(), | ||
}); | ||
const structDesc = { | ||
ambient: BBOVec3, | ||
lightCount: BBO.Float32(), | ||
lights: BBO.NestedArrayOfBufferBackedObjects(1, { | ||
position: BBOVec3, | ||
range: BBO.Float32(), | ||
color: BBOVec3, | ||
intensity: BBO.Float32(), | ||
}), | ||
}; | ||
const buffer = new ArrayBuffer(BBO.structSize(structDesc)); | ||
const view = BBO.BufferBackedObject(buffer, structDesc); | ||
view.ambient.x = 1; | ||
view.ambient.y = 2; | ||
view.ambient.z = 3; | ||
view.lightCount = 4; | ||
view.lights.forEach(light => { | ||
light.position.x = 5; | ||
light.position.y = 6; | ||
light.position.z = 7; | ||
light.range = 8; | ||
light.color.x = 9; | ||
light.color.y = 10; | ||
light.color.z = 11; | ||
light.intensity = 12; | ||
}); | ||
const f32 = new Float32Array(buffer); | ||
expect(f32[0]).toBe(1); | ||
expect(f32[1]).toBe(2); | ||
expect(f32[2]).toBe(3); | ||
expect(f32[3]).toBe(4); | ||
expect(f32[4]).toBe(5); | ||
expect(f32[5]).toBe(6); | ||
expect(f32[6]).toBe(7); | ||
expect(f32[7]).toBe(8); | ||
expect(f32[8]).toBe(9); | ||
expect(f32[9]).toBe(10); | ||
expect(f32[10]).toBe(11); | ||
expect(f32[11]).toBe(12); | ||
}); | ||
test("Nested NestedBufferBackedObjects", function () { | ||
const structDesc = { | ||
somethingElse: BBO.Float32(), | ||
nest1: BBO.NestedBufferBackedObject({ | ||
somethingElse: BBO.Float32(), | ||
nest2: BBO.NestedBufferBackedObject( { | ||
value: BBO.Float32() | ||
}) | ||
}), | ||
}; | ||
const buffer = new ArrayBuffer(BBO.structSize(structDesc)); | ||
const view = BBO.BufferBackedObject(buffer, structDesc); | ||
view.somethingElse = 1; | ||
view.nest1.somethingElse = 2; | ||
view.nest1.nest2.value = 3; | ||
const f32 = new Float32Array(buffer); | ||
expect(f32[0]).toBe(1); | ||
expect(f32[1]).toBe(2); | ||
expect(f32[2]).toBe(3); | ||
}); |
@@ -58,3 +58,2 @@ export type Descriptor<T = any> = { | ||
const dataView = new DataView(buffer, byteOffset); | ||
// Accumulate the size of one struct | ||
let stride = 0; | ||
@@ -320,7 +319,7 @@ // Copy the descriptors. | ||
return { | ||
align: Object.values(descriptors)[0].align ?? 1, | ||
align: structAlign(descriptors), | ||
size, | ||
get: (dataView, byteOffset) => | ||
ArrayOfBufferBackedObjects(dataView.buffer, descriptors, { | ||
byteOffset, | ||
byteOffset: dataView.byteOffset + byteOffset, | ||
length: 1, | ||
@@ -327,0 +326,0 @@ })[0], |
@@ -1,18 +0,18 @@ | ||
function y(t) { | ||
function B(t) { | ||
return typeof t == "symbol" ? !1 : !isNaN(t); | ||
} | ||
function a(t, e) { | ||
function b(t, e) { | ||
let n = t - t % e; | ||
return t % e != 0 && (n += e), n; | ||
} | ||
function B(t) { | ||
function h(t) { | ||
let e = 0; | ||
for (const { align: n = 1, size: i } of Object.values(t)) | ||
e = a(e, n) + i; | ||
return e = a(e, h(t)), e; | ||
e = b(e, n) + i; | ||
return e = b(e, a(t)), e; | ||
} | ||
function h(t) { | ||
function a(t) { | ||
return Math.max(...Object.values(t).map((e) => e.align ?? 1)); | ||
} | ||
function b(t, e, { byteOffset: n = 0, length: i = 0, align: r = h(e) } = {}) { | ||
function d(t, e, { byteOffset: n = 0, length: i = 0, align: r = a(e) } = {}) { | ||
const l = new DataView(t, n); | ||
@@ -26,7 +26,7 @@ let u = 0; | ||
...o, | ||
offset: a(u, o.align ?? 1) | ||
offset: b(u, o.align ?? 1) | ||
}, u = g[f].offset + o.size; | ||
return u = a(u, r), i || (i = Math.floor((t.byteLength - n) / u)), new Proxy(new Array(i), { | ||
return u = b(u, r), i || (i = Math.floor((t.byteLength - n) / u)), new Proxy(new Array(i), { | ||
has(f, o) { | ||
return y(o) ? o < i : o === "buffer" ? !0 : o in f; | ||
return B(o) ? o < i : o === "buffer" ? !0 : o in f; | ||
}, | ||
@@ -36,7 +36,7 @@ get(f, o, w) { | ||
return t; | ||
if (!y(o)) { | ||
if (!B(o)) { | ||
let E = f[o]; | ||
return typeof E == "function" && (E = E.bind(w)), E; | ||
} | ||
const s = parseInt(o), d = s * u; | ||
const s = parseInt(o), y = s * u; | ||
if (!(s >= f.length)) { | ||
@@ -49,9 +49,9 @@ if (!f[s]) { | ||
get() { | ||
return c.get(l, d + c.offset); | ||
return c.get(l, y + c.offset); | ||
}, | ||
set(T) { | ||
set(O) { | ||
return c.set( | ||
l, | ||
d + c.offset, | ||
T | ||
y + c.offset, | ||
O | ||
); | ||
@@ -67,4 +67,4 @@ } | ||
} | ||
function O(t, e, { byteOffset: n = 0, align: i = 1 } = {}) { | ||
return b(t, e, { | ||
function T(t, e, { byteOffset: n = 0, align: i = 1 } = {}) { | ||
return d(t, e, { | ||
byteOffset: n, | ||
@@ -203,8 +203,8 @@ align: i | ||
function L(t) { | ||
const e = B(t); | ||
const e = h(t); | ||
return { | ||
align: Object.values(t)[0].align ?? 1, | ||
align: a(t), | ||
size: e, | ||
get: (n, i) => b(n.buffer, t, { | ||
byteOffset: i, | ||
get: (n, i) => d(n.buffer, t, { | ||
byteOffset: n.byteOffset + i, | ||
length: 1 | ||
@@ -217,8 +217,8 @@ })[0], | ||
} | ||
function v(t, e) { | ||
const n = B(e) * t; | ||
function R(t, e) { | ||
const n = h(e) * t; | ||
return { | ||
align: Object.values(e)[0].align ?? 1, | ||
size: n, | ||
get: (i, r) => b(i.buffer, e, { | ||
get: (i, r) => d(i.buffer, e, { | ||
byteOffset: r + i.byteOffset, | ||
@@ -232,3 +232,3 @@ length: t | ||
} | ||
function R(t) { | ||
function Y(t) { | ||
return { | ||
@@ -244,3 +244,3 @@ align: 1, | ||
} | ||
function Y(t) { | ||
function v(t) { | ||
return { align: 1, size: t, get() { | ||
@@ -251,6 +251,6 @@ }, set() { | ||
export { | ||
b as ArrayOfBufferBackedObjects, | ||
d as ArrayOfBufferBackedObjects, | ||
M as BigInt64, | ||
P as BigUint64, | ||
O as BufferBackedObject, | ||
T as BufferBackedObject, | ||
A as Float32, | ||
@@ -261,11 +261,11 @@ j as Float64, | ||
F as Int8, | ||
v as NestedArrayOfBufferBackedObjects, | ||
R as NestedArrayOfBufferBackedObjects, | ||
L as NestedBufferBackedObject, | ||
R as UTF8String, | ||
Y as UTF8String, | ||
U as Uint16, | ||
z as Uint32, | ||
S as Uint8, | ||
Y as reserved, | ||
h as structAlign, | ||
B as structSize | ||
v as reserved, | ||
a as structAlign, | ||
h as structSize | ||
}; |
@@ -1,1 +0,1 @@ | ||
(function(l,s){typeof exports=="object"&&typeof module<"u"?s(exports):typeof define=="function"&&define.amd?define(["exports"],s):(l=typeof globalThis<"u"?globalThis:l||self,s(l["buffer-backed-object"]={}))})(this,function(l){"use strict";function s(t){return typeof t=="symbol"?!1:!isNaN(t)}function b(t,e){let n=t-t%e;return t%e!=0&&(n+=e),n}function y(t){let e=0;for(const{align:n=1,size:i}of Object.values(t))e=b(e,n)+i;return e=b(e,O(t)),e}function O(t){return Math.max(...Object.values(t).map(e=>e.align??1))}function d(t,e,{byteOffset:n=0,length:i=0,align:r=O(e)}={}){const f=new DataView(t,n);let E=0;const B={...e};for(const[u,o]of Object.entries(B))B[u]={...o,offset:b(E,o.align??1)},E=B[u].offset+o.size;return E=b(E,r),i||(i=Math.floor((t.byteLength-n)/E)),new Proxy(new Array(i),{has(u,o){return s(o)?o<i:o==="buffer"?!0:o in u},get(u,o,N){if(o==="buffer")return t;if(!s(o)){let g=u[o];return typeof g=="function"&&(g=g.bind(N)),g}const c=parseInt(o),h=c*E;if(!(c>=u.length)){if(!u[c]){u[c]={};for(const[g,a]of Object.entries(B))"get"in a&&Object.defineProperty(u[c],g,{enumerable:!0,get(){return a.get(f,h+a.offset)},set(R){return a.set(f,h+a.offset,R)}});Object.freeze(u[c])}return u[c]}}})}function T(t,e,{byteOffset:n=0,align:i=1}={}){return d(t,e,{byteOffset:n,align:i})[0]}function U({endianness:t="little",align:e=2}={}){if(t!=="big"&&t!=="little")throw Error("Endianness needs to be either 'big' or 'little'");const n=t==="little";return{align:e,size:Uint16Array.BYTES_PER_ELEMENT,get:(i,r)=>i.getUint16(r,n),set:(i,r,f)=>i.setUint16(r,f,n)}}function w({endianness:t="little",align:e=4}={}){if(t!=="big"&&t!=="little")throw Error("Endianness needs to be either 'big' or 'little'");const n=t==="little";return{align:e,size:Uint32Array.BYTES_PER_ELEMENT,get:(i,r)=>i.getUint32(r,n),set:(i,r,f)=>i.setUint32(r,f,n)}}function I({endianness:t="little",align:e=2}={}){if(t!=="big"&&t!=="little")throw Error("Endianness needs to be either 'big' or 'little'");const n=t==="little";return{align:e,size:Int16Array.BYTES_PER_ELEMENT,get:(i,r)=>i.getInt16(r,n),set:(i,r,f)=>i.setInt16(r,f,n)}}function j({endianness:t="little",align:e=4}={}){if(t!=="big"&&t!=="little")throw Error("Endianness needs to be either 'big' or 'little'");const n=t==="little";return{align:e,size:Int32Array.BYTES_PER_ELEMENT,get:(i,r)=>i.getInt32(r,n),set:(i,r,f)=>i.setInt32(r,f,n)}}function z({endianness:t="little",align:e=4}={}){if(t!=="big"&&t!=="little")throw Error("Endianness needs to be either 'big' or 'little'");const n=t==="little";return{align:e,size:Float32Array.BYTES_PER_ELEMENT,get:(i,r)=>i.getFloat32(r,n),set:(i,r,f)=>i.setFloat32(r,f,n)}}function A({endianness:t="little",align:e=8}={}){if(t!=="big"&&t!=="little")throw Error("Endianness needs to be either 'big' or 'little'");const n=t==="little";return{align:e,size:Float64Array.BYTES_PER_ELEMENT,get:(i,r)=>i.getFloat64(r,n),set:(i,r,f)=>i.setFloat64(r,f,n)}}function _({endianness:t="little",align:e=8}={}){if(t!=="big"&&t!=="little")throw Error("Endianness needs to be either 'big' or 'little'");const n=t==="little";return{align:e,size:BigInt64Array.BYTES_PER_ELEMENT,get:(i,r)=>i.getBigInt64(r,n),set:(i,r,f)=>i.setBigInt64(r,f,n)}}function S({endianness:t="little",align:e=8}={}){if(t!=="big"&&t!=="little")throw Error("Endianness needs to be either 'big' or 'little'");const n=t==="little";return{align:e,size:BigUint64Array.BYTES_PER_ELEMENT,get:(i,r)=>i.getBigUint64(r,n),set:(i,r,f)=>i.setBigUint64(r,f,n)}}function F(){return{align:1,size:1,get:(t,e)=>t.getUint8(e),set:(t,e,n)=>t.setUint8(e,n)}}function M(){return{align:1,size:1,get:(t,e)=>t.getInt8(e),set:(t,e,n)=>t.setInt8(e,n)}}function P(t){const e=y(t);return{align:Object.values(t)[0].align??1,size:e,get:(n,i)=>d(n.buffer,t,{byteOffset:i,length:1})[0],set:(n,i,r)=>{throw Error("Can’t set an entire struct")}}}function v(t,e){const n=y(e)*t;return{align:Object.values(e)[0].align??1,size:n,get:(i,r)=>d(i.buffer,e,{byteOffset:r+i.byteOffset,length:t}),set:(i,r,f)=>{throw Error("Can’t set an entire array")}}}function k(t){return{align:1,size:t,get:(e,n)=>new TextDecoder().decode(new Uint8Array(e.buffer,n,t)).replace(/\u0000+$/,""),set:(e,n,i)=>{const r=new TextEncoder().encode(i),f=new Uint8Array(e.buffer,n,t);f.fill(0),f.set(r.subarray(0,t))}}}function L(t){return{align:1,size:t,get(){},set(){}}}l.ArrayOfBufferBackedObjects=d,l.BigInt64=_,l.BigUint64=S,l.BufferBackedObject=T,l.Float32=z,l.Float64=A,l.Int16=I,l.Int32=j,l.Int8=M,l.NestedArrayOfBufferBackedObjects=v,l.NestedBufferBackedObject=P,l.UTF8String=k,l.Uint16=U,l.Uint32=w,l.Uint8=F,l.reserved=L,l.structAlign=O,l.structSize=y,Object.defineProperty(l,Symbol.toStringTag,{value:"Module"})}); | ||
(function(l,s){typeof exports=="object"&&typeof module<"u"?s(exports):typeof define=="function"&&define.amd?define(["exports"],s):(l=typeof globalThis<"u"?globalThis:l||self,s(l["buffer-backed-object"]={}))})(this,function(l){"use strict";function s(t){return typeof t=="symbol"?!1:!isNaN(t)}function a(t,e){let n=t-t%e;return t%e!=0&&(n+=e),n}function O(t){let e=0;for(const{align:n=1,size:i}of Object.values(t))e=a(e,n)+i;return e=a(e,d(t)),e}function d(t){return Math.max(...Object.values(t).map(e=>e.align??1))}function B(t,e,{byteOffset:n=0,length:i=0,align:r=d(e)}={}){const f=new DataView(t,n);let E=0;const y={...e};for(const[u,o]of Object.entries(y))y[u]={...o,offset:a(E,o.align??1)},E=y[u].offset+o.size;return E=a(E,r),i||(i=Math.floor((t.byteLength-n)/E)),new Proxy(new Array(i),{has(u,o){return s(o)?o<i:o==="buffer"?!0:o in u},get(u,o,N){if(o==="buffer")return t;if(!s(o)){let g=u[o];return typeof g=="function"&&(g=g.bind(N)),g}const c=parseInt(o),h=c*E;if(!(c>=u.length)){if(!u[c]){u[c]={};for(const[g,b]of Object.entries(y))"get"in b&&Object.defineProperty(u[c],g,{enumerable:!0,get(){return b.get(f,h+b.offset)},set(R){return b.set(f,h+b.offset,R)}});Object.freeze(u[c])}return u[c]}}})}function T(t,e,{byteOffset:n=0,align:i=1}={}){return B(t,e,{byteOffset:n,align:i})[0]}function U({endianness:t="little",align:e=2}={}){if(t!=="big"&&t!=="little")throw Error("Endianness needs to be either 'big' or 'little'");const n=t==="little";return{align:e,size:Uint16Array.BYTES_PER_ELEMENT,get:(i,r)=>i.getUint16(r,n),set:(i,r,f)=>i.setUint16(r,f,n)}}function I({endianness:t="little",align:e=4}={}){if(t!=="big"&&t!=="little")throw Error("Endianness needs to be either 'big' or 'little'");const n=t==="little";return{align:e,size:Uint32Array.BYTES_PER_ELEMENT,get:(i,r)=>i.getUint32(r,n),set:(i,r,f)=>i.setUint32(r,f,n)}}function w({endianness:t="little",align:e=2}={}){if(t!=="big"&&t!=="little")throw Error("Endianness needs to be either 'big' or 'little'");const n=t==="little";return{align:e,size:Int16Array.BYTES_PER_ELEMENT,get:(i,r)=>i.getInt16(r,n),set:(i,r,f)=>i.setInt16(r,f,n)}}function j({endianness:t="little",align:e=4}={}){if(t!=="big"&&t!=="little")throw Error("Endianness needs to be either 'big' or 'little'");const n=t==="little";return{align:e,size:Int32Array.BYTES_PER_ELEMENT,get:(i,r)=>i.getInt32(r,n),set:(i,r,f)=>i.setInt32(r,f,n)}}function z({endianness:t="little",align:e=4}={}){if(t!=="big"&&t!=="little")throw Error("Endianness needs to be either 'big' or 'little'");const n=t==="little";return{align:e,size:Float32Array.BYTES_PER_ELEMENT,get:(i,r)=>i.getFloat32(r,n),set:(i,r,f)=>i.setFloat32(r,f,n)}}function A({endianness:t="little",align:e=8}={}){if(t!=="big"&&t!=="little")throw Error("Endianness needs to be either 'big' or 'little'");const n=t==="little";return{align:e,size:Float64Array.BYTES_PER_ELEMENT,get:(i,r)=>i.getFloat64(r,n),set:(i,r,f)=>i.setFloat64(r,f,n)}}function _({endianness:t="little",align:e=8}={}){if(t!=="big"&&t!=="little")throw Error("Endianness needs to be either 'big' or 'little'");const n=t==="little";return{align:e,size:BigInt64Array.BYTES_PER_ELEMENT,get:(i,r)=>i.getBigInt64(r,n),set:(i,r,f)=>i.setBigInt64(r,f,n)}}function S({endianness:t="little",align:e=8}={}){if(t!=="big"&&t!=="little")throw Error("Endianness needs to be either 'big' or 'little'");const n=t==="little";return{align:e,size:BigUint64Array.BYTES_PER_ELEMENT,get:(i,r)=>i.getBigUint64(r,n),set:(i,r,f)=>i.setBigUint64(r,f,n)}}function F(){return{align:1,size:1,get:(t,e)=>t.getUint8(e),set:(t,e,n)=>t.setUint8(e,n)}}function M(){return{align:1,size:1,get:(t,e)=>t.getInt8(e),set:(t,e,n)=>t.setInt8(e,n)}}function P(t){const e=O(t);return{align:d(t),size:e,get:(n,i)=>B(n.buffer,t,{byteOffset:n.byteOffset+i,length:1})[0],set:(n,i,r)=>{throw Error("Can’t set an entire struct")}}}function k(t,e){const n=O(e)*t;return{align:Object.values(e)[0].align??1,size:n,get:(i,r)=>B(i.buffer,e,{byteOffset:r+i.byteOffset,length:t}),set:(i,r,f)=>{throw Error("Can’t set an entire array")}}}function v(t){return{align:1,size:t,get:(e,n)=>new TextDecoder().decode(new Uint8Array(e.buffer,n,t)).replace(/\u0000+$/,""),set:(e,n,i)=>{const r=new TextEncoder().encode(i),f=new Uint8Array(e.buffer,n,t);f.fill(0),f.set(r.subarray(0,t))}}}function L(t){return{align:1,size:t,get(){},set(){}}}l.ArrayOfBufferBackedObjects=B,l.BigInt64=_,l.BigUint64=S,l.BufferBackedObject=T,l.Float32=z,l.Float64=A,l.Int16=w,l.Int32=j,l.Int8=M,l.NestedArrayOfBufferBackedObjects=k,l.NestedBufferBackedObject=P,l.UTF8String=v,l.Uint16=U,l.Uint32=I,l.Uint8=F,l.reserved=L,l.structAlign=d,l.structSize=O,Object.defineProperty(l,Symbol.toStringTag,{value:"Module"})}); |
{ | ||
"name": "buffer-backed-object", | ||
"version": "1.0.0", | ||
"version": "1.0.1", | ||
"description": "", | ||
"repository": "github:GoogleChromeLabs/buffer-backed-object", | ||
"homepage": "https://github.com/GoogleChromeLabs/buffer-backed-object#readme", | ||
"source": "buffer-backed-object.ts", | ||
"module": "dist/buffer-backed-object.js", | ||
"source": "buffer-backed-object.js", | ||
"module": "dist/buffer-backed-object.modern.js", | ||
"main": "dist/buffer-backed-object.umd.js", | ||
@@ -10,0 +10,0 @@ "types": "dist/buffer-backed-object.d.ts", |
Sorry, the diff of this file is not supported yet
Major refactor
Supply chain riskPackage has recently undergone a major refactor. It may be unstable or indicate significant internal changes. Use caution when updating to versions that include significant changes.
Found 1 instance in 1 package
64024
2.94%1101
6.27%0
-100%