@forgeax/engine-ecs 0.1.25 → 0.1.27
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/README.md +94 -35
- package/dist/__tests__/world-read.unit.test.d.ts +2 -0
- package/dist/__tests__/world-read.unit.test.d.ts.map +1 -0
- package/dist/commands.d.ts +2 -0
- package/dist/commands.d.ts.map +1 -1
- package/dist/index.mjs +3471 -4263
- package/dist/index.mjs.map +1 -1
- package/dist/internal.d.ts +2 -3
- package/dist/internal.d.ts.map +1 -1
- package/dist/internal.mjs +3 -333
- package/dist/internal.mjs.map +1 -1
- package/dist/projection/index.mjs.map +1 -1
- package/dist/shared.mjs.map +1 -1
- package/dist/world-entity-lifecycle.d.ts +3 -14
- package/dist/world-entity-lifecycle.d.ts.map +1 -1
- package/dist/world-internal.d.ts +65 -5
- package/dist/world-internal.d.ts.map +1 -1
- package/dist/world-read.d.ts +16 -0
- package/dist/world-read.d.ts.map +1 -0
- package/dist/world-read.mjs +8 -0
- package/dist/world-read.mjs.map +1 -0
- package/dist/world-scheduling.d.ts +0 -4
- package/dist/world-scheduling.d.ts.map +1 -1
- package/dist/world-storage-primitives.d.ts +26 -0
- package/dist/world-storage-primitives.d.ts.map +1 -0
- package/dist/world.d.ts +352 -157
- package/dist/world.d.ts.map +1 -1
- package/package.json +8 -4
- package/src/__tests__/command-buffer.test.ts +29 -3
- package/src/__tests__/errors.unit.test.ts +65 -13
- package/src/__tests__/hierarchy.unit.test.ts +3 -3
- package/src/__tests__/world-health.contract.test.ts +195 -2
- package/src/__tests__/world-read.unit.test.ts +30 -0
- package/src/commands.ts +22 -9
- package/src/internal.ts +5 -3
- package/src/world-entity-lifecycle.ts +23 -252
- package/src/world-internal-augmentation.d.ts +11 -0
- package/src/world-internal.ts +114 -63
- package/src/world-read.ts +38 -0
- package/src/world-scheduling.ts +0 -26
- package/src/world-storage-primitives.ts +179 -0
- package/src/world.ts +2590 -509
- package/dist/world-component-access.d.ts +0 -311
- package/dist/world-component-access.d.ts.map +0 -1
- package/dist/world-component-storage.d.ts +0 -298
- package/dist/world-component-storage.d.ts.map +0 -1
- package/dist/world-core.d.ts +0 -39
- package/dist/world-core.d.ts.map +0 -1
- package/src/world-component-access.ts +0 -1769
- package/src/world-component-storage.ts +0 -1264
- package/src/world-core.ts +0 -74
package/dist/world.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"world.d.ts","sourceRoot":"","sources":["../src/world.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"world.d.ts","sourceRoot":"","sources":["../src/world.ts"],"names":[],"mappings":"AAWA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,uBAAuB,CAAC;AAW5D,OAAO,EAGL,KAAK,SAAS,EACd,gBAAgB,EAChB,KAAK,eAAe,EAGpB,KAAK,YAAY,EAKjB,KAAK,OAAO,EAEb,MAAM,aAAa,CAAC;AAKrB,OAAO,EAGL,KAAK,YAAY,EAIlB,MAAM,iBAAiB,CAAC;AACzB,OAAO,KAAK,EACV,kBAAkB,EAClB,+BAA+B,EAC/B,wBAAwB,EACxB,iCAAiC,EACjC,4BAA4B,EAE5B,6BAA6B,EAC7B,oCAAoC,EACpC,+BAA+B,EAC/B,6CAA6C,EAC7C,wCAAwC,EACxC,qBAAqB,EACrB,0BAA0B,EAC1B,4BAA4B,EAC5B,wBAAwB,EACxB,iBAAiB,EACjB,2BAA2B,EAC3B,sBAAsB,EACtB,qBAAqB,EACrB,2BAA2B,EAC3B,sBAAsB,EACvB,MAAM,UAAU,CAAC;AAClB,OAAO,EACL,yBAAyB,EACzB,4BAA4B,EAC5B,wBAAwB,EAExB,sBAAsB,EACtB,6BAA6B,EAC7B,0BAA0B,EAC1B,+BAA+B,EAC/B,6BAA6B,EAC7B,gBAAgB,EAGhB,kBAAkB,EACnB,MAAM,UAAU,CAAC;AAClB,OAAO,EAKL,KAAK,mBAAmB,EACzB,MAAM,2BAA2B,CAAC;AACnC,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,eAAe,CAAC;AACrD,OAAO,EAAe,KAAK,KAAK,EAAE,KAAK,kBAAkB,EAAE,MAAM,eAAe,CAAC;AACjF,OAAO,EAGL,KAAK,2BAA2B,EAIjC,MAAM,sBAAsB,CAAC;AAE9B,OAAO,EAAkB,KAAK,gBAAgB,EAAE,KAAK,SAAS,EAAE,MAAM,YAAY,CAAC;AAEnF,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,oBAAoB,CAAC;AAWzD,OAAO,EACL,KAAK,WAAW,EAMjB,MAAM,4BAA4B,CAAC;AAUpC,OAAO,EAKL,KAAK,YAAY,EAClB,MAAM,QAAQ,CAAC;AAWhB,OAAO,EAAE,KAAK,SAAS,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AAwBzD;;;GAGG;AACH,MAAM,MAAM,QAAQ,GAChB,kBAAkB,GAClB,gBAAgB,GAChB,wBAAwB,GACxB,4BAA4B,GAC5B,+BAA+B,GAC/B,iCAAiC,GACjC,6BAA6B,GAC7B,sBAAsB,GACtB,2BAA2B,GAC3B,6BAA6B,GAC7B,oCAAoC,GACpC,sBAAsB,GACtB,0BAA0B,GAC1B,6CAA6C,GAC7C,wCAAwC,GACxC,+BAA+B,GAC/B,+BAA+B,GAC/B,wBAAwB,GACxB,6BAA6B,GAC7B,2BAA2B,GAC3B,iBAAiB,GACjB,qBAAqB,GACrB,sBAAsB,GACtB,0BAA0B,GAC1B,4BAA4B,GAC5B,wBAAwB,GACxB,4BAA4B,GAC5B,yBAAyB,GACzB,kBAAkB,CAAC;AAEvB;;;;;;;;;;;oBAWoB;AACpB,MAAM,WAAW,aAAa,CAAC,CAAC,SAAS,eAAe,GAAG,eAAe;IACxE,SAAS,EAAE,SAAS,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC;IAChC,IAAI,EAAE,OAAO,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC,CAAC;CAChC;AAED,KAAK,iBAAiB,CAAC,CAAC,SAAS,SAAS,IAAI,CAAC,SAAS,2BAA2B,GAAG,KAAK,GAAG,CAAC,CAAC;AAIhG;;;;GAIG;AACH,MAAM,WAAW,aAAa;IAC5B,0FAA0F;IAC1F,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;IACrB,wDAAwD;IACxD,QAAQ,CAAC,cAAc,EAAE,MAAM,EAAE,CAAC;IAClC,iDAAiD;IACjD,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;IAC7B,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;CAC1B;AAED,MAAM,WAAW,SAAS;IACxB,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,cAAc,EAAE,MAAM,EAAE,CAAC;IAClC,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;IAC7B,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;CAC3B;AAED;;;GAGG;AACH,MAAM,WAAW,eAAe;IAC9B,qCAAqC;IACrC,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;IAC7B,gDAAgD;IAChD,QAAQ,CAAC,cAAc,EAAE,MAAM,CAAC;IAChC,6BAA6B;IAC7B,QAAQ,CAAC,UAAU,EAAE,aAAa,EAAE,CAAC;IACrC,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,MAAM,EAAE,SAAS,EAAE,CAAC;IAC7B;;;;;OAKG;IACH,QAAQ,CAAC,gBAAgB,EAAE,MAAM,EAAE,CAAC;IACpC,2FAA2F;IAC3F,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;IAC7B;;;;;;;;OAQG;IACH,QAAQ,CAAC,OAAO,EAAE,aAAa,CAAC;QAAE,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;QAAC,QAAQ,CAAC,IAAI,EAAE,SAAS,MAAM,EAAE,CAAA;KAAE,CAAC,CAAC;IAC7F,sCAAsC;IACtC,QAAQ,CAAC,YAAY,EAAE,MAAM,EAAE,CAAC;IAChC,+CAA+C;IAC/C,QAAQ,CAAC,SAAS,EAAE,aAAa,CAAC;QAChC,QAAQ,CAAC,QAAQ,EAAE,OAAO,kBAAkB,EAAE,aAAa,CAAC;QAC5D,QAAQ,CAAC,OAAO,EAAE,aAAa,CAAC;YAAE,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;YAAC,QAAQ,CAAC,IAAI,EAAE,SAAS,MAAM,EAAE,CAAA;SAAE,CAAC,CAAC;KAC9F,CAAC,CAAC;IACH,8CAA8C;IAC9C,mBAAmB,CAAC,QAAQ,EAAE,OAAO,kBAAkB,EAAE,aAAa,GAAG,MAAM,CAAC;CACjF;AAED,uFAAuF;AACvF,MAAM,WAAW,sBAAsB;IACrC,QAAQ,CAAC,IAAI,EAAE,SAAS,MAAM,EAAE,CAAC;IACjC,QAAQ,CAAC,OAAO,EAAE,SAAS,MAAM,EAAE,CAAC;IACpC,QAAQ,CAAC,QAAQ,EAAE,SAAS,MAAM,EAAE,CAAC;IACrC,QAAQ,CAAC,OAAO,EAAE,SAAS,MAAM,EAAE,CAAC;IACpC,QAAQ,CAAC,KAAK,EAAE,SAAS,MAAM,EAAE,CAAC;CACnC;AAED,yDAAyD;AACzD,MAAM,WAAW,uBAAuB;IACtC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,IAAI,EAAE,SAAS,MAAM,EAAE,CAAC;IACjC,QAAQ,CAAC,MAAM,EAAE,SAAS,MAAM,EAAE,CAAC;IACnC,QAAQ,CAAC,KAAK,EAAE,SAAS,MAAM,EAAE,CAAC;IAClC,QAAQ,CAAC,OAAO,EAAE,SAAS,sBAAsB,EAAE,CAAC;IACpD,QAAQ,CAAC,SAAS,EAAE,SAAS,MAAM,EAAE,CAAC;CACvC;AAED,6DAA6D;AAC7D,MAAM,WAAW,oBAAoB;IACnC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,OAAO,EAAE,SAAS,MAAM,EAAE,CAAC;IACpC,QAAQ,CAAC,MAAM,EAAE,SAAS,MAAM,EAAE,CAAC;IACnC,QAAQ,CAAC,KAAK,EAAE,SAAS,MAAM,EAAE,CAAC;IAClC,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAC;CAC3B;AAED,2DAA2D;AAC3D,MAAM,WAAW,iBAAiB;IAChC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,OAAO,EAAE,SAAS,uBAAuB,EAAE,CAAC;IACrD,QAAQ,CAAC,UAAU,EAAE,SAAS,oBAAoB,EAAE,CAAC;IACrD,QAAQ,CAAC,YAAY,EAAE,SAAS,CAAC,SAAS,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,EAAE,CAAC;CAC/D;AAED;;;;;;;;;;;;;GAaG;AACH,MAAM,WAAW,YAAY;IAC3B,UAAU,EAAE,MAAM,CAAC;IACnB,WAAW,EAAE,MAAM,CAAC;IACpB,YAAY,EAAE,MAAM,CAAC;CACtB;AAED;;;GAGG;AACH,qBAAa,KAAK;IAChB,QAAQ,CAAC,CAAC,SAAS,CAAC,EAAE,SAAS,CAAC;IAGhC,4EAA4E;IAC5E,OAAO,CAAC,cAAc,CAA0E;IAChG,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAiB;IACvC,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAsB;IAC9C,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAgB;IAC5C,kEAAkE;IAClE,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAoB;IAC/C,sEAAsE;IACtE,OAAO,CAAC,QAAQ,CAAC,UAAU,CAA4C;IACvE,iFAAiF;IACjF,QAAQ,CAAC,UAAU,EAAE,cAAc,CAA4B;IAC/D,OAAO,CAAC,QAAQ,CAAC,uBAAuB,CAAgB;IACxD,OAAO,CAAC,QAAQ,CAAC,kBAAkB,CAAoC;IACvE,kEAAkE;IAClE,OAAO,CAAC,QAAQ,CAAC,mBAAmB,CAAwC;IAC5E,OAAO,CAAC,aAAa,CAAK;IAC1B,OAAO,CAAC,cAAc,CAAK;IAC3B,gGAAgG;IAChG,IAAI,QAAQ,WAEX;IACD,wFAAwF;IACxF,QAAQ,CAAC,UAAU,mBAAyE;IAC5F,2DAA2D;IAC3D,OAAO,CAAC,QAAQ,CAAC,SAAS,CAGvB;IACH,yDAAyD;IACzD,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAwC;IAClE,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAsC;IAC5D,iDAAiD;IACjD,OAAO,CAAC,gBAAgB,CAAK;gBACjB,OAAO,GAAE,YAAiB;IA8DtC,iFAAiF;IACjF,IAAI,SAAS,IAAI,mBAAmB,CAEnC;IAED,6FAA6F;IAC7F,aAAa,CACX,IAAI,EAAE,OAAO,kBAAkB,EAAE,YAAY,GAC5C,OAAO,kBAAkB,EAAE,aAAa;IAM3C,kFAAkF;IAClF,OAAO,CAAC,uBAAuB;IAM/B;;;;;OAKG;IACH,OAAO,CAAC,cAAc;IAKtB,KAAK,CACH,KAAK,CAAC,CAAC,SAAS,SAAS,SAAS,EAAE,GAAG,SAAS,EAAE,EAClD,KAAK,CAAC,CAAC,SAAS,SAAS,SAAS,EAAE,GAAG,SAAS,EAAE,EAClD,KAAK,CAAC,CAAC,SAAS,SAAS,SAAS,EAAE,GAAG,SAAS,EAAE,EAClD,UAAU,EAAE,eAAe,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,EAAE,kBAAkB,CAAC;IAQnF,OAAO,CAAC,gBAAgB;IAYxB,OAAO,CAAC,wBAAwB;IAIhC,mEAAmE;IACnE,OAAO,CAAC,0BAA0B;IAMlC,gDAAgD;IAChD,OAAO,CAAC,0BAA0B;IASlC,yDAAyD;IACzD,OAAO,CAAC,yBAAyB;IAQjC,OAAO,CAAC,4BAA4B;IAIpC,OAAO,CAAC,2BAA2B;IAenC,iDAAiD;IACjD,OAAO,CAAC,qBAAqB;IAI7B,iEAAiE;IACjE,iBAAiB,IAAI,MAAM;IAI3B,mEAAmE;IACnE,OAAO,CAAC,2BAA2B;IAUnC,iEAAiE;IACjE,OAAO,CAAC,4BAA4B;IAapC,+DAA+D;IAC/D,OAAO,CAAC,iCAAiC;IAazC,uEAAuE;IACvE,OAAO,CAAC,mBAAmB;IAY3B,gFAAgF;IAChF,iBAAiB,CAAC,IAAI,EAAE,MAAM,GAAG,WAAW,GAAG,SAAS;IAKxD,+EAA+E;IAC/E,OAAO,CAAC,UAAU;IAUlB;;;;;;;;;;;;;;;;;;OAkBG;IACH,SAAS,CAAC,KAAK,CAAC,EAAE,SAAS,aAAa,CAAC,eAAe,CAAC,EACvD,QAAQ,EAAE,OAAO,kBAAkB,EAAE,aAAa,EAClD,UAAU,EAAE,gBAAgB,CAAC,EAAE,CAAC,GAC/B,MAAM,CAAC,IAAI,EAAE,0BAA0B,CAAC;IAI3C;;;;;;;;;;;;;;;;;OAiBG;IACH,YAAY,CACV,QAAQ,EAAE,OAAO,kBAAkB,EAAE,aAAa,EAClD,IAAI,EAAE,MAAM,GACX,MAAM,CAAC,IAAI,EAAE,qBAAqB,GAAG,0BAA0B,CAAC;IAInE;;;;;;;;;;;;;;;;;;;;OAoBG;IACH,aAAa,CAAC,KAAK,CAAC,EAAE,SAAS,aAAa,CAAC,eAAe,CAAC,EAC3D,QAAQ,EAAE,OAAO,kBAAkB,EAAE,aAAa,EAClD,IAAI,EAAE,MAAM,EACZ,UAAU,EAAE,gBAAgB,CAAC,EAAE,CAAC,GAC/B,MAAM,CAAC,IAAI,EAAE,qBAAqB,GAAG,0BAA0B,CAAC;IAInE;;;;;;;;;;;;;;;;OAgBG;IACH,UAAU,CAAC,KAAK,CAAC,EAAE,SAAS,aAAa,CAAC,eAAe,CAAC,EACxD,QAAQ,EAAE,OAAO,kBAAkB,EAAE,aAAa,EAClD,GAAG,EAAE,SAAS,EACd,OAAO,EAAE,aAAa,CAAC,gBAAgB,CAAC,EAAE,CAAC,CAAC,GAC3C,MAAM,CAAC,IAAI,EAAE,2BAA2B,GAAG,0BAA0B,CAAC;IAIzE;;;;;;;;;;;OAWG;IACH,MAAM,CACJ,YAAY,SAAI,GACf,MAAM,CACP,IAAI,EACF,qBAAqB,GACrB,sBAAsB,GACtB,0BAA0B,GAC1B,kBAAkB,GAClB,kBAAkB,GAClB,iBAAiB,GACjB,OAAO,UAAU,EAAE,qBAAqB,GACxC,wBAAwB,CAC3B;IAQD,yDAAyD;IACzD,cAAc,CAAC,CAAC,EAAE,GAAG,EAAE,MAAM,GAAG;QAAE,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAA;KAAE,EAAE,KAAK,EAAE,CAAC,GAAG,IAAI;IAI1E;;;OAGG;IACH,WAAW,CAAC,GAAG,EAAE,cAAc,QAAQ,EAAE,IAAI,GAAG,OAAO,QAAQ,EAAE,YAAY;IAC7E,WAAW,CAAC,GAAG,EAAE,cAAc,QAAQ,EAAE,SAAS,GAAG,OAAO,QAAQ,EAAE,iBAAiB;IACvF,WAAW,CAAC,CAAC,EAAE,GAAG,EAAE,MAAM,GAAG;QAAE,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAA;KAAE,GAAG,CAAC;IAK1D,kCAAkC;IAClC,WAAW,CAAC,GAAG,EAAE,MAAM,GAAG;QAAE,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAA;KAAE,GAAG,OAAO;IAI7D,gCAAgC;IAChC,cAAc,CAAC,GAAG,EAAE,MAAM,GAAG;QAAE,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAA;KAAE,GAAG,IAAI;IAQ7D;;;;;;;;;;;;;;OAcG;IACH,OAAO,IAAI,eAAe;IAI1B,gFAAgF;IAChF,YAAY,IAAI,aAAa,CAAC,iBAAiB,CAAC;IAQhD;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;OAyCG;IACH,cAAc,CAAC,MAAM,SAAS,MAAM,EAAE,CAAC,EACrC,MAAM,EAAE,MAAM,EACd,OAAO,EAAE,CAAC,EACV,SAAS,CAAC,EAAE,CAAC,OAAO,EAAE,CAAC,KAAK,IAAI,GAC/B,MAAM,CAAC,MAAM,EAAE,QAAQ,CAAC;IAI3B;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;OA+BG;IACH,cAAc,CAAC,MAAM,SAAS,MAAM,EAAE,CAAC,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,QAAQ,CAAC;IAI9F;;;;;;OAMG;IACH,eAAe,CAAC,MAAM,SAAS,MAAM,EAAE,CAAC,SAAS,MAAM,EACrD,MAAM,EAAE,MAAM,EACd,OAAO,EAAE,CAAC,GACT,MAAM,CAAC,MAAM,EAAE,QAAQ,CAAC;IAW3B,OAAO,CAAC,4BAA4B;IAOpC,OAAO,CAAC,+BAA+B;IAQvC,wEAAwE;IACxE,YAAY,CAAC,MAAM,EAAE,YAAY,EAAE,SAAS,EAAE,SAAS,GAAG,OAAO;IASjE,OAAO,CAAC,KAAK;IAIb,OAAO,CAAC,QAAQ;IAIhB,OAAO,CAAC,oBAAoB;IAI5B,OAAO,CAAC,iBAAiB;IAUzB,oFAAoF;IACpF,OAAO,CAAC,yBAAyB;IAiBjC,8EAA8E;IAC9E,OAAO,CAAC,wBAAwB;IAQhC,OAAO,CAAC,wBAAwB;IAgBhC,OAAO,CAAC,6BAA6B;IAkBrC;;;;;;OAMG;IACH,OAAO,CAAC,sBAAsB;IA4F9B,OAAO,CAAC,oBAAoB;IAgC5B;;;;;OAKG;IACH,OAAO,CAAC,qBAAqB;IA6G7B,0EAA0E;IAC1E,OAAO,CAAC,yBAAyB;IAsDjC,uDAAuD;IACvD,OAAO,CAAC,oBAAoB;IAmE5B,yDAAyD;IACzD,OAAO,CAAC,oBAAoB;IA2B5B,OAAO,CAAC,sBAAsB;IAM9B,OAAO,CAAC,+BAA+B;IAoBvC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;OA+BG;IACH,GAAG,CAAC,CAAC,SAAS,eAAe,EAC3B,MAAM,EAAE,YAAY,EACpB,SAAS,EAAE,SAAS,CAAC,MAAM,EAAE,CAAC,CAAC,GAC9B,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,QAAQ,CAAC;IA2B/B;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;OAmCG;IACH,OAAO,CAAC,YAAY;IAcpB;;;;;;;;;;;;;;;;;;OAkBG;IACH,GAAG,CAAC,CAAC,SAAS,eAAe,EAAE,CAAC,SAAS,SAAS,CAAC,MAAM,EAAE,CAAC,CAAC,EAC3D,MAAM,EAAE,YAAY,EACpB,SAAS,EAAE,CAAC,GAAG,iBAAiB,CAAC,CAAC,CAAC,EACnC,KAAK,EAAE,OAAO,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC,EAC/B,WAAW,UAAO,GACjB,MAAM,CAAC,IAAI,EAAE,QAAQ,CAAC;IAgLzB;;;;;;;;;OASG;IACH,OAAO,CAAC,kBAAkB;IA8E1B,OAAO,CAAC,mBAAmB;IAoD3B;;;;OAIG;IACH,OAAO,CAAC,oBAAoB;IA0C5B;;;;;;;;;;;;;;;;;;;OAmBG;IACH,YAAY,CAAC,CAAC,SAAS,eAAe,EAAE,CAAC,SAAS,SAAS,CAAC,MAAM,EAAE,CAAC,CAAC,EACpE,MAAM,EAAE,YAAY,EACpB,aAAa,EAAE,aAAa,CAAC,CAAC,CAAC,GAAG;QAAE,SAAS,EAAE,CAAC,GAAG,iBAAiB,CAAC,CAAC,CAAC,CAAA;KAAE,GACxE,MAAM,CAAC,IAAI,EAAE,QAAQ,CAAC;IAWzB;;;;;OAKG;IACH,OAAO,CAAC,gBAAgB;IA4LxB;;;;;;;;;;;;;;;;;;OAkBG;IACH,eAAe,CAAC,CAAC,SAAS,eAAe,EAAE,CAAC,SAAS,SAAS,CAAC,MAAM,EAAE,CAAC,CAAC,EACvE,MAAM,EAAE,YAAY,EACpB,SAAS,EAAE,CAAC,GAAG,iBAAiB,CAAC,CAAC,CAAC,GAClC,MAAM,CAAC,IAAI,EAAE,QAAQ,CAAC;IAQzB;;;;;OAKG;IACH,OAAO,CAAC,mBAAmB;IAsF3B;;;;OAIG;IACH,OAAO,CAAC,qBAAqB;IAM7B;;;;;OAKG;IACH,OAAO,CAAC,mBAAmB;IAS3B;;;;;OAKG;IACH,OAAO,CAAC,iBAAiB;IAqEzB,OAAO,CAAC,yBAAyB;IAUjC,8DAA8D;IAC9D,OAAO,CAAC,wBAAwB;IAWhC,OAAO,CAAC,aAAa;IAgBrB;;;;;;;;;OASG;IACH,OAAO,CAAC,YAAY;IASpB,OAAO,CAAC,WAAW;IAqBnB,OAAO,CAAC,aAAa;IA6BrB,wEAAwE;IACxE,OAAO,CAAC,qBAAqB;IAa7B,2EAA2E;IAC3E,OAAO,CAAC,sBAAsB;IAmB9B,0EAA0E;IAC1E,OAAO,CAAC,uBAAuB;IA4C/B,OAAO,CAAC,OAAO;IAgFf;;;;;;OAMG;IACH,OAAO,CAAC,eAAe;IAOvB,OAAO,CAAC,QAAQ;IAyGhB,kFAAkF;IAClF,OAAO,CAAC,uBAAuB;IAQ/B;;;;OAIG;IACH,OAAO,CAAC,wBAAwB;IA+EhC,4DAA4D;IAC5D,OAAO,CAAC,uBAAuB;IAkB/B,6EAA6E;IAC7E,OAAO,CAAC,sBAAsB;IAkB9B,mEAAmE;IACnE,OAAO,CAAC,wBAAwB;IAiBhC,0EAA0E;IAC1E,OAAO,CAAC,wBAAwB;IAShC;;;;;OAKG;IACH,OAAO,CAAC,eAAe;IAWvB;;;OAGG;IACH,OAAO,CAAC,eAAe;IA2JvB;;;;;;;;OAQG;IACH,OAAO,CAAC,yBAAyB;IAWjC;;;;;;OAMG;IACH,OAAO,CAAC,0BAA0B;IAWlC;;;;OAIG;IACH,OAAO,CAAC,oBAAoB;IA+B5B;;;;OAIG;IACH,OAAO,CAAC,aAAa;IAqErB,OAAO,CAAC,mBAAmB;IAwB3B;;;;;OAKG;IACH,OAAO,CAAC,aAAa;IA6ErB;;;;;;;;;;;;;;;OAeG;IACH,KAAK,CAAC,KAAK,CAAC,IAAI,SAAS,SAAS,eAAe,EAAE,EACjD,GAAG,cAAc,EAAE;SAChB,CAAC,IAAI,MAAM,IAAI,GAAG;YACjB,SAAS,EAAE,SAAS,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC;YACtC,IAAI,EAAE,OAAO,CAAC,YAAY,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;SACtC;KACF,GACA,MAAM,CAAC,YAAY,EAAE,QAAQ,CAAC;IAiBjC;;;;;;;;;;;;;;OAcG;IACH,OAAO,CAAC,MAAM,EAAE,YAAY,GAAG,MAAM,CAAC,IAAI,EAAE,QAAQ,CAAC;IAMrD,mFAAmF;IACnF,UAAU,IAAI,MAAM,CAAC,IAAI,EAAE,QAAQ,CAAC;IAsBpC,QAAQ,CAAC,CAAC,SAAS,eAAe,EAChC,MAAM,EAAE,YAAY,EACpB,KAAK,EAAE,YAAY,EACnB,SAAS,EAAE,SAAS,CAAC,MAAM,EAAE,CAAC,CAAC,EAC/B,IAAI,EAAE,OAAO,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC,GAC7B,MAAM,CAAC,IAAI,EAAE,QAAQ,CAAC;IAMzB,WAAW,CAAC,CAAC,SAAS,eAAe,EACnC,MAAM,EAAE,YAAY,EACpB,KAAK,EAAE,YAAY,EACnB,SAAS,EAAE,SAAS,CAAC,MAAM,EAAE,CAAC,CAAC,GAC9B,MAAM,CAAC,IAAI,EAAE,QAAQ,CAAC;IAMzB,QAAQ,CAAC,CAAC,SAAS,eAAe,EAChC,KAAK,EAAE,YAAY,EACnB,SAAS,EAAE,YAAY,EACvB,SAAS,EAAE,SAAS,CAAC,MAAM,EAAE,CAAC,CAAC,EAC/B,IAAI,EAAE,OAAO,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC,GAC7B,MAAM,CAAC,IAAI,EAAE,QAAQ,CAAC;IAMzB,aAAa,CAAC,MAAM,EAAE,YAAY,GAAG,QAAQ,CAAC,YAAY,CAAC;IAI3D,eAAe,CAAC,MAAM,EAAE,YAAY,GAAG,QAAQ,CAAC,YAAY,CAAC;CAG9D"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@forgeax/engine-ecs",
|
|
3
|
-
"version": "0.1.
|
|
3
|
+
"version": "0.1.27",
|
|
4
4
|
"private": false,
|
|
5
5
|
"type": "module",
|
|
6
6
|
"license": "Apache-2.0",
|
|
@@ -27,6 +27,10 @@
|
|
|
27
27
|
"./shared": {
|
|
28
28
|
"types": "./dist/shared.d.ts",
|
|
29
29
|
"import": "./dist/shared.mjs"
|
|
30
|
+
},
|
|
31
|
+
"./world-read": {
|
|
32
|
+
"types": "./dist/world-read.d.ts",
|
|
33
|
+
"import": "./dist/world-read.mjs"
|
|
30
34
|
}
|
|
31
35
|
},
|
|
32
36
|
"main": "./dist/index.mjs",
|
|
@@ -38,9 +42,9 @@
|
|
|
38
42
|
"LICENSE"
|
|
39
43
|
],
|
|
40
44
|
"dependencies": {
|
|
41
|
-
"@forgeax/engine-math": "0.1.
|
|
42
|
-
"@forgeax/engine-plugin": "0.1.
|
|
43
|
-
"@forgeax/engine-types": "0.1.
|
|
45
|
+
"@forgeax/engine-math": "0.1.27",
|
|
46
|
+
"@forgeax/engine-plugin": "0.1.27",
|
|
47
|
+
"@forgeax/engine-types": "0.1.27"
|
|
44
48
|
},
|
|
45
49
|
"devDependencies": {
|
|
46
50
|
"@types/node": "^20.14.0"
|
|
@@ -1,9 +1,10 @@
|
|
|
1
|
+
import { err } from '@forgeax/engine-types';
|
|
1
2
|
import { describe, expect, it, vi } from 'vitest';
|
|
2
3
|
import { createCommandBuffer, flushCommands } from '../commands';
|
|
3
4
|
import { defineComponent } from '../component';
|
|
4
5
|
import { Entity } from '../entity';
|
|
5
6
|
import type { EntityHandle } from '../entity-handle';
|
|
6
|
-
import { CommandFailedError, SystemFailedError } from '../errors';
|
|
7
|
+
import { CommandFailedError, SharedKernelFailureError, SystemFailedError } from '../errors';
|
|
7
8
|
import { defineRelationship } from '../relationship-index';
|
|
8
9
|
import { Update } from '../schedule-token';
|
|
9
10
|
import { World } from '../world';
|
|
@@ -143,11 +144,12 @@ describe('CommandBuffer terminal lifecycle', () => {
|
|
|
143
144
|
const failed = world.update();
|
|
144
145
|
expect(failed.ok).toBe(false);
|
|
145
146
|
expect(world.execution.health).toBe('poisoned');
|
|
146
|
-
const
|
|
147
|
+
const replacementWorld = new World();
|
|
148
|
+
replacementWorld.spawn().unwrap();
|
|
147
149
|
const stale = world.get(pending as EntityHandle, CommandPosition);
|
|
148
150
|
expect(stale.ok).toBe(false);
|
|
149
151
|
if (!stale.ok) expect(stale.error.code).toBe('stale-entity');
|
|
150
|
-
expect(
|
|
152
|
+
expect(replacementWorld.identity).not.toBe(world.identity);
|
|
151
153
|
});
|
|
152
154
|
|
|
153
155
|
it('reports the last committed command when a later flush write unexpectedly fails', () => {
|
|
@@ -176,4 +178,28 @@ describe('CommandBuffer terminal lifecycle', () => {
|
|
|
176
178
|
}
|
|
177
179
|
expect(world.execution.health).toBe('poisoned');
|
|
178
180
|
});
|
|
181
|
+
|
|
182
|
+
it('poisons on a first-command materialization failure without reclaiming its row', () => {
|
|
183
|
+
const world = new World();
|
|
184
|
+
const buffer = createCommandBuffer(world, { systemName: 'flush', scheduleName: Update.name });
|
|
185
|
+
const pending = buffer.spawn({ component: CommandPosition, data: { x: 7 } });
|
|
186
|
+
const injected = new SharedKernelFailureError(
|
|
187
|
+
'World.materializeEntity',
|
|
188
|
+
world.identity,
|
|
189
|
+
new Error('post-write materialization fault'),
|
|
190
|
+
true,
|
|
191
|
+
);
|
|
192
|
+
const materialize = world[worldInternal].materializePendingEntity;
|
|
193
|
+
vi.spyOn(world[worldInternal], 'materializePendingEntity').mockImplementationOnce(
|
|
194
|
+
(entity, componentDatas) => {
|
|
195
|
+
const result = materialize(entity, componentDatas);
|
|
196
|
+
return result.ok ? err(injected) : result;
|
|
197
|
+
},
|
|
198
|
+
);
|
|
199
|
+
|
|
200
|
+
expect(() => flushCommands(buffer, world)).toThrow(SystemFailedError);
|
|
201
|
+
expect(world.execution.health).toBe('poisoned');
|
|
202
|
+
expect(world.execution.fault?.partialWrite).toBe(true);
|
|
203
|
+
expect(world.hasComponent(pending, CommandPosition)).toBe(true);
|
|
204
|
+
});
|
|
179
205
|
});
|
|
@@ -58,8 +58,12 @@ import { World } from '../world';
|
|
|
58
58
|
const NAME = 'register' + 'Component';
|
|
59
59
|
const CALL_PATTERN = `[.](${NAME}|${NAME}Checked)[(]`;
|
|
60
60
|
const FIELD_PATTERN = `${NAME}:`;
|
|
61
|
+
// The repo-wide source scan runs inside the coverage pool alongside 180+
|
|
62
|
+
// instrumented files. Keep the default unit-test budget for normal cases,
|
|
63
|
+
// but allow a contended runner to finish this I/O-only contract gate.
|
|
64
|
+
const SOURCE_SCAN_TIMEOUT_MS = 30_000;
|
|
61
65
|
|
|
62
|
-
function
|
|
66
|
+
function sourceHitsFallback(pattern: string): string[] {
|
|
63
67
|
const expression = new RegExp(pattern);
|
|
64
68
|
const hits: string[] = [];
|
|
65
69
|
const visit = (relativeDir: string): void => {
|
|
@@ -85,20 +89,68 @@ import { World } from '../world';
|
|
|
85
89
|
return hits;
|
|
86
90
|
}
|
|
87
91
|
|
|
92
|
+
function sourceHits(pattern: string): string[] {
|
|
93
|
+
const result = spawnSync(
|
|
94
|
+
'rg',
|
|
95
|
+
[
|
|
96
|
+
'--no-heading',
|
|
97
|
+
'--color=never',
|
|
98
|
+
'--line-number',
|
|
99
|
+
'--glob',
|
|
100
|
+
'*.ts',
|
|
101
|
+
'--glob',
|
|
102
|
+
'*.mjs',
|
|
103
|
+
'--glob',
|
|
104
|
+
'!dist/**',
|
|
105
|
+
'--glob',
|
|
106
|
+
'!node_modules/**',
|
|
107
|
+
pattern,
|
|
108
|
+
...SCAN_DIRS,
|
|
109
|
+
],
|
|
110
|
+
{ cwd: repoRoot, encoding: 'utf8' },
|
|
111
|
+
);
|
|
112
|
+
if (result.error === undefined) {
|
|
113
|
+
if (result.status === 1) return [];
|
|
114
|
+
if (result.status !== 0) {
|
|
115
|
+
throw result.error ?? new Error(`rg exited with status ${result.status}`);
|
|
116
|
+
}
|
|
117
|
+
return result.stdout
|
|
118
|
+
.trimEnd()
|
|
119
|
+
.split('\n')
|
|
120
|
+
.filter(Boolean)
|
|
121
|
+
.map((line) => {
|
|
122
|
+
const separator = line.indexOf(':');
|
|
123
|
+
const lineEnd = line.indexOf(':', separator + 1);
|
|
124
|
+
return `${line.slice(0, separator)}:${line.slice(separator + 1, lineEnd)}:${line
|
|
125
|
+
.slice(lineEnd + 1)
|
|
126
|
+
.trim()}`;
|
|
127
|
+
});
|
|
128
|
+
}
|
|
129
|
+
return sourceHitsFallback(pattern);
|
|
130
|
+
}
|
|
131
|
+
|
|
88
132
|
describe('ac16-register-component-grep-gate.test.ts', () => {
|
|
89
133
|
describe('AC-16 - register-component call surface is zero repo-wide (w20)', () => {
|
|
90
|
-
it(
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
134
|
+
it(
|
|
135
|
+
'layer 1: zero method-call sites for the deleted register* methods',
|
|
136
|
+
() => {
|
|
137
|
+
const hits = sourceHits(CALL_PATTERN);
|
|
138
|
+
expect(hits, `unexpected register-component call sites:\n${hits.join('\n')}`).toEqual([]);
|
|
139
|
+
},
|
|
140
|
+
SOURCE_SCAN_TIMEOUT_MS,
|
|
141
|
+
);
|
|
142
|
+
|
|
143
|
+
it(
|
|
144
|
+
'layer 2: zero mock interface field declarations for the deleted method',
|
|
145
|
+
() => {
|
|
146
|
+
const hits = sourceHits(FIELD_PATTERN);
|
|
147
|
+
expect(
|
|
148
|
+
hits,
|
|
149
|
+
`unexpected register-component field declarations:\n${hits.join('\n')}`,
|
|
150
|
+
).toEqual([]);
|
|
151
|
+
},
|
|
152
|
+
SOURCE_SCAN_TIMEOUT_MS,
|
|
153
|
+
);
|
|
102
154
|
});
|
|
103
155
|
});
|
|
104
156
|
}
|
|
@@ -23,7 +23,7 @@ import { Update } from '../schedule-token';
|
|
|
23
23
|
// - packages/ecs/src/__tests__/world-array-reflection.test.ts
|
|
24
24
|
// - packages/ecs/src/__tests__/world-array-view.test.ts
|
|
25
25
|
// - packages/ecs/src/__tests__/world-buffer-fields.test.ts
|
|
26
|
-
// - packages/ecs/src/__tests__/world-
|
|
26
|
+
// - packages/ecs/src/__tests__/world-health.contract.test.ts
|
|
27
27
|
// - packages/ecs/src/__tests__/world-inspect-systems.test.ts
|
|
28
28
|
// - packages/ecs/src/__tests__/world-integration.test.ts
|
|
29
29
|
// - packages/ecs/src/__tests__/world-managed-refs-non-null.test.ts
|
|
@@ -935,7 +935,7 @@ import { handleNumeric } from './utils/handle-numeric';
|
|
|
935
935
|
describe('generation retirement (AC-03, E-08)', () => {
|
|
936
936
|
// These tests verify the retirement *constants* and *encoding* behavior.
|
|
937
937
|
// The actual World-level retirement logic (not pushing to free list) is
|
|
938
|
-
// tested in
|
|
938
|
+
// tested in the World lifecycle contract suite (w11).
|
|
939
939
|
|
|
940
940
|
it('ENTITY_MAX_GENERATION equals 255', () => {
|
|
941
941
|
expect(ENTITY_MAX_GENERATION).toBe(255);
|
|
@@ -1044,7 +1044,7 @@ import { handleNumeric } from './utils/handle-numeric';
|
|
|
1044
1044
|
});
|
|
1045
1045
|
}
|
|
1046
1046
|
{
|
|
1047
|
-
// ---
|
|
1047
|
+
// --- World lifecycle coverage ---
|
|
1048
1048
|
describe('World.spawn', () => {
|
|
1049
1049
|
it('single-component spawn returns a valid Entity handle', () => {
|
|
1050
1050
|
const world = new World();
|
|
@@ -1,17 +1,210 @@
|
|
|
1
|
-
import { describe, expect, it } from 'vitest';
|
|
2
|
-
import {
|
|
1
|
+
import { describe, expect, it, vi } from 'vitest';
|
|
2
|
+
import { createCommandBuffer, flushCommands } from '../commands';
|
|
3
|
+
import { componentId, defineComponent } from '../component';
|
|
4
|
+
import { ComponentNotPresentError } from '../errors';
|
|
3
5
|
import {
|
|
4
6
|
defineSharedKernel,
|
|
5
7
|
SHARED_KERNEL_EXECUTOR_RESOURCE_KEY,
|
|
6
8
|
type SharedKernelExecutor,
|
|
7
9
|
} from '../execution/shared-kernel';
|
|
10
|
+
import { defineRelationship } from '../relationship-index';
|
|
8
11
|
import { Update } from '../schedule-token';
|
|
9
12
|
import { World } from '../world';
|
|
13
|
+
import { worldInternal } from '../world-internal';
|
|
10
14
|
|
|
11
15
|
const Position = defineComponent('WorldHealthPosition', { x: 'f32' });
|
|
16
|
+
const { source: WorldHealthChildOf, target: WorldHealthChildren } = defineRelationship({
|
|
17
|
+
sourceName: 'WorldHealthChildOf',
|
|
18
|
+
sourceField: 'parent',
|
|
19
|
+
targetName: 'WorldHealthChildren',
|
|
20
|
+
targetField: 'entities',
|
|
21
|
+
});
|
|
12
22
|
function integrate(): void {}
|
|
13
23
|
|
|
14
24
|
describe('World execution health', () => {
|
|
25
|
+
it('poisons synchronous materialization after a row has been published', () => {
|
|
26
|
+
const world = new World();
|
|
27
|
+
const target = world.spawn().unwrap();
|
|
28
|
+
const injected = new ComponentNotPresentError(target as number, 'InjectedRelationshipFailure');
|
|
29
|
+
const mutationEpoch = world[worldInternal].getMutationEpoch();
|
|
30
|
+
const structureEpoch = world.getStructureEpoch();
|
|
31
|
+
const evidenceCursor = world[worldInternal].getStructuralEvidence().cursor;
|
|
32
|
+
const onInsert = vi.spyOn(
|
|
33
|
+
world as unknown as {
|
|
34
|
+
relationshipOnInsert: (...args: never[]) => unknown;
|
|
35
|
+
},
|
|
36
|
+
'relationshipOnInsert',
|
|
37
|
+
);
|
|
38
|
+
onInsert.mockReturnValueOnce({ ok: false, error: injected });
|
|
39
|
+
|
|
40
|
+
const failed = world.spawn({ component: WorldHealthChildOf, data: { parent: target } });
|
|
41
|
+
|
|
42
|
+
expect(failed.ok).toBe(false);
|
|
43
|
+
if (!failed.ok) expect(failed.error).toBe(injected);
|
|
44
|
+
expect(world.execution.health).toBe('poisoned');
|
|
45
|
+
expect(world.execution.fault?.partialWrite).toBe(true);
|
|
46
|
+
expect(world[worldInternal].getMutationEpoch()).toBe(mutationEpoch);
|
|
47
|
+
expect(world.getStructureEpoch()).toBe(structureEpoch);
|
|
48
|
+
expect(world[worldInternal].getStructuralEvidence().cursor).toBe(evidenceCursor);
|
|
49
|
+
const rejected = world.spawn();
|
|
50
|
+
expect(rejected.ok).toBe(false);
|
|
51
|
+
if (!rejected.ok) expect(rejected.error.code).toBe('world-poisoned');
|
|
52
|
+
});
|
|
53
|
+
|
|
54
|
+
it('poisons before reclaim when archetype-row append fails after table append', () => {
|
|
55
|
+
const world = new World();
|
|
56
|
+
const existing = world.spawn().unwrap();
|
|
57
|
+
const archetype = world[worldInternal].getEntityArchetype(existing);
|
|
58
|
+
if (archetype === undefined) throw new Error('fixture archetype missing');
|
|
59
|
+
const injected = new Error('injected archetype row allocation fault');
|
|
60
|
+
const rows = archetype.rows;
|
|
61
|
+
archetype.rows = new Proxy(rows, {
|
|
62
|
+
set() {
|
|
63
|
+
throw injected;
|
|
64
|
+
},
|
|
65
|
+
}) as typeof rows;
|
|
66
|
+
|
|
67
|
+
expect(() => world.spawn()).toThrow(injected);
|
|
68
|
+
expect(world.execution.health).toBe('poisoned');
|
|
69
|
+
expect(world.execution.fault?.partialWrite).toBe(true);
|
|
70
|
+
expect(world.update(0).ok).toBe(false);
|
|
71
|
+
const rejected = world.spawn();
|
|
72
|
+
expect(rejected.ok).toBe(false);
|
|
73
|
+
if (!rejected.ok) expect(rejected.error.code).toBe('world-poisoned');
|
|
74
|
+
});
|
|
75
|
+
|
|
76
|
+
it('poisons deferred materialization on a real relationship storage failure', () => {
|
|
77
|
+
const world = new World();
|
|
78
|
+
const target = world.spawn({ component: WorldHealthChildren, data: { entities: [] } }).unwrap();
|
|
79
|
+
const targetArchetype = world[worldInternal].getEntityArchetype(target);
|
|
80
|
+
if (targetArchetype === undefined) throw new Error('fixture target archetype missing');
|
|
81
|
+
const targetTable = world[worldInternal].getGraph().tables[targetArchetype.tableId];
|
|
82
|
+
const targetStorage = targetTable?.storage.get(componentId(WorldHealthChildren));
|
|
83
|
+
if (targetStorage === undefined) throw new Error('fixture target storage missing');
|
|
84
|
+
targetStorage.fields.delete('entities:count');
|
|
85
|
+
|
|
86
|
+
const buffer = createCommandBuffer(world, {
|
|
87
|
+
systemName: 'relationship-flush',
|
|
88
|
+
scheduleName: Update.name,
|
|
89
|
+
});
|
|
90
|
+
const pending = buffer.spawn({ component: WorldHealthChildOf, data: { parent: target } });
|
|
91
|
+
const mutationEpoch = world[worldInternal].getMutationEpoch();
|
|
92
|
+
const evidenceCursor = world[worldInternal].getStructuralEvidence().cursor;
|
|
93
|
+
|
|
94
|
+
expect(() => flushCommands(buffer, world)).toThrow();
|
|
95
|
+
expect(buffer.status).toBe('aborted');
|
|
96
|
+
expect(world.execution.health).toBe('poisoned');
|
|
97
|
+
expect(world.execution.fault?.partialWrite).toBe(true);
|
|
98
|
+
expect(world.hasComponent(pending, WorldHealthChildOf)).toBe(true);
|
|
99
|
+
expect(world[worldInternal].getMutationEpoch()).toBe(mutationEpoch);
|
|
100
|
+
expect(world[worldInternal].getStructuralEvidence().cursor).toBe(evidenceCursor);
|
|
101
|
+
const rejected = world.spawn();
|
|
102
|
+
expect(rejected.ok).toBe(false);
|
|
103
|
+
if (!rejected.ok) expect(rejected.error.code).toBe('world-poisoned');
|
|
104
|
+
});
|
|
105
|
+
|
|
106
|
+
it('publishes target mirror evidence for direct addComponent', () => {
|
|
107
|
+
const world = new World();
|
|
108
|
+
const parent = world.spawn().unwrap();
|
|
109
|
+
const child = world.spawn().unwrap();
|
|
110
|
+
const added = world
|
|
111
|
+
.query({ read: [WorldHealthChildren], added: [WorldHealthChildren] })
|
|
112
|
+
.unwrap();
|
|
113
|
+
const childAdded = world
|
|
114
|
+
.query({ read: [WorldHealthChildOf], added: [WorldHealthChildOf] })
|
|
115
|
+
.unwrap();
|
|
116
|
+
const mutationEpoch = world[worldInternal].getMutationEpoch();
|
|
117
|
+
const structureEpoch = world.getStructureEpoch();
|
|
118
|
+
const evidenceCursor = world[worldInternal].getStructuralEvidence().cursor;
|
|
119
|
+
|
|
120
|
+
world.addComponent(child, { component: WorldHealthChildOf, data: { parent } }).unwrap();
|
|
121
|
+
|
|
122
|
+
expect(Array.from(added, (row) => row.entity)).toEqual([parent]);
|
|
123
|
+
expect(Array.from(childAdded, (row) => row.entity)).toEqual([child]);
|
|
124
|
+
expect(world.get(parent, WorldHealthChildren).unwrap().entities).toEqual(
|
|
125
|
+
new Uint32Array([child as number]),
|
|
126
|
+
);
|
|
127
|
+
const targetChange = world[worldInternal].getComponentChange(
|
|
128
|
+
parent,
|
|
129
|
+
componentId(WorldHealthChildren),
|
|
130
|
+
);
|
|
131
|
+
expect(targetChange?.added).toBeGreaterThan(0);
|
|
132
|
+
expect(world[worldInternal].getMutationEpoch()).toBeGreaterThan(mutationEpoch);
|
|
133
|
+
expect(world.getStructureEpoch()).toBeGreaterThan(structureEpoch);
|
|
134
|
+
const evidence = world[worldInternal].getStructuralEvidence().readAfter(evidenceCursor);
|
|
135
|
+
expect(evidence.status).toBe('ok');
|
|
136
|
+
if (evidence.status === 'ok') {
|
|
137
|
+
expect(evidence.events).toEqual(
|
|
138
|
+
expect.arrayContaining([
|
|
139
|
+
expect.objectContaining({
|
|
140
|
+
kind: 'component-added',
|
|
141
|
+
entity: parent,
|
|
142
|
+
componentId: componentId(WorldHealthChildren),
|
|
143
|
+
}),
|
|
144
|
+
expect.objectContaining({
|
|
145
|
+
kind: 'component-added',
|
|
146
|
+
entity: child,
|
|
147
|
+
componentId: componentId(WorldHealthChildOf),
|
|
148
|
+
}),
|
|
149
|
+
]),
|
|
150
|
+
);
|
|
151
|
+
}
|
|
152
|
+
});
|
|
153
|
+
|
|
154
|
+
it('publishes target mirror evidence through addChild', () => {
|
|
155
|
+
const world = new World();
|
|
156
|
+
const parent = world.spawn().unwrap();
|
|
157
|
+
const child = world.spawn().unwrap();
|
|
158
|
+
const added = world
|
|
159
|
+
.query({ read: [WorldHealthChildren], added: [WorldHealthChildren] })
|
|
160
|
+
.unwrap();
|
|
161
|
+
const mutationEpoch = world[worldInternal].getMutationEpoch();
|
|
162
|
+
const structureEpoch = world.getStructureEpoch();
|
|
163
|
+
|
|
164
|
+
world.addChild(parent, child, WorldHealthChildOf, { parent }).unwrap();
|
|
165
|
+
|
|
166
|
+
expect(Array.from(added, (row) => row.entity)).toEqual([parent]);
|
|
167
|
+
expect(world[worldInternal].getMutationEpoch()).toBeGreaterThan(mutationEpoch);
|
|
168
|
+
expect(world.getStructureEpoch()).toBeGreaterThan(structureEpoch);
|
|
169
|
+
expect(world.get(parent, WorldHealthChildren).unwrap().entities).toEqual(
|
|
170
|
+
new Uint32Array([child as number]),
|
|
171
|
+
);
|
|
172
|
+
});
|
|
173
|
+
|
|
174
|
+
it('preserves target mirror evidence across exclusive reparent', () => {
|
|
175
|
+
const world = new World();
|
|
176
|
+
const firstParent = world.spawn().unwrap();
|
|
177
|
+
const secondParent = world.spawn().unwrap();
|
|
178
|
+
const child = world
|
|
179
|
+
.spawn({ component: WorldHealthChildOf, data: { parent: firstParent } })
|
|
180
|
+
.unwrap();
|
|
181
|
+
const added = world
|
|
182
|
+
.query({ read: [WorldHealthChildren], added: [WorldHealthChildren] })
|
|
183
|
+
.unwrap();
|
|
184
|
+
expect(Array.from(added, (row) => row.entity)).toEqual([firstParent]);
|
|
185
|
+
const childAdded = world
|
|
186
|
+
.query({ read: [WorldHealthChildOf], added: [WorldHealthChildOf] })
|
|
187
|
+
.unwrap();
|
|
188
|
+
expect(Array.from(childAdded, (row) => row.entity)).toEqual([child]);
|
|
189
|
+
const mutationEpoch = world[worldInternal].getMutationEpoch();
|
|
190
|
+
const structureEpoch = world.getStructureEpoch();
|
|
191
|
+
|
|
192
|
+
world
|
|
193
|
+
.addComponent(child, { component: WorldHealthChildOf, data: { parent: secondParent } })
|
|
194
|
+
.unwrap();
|
|
195
|
+
|
|
196
|
+
expect(Array.from(added, (row) => row.entity)).toEqual([secondParent]);
|
|
197
|
+
expect(Array.from(childAdded, (row) => row.entity)).toEqual([child]);
|
|
198
|
+
expect(world[worldInternal].getMutationEpoch()).toBeGreaterThan(mutationEpoch);
|
|
199
|
+
expect(world.getStructureEpoch()).toBeGreaterThan(structureEpoch);
|
|
200
|
+
expect(world.get(firstParent, WorldHealthChildren).unwrap().entities).toEqual(
|
|
201
|
+
new Uint32Array(),
|
|
202
|
+
);
|
|
203
|
+
expect(world.get(secondParent, WorldHealthChildren).unwrap().entities).toEqual(
|
|
204
|
+
new Uint32Array([child as number]),
|
|
205
|
+
);
|
|
206
|
+
});
|
|
207
|
+
|
|
15
208
|
it('transitions once to poisoned after a possible partial write and rejects future update', () => {
|
|
16
209
|
const world = new World();
|
|
17
210
|
world.spawn({ component: Position, data: { x: 1 } }).unwrap();
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
import { describe, expect, it } from 'vitest';
|
|
2
|
+
import { defineRelationship } from '../relationship-index';
|
|
3
|
+
import { World } from '../world';
|
|
4
|
+
import { worldRead } from '../world-read';
|
|
5
|
+
|
|
6
|
+
const relationship = defineRelationship({
|
|
7
|
+
sourceName: 'WorldReadSource',
|
|
8
|
+
sourceField: 'target',
|
|
9
|
+
targetName: 'WorldReadTargets',
|
|
10
|
+
targetField: 'sources',
|
|
11
|
+
});
|
|
12
|
+
|
|
13
|
+
describe('World semantic read seam', () => {
|
|
14
|
+
it('reads relationship facts without exposing a storage view', () => {
|
|
15
|
+
const world = new World();
|
|
16
|
+
const target = world.spawn().unwrap();
|
|
17
|
+
const source = world.spawn({ component: relationship.source, data: { target } }).unwrap();
|
|
18
|
+
|
|
19
|
+
expect(world[worldRead].getFieldValue(source, relationship.source, 'target')).toBe(
|
|
20
|
+
target as number,
|
|
21
|
+
);
|
|
22
|
+
expect(world[worldRead].getArrayLength(target, relationship.target, 'sources')).toBe(1);
|
|
23
|
+
expect(world[worldRead].getArrayElement(target, relationship.target, 'sources', 0)).toBe(
|
|
24
|
+
source as number,
|
|
25
|
+
);
|
|
26
|
+
expect(world[worldRead].getArrayElement(target, relationship.target, 'sources', 1)).toBe(
|
|
27
|
+
undefined,
|
|
28
|
+
);
|
|
29
|
+
});
|
|
30
|
+
});
|
package/src/commands.ts
CHANGED
|
@@ -22,6 +22,7 @@ import {
|
|
|
22
22
|
StaleEntityError,
|
|
23
23
|
SystemFailedError,
|
|
24
24
|
} from './errors';
|
|
25
|
+
import type { WorldExecutionState } from './execution/shared-kernel';
|
|
25
26
|
import { isRelationshipTarget, relationshipRole } from './relationship-index';
|
|
26
27
|
import type { ComponentData, EcsError } from './world';
|
|
27
28
|
import { type WorldInternal, worldInternal } from './world-internal';
|
|
@@ -73,6 +74,7 @@ export interface CommandBuffer {
|
|
|
73
74
|
/** Minimal world interface needed by CommandBuffer for entity allocation. */
|
|
74
75
|
export interface WorldForCommands {
|
|
75
76
|
readonly [worldInternal]: WorldInternal;
|
|
77
|
+
readonly execution: WorldExecutionState;
|
|
76
78
|
/**
|
|
77
79
|
* Allocate a pending entity index, returning [entity handle, index slot].
|
|
78
80
|
* @internal
|
|
@@ -569,6 +571,11 @@ export function flushCommands(buffer: CommandBufferImpl, world: WorldForCommands
|
|
|
569
571
|
throw error;
|
|
570
572
|
}
|
|
571
573
|
let applied = 0;
|
|
574
|
+
// Once the preflight boundary has passed, a command may have touched
|
|
575
|
+
// storage even when its Result is an error (for example relationship
|
|
576
|
+
// maintenance after a row was appended). `applied` is intentionally not
|
|
577
|
+
// used as the poison decision: it only counts commands that returned ok.
|
|
578
|
+
let mutationStarted = false;
|
|
572
579
|
let commandIndex = -1;
|
|
573
580
|
let currentCommand: Command | undefined;
|
|
574
581
|
let lastCommittedCommand: CommandCommitEvidence | null = null;
|
|
@@ -590,6 +597,7 @@ export function flushCommands(buffer: CommandBufferImpl, world: WorldForCommands
|
|
|
590
597
|
currentCommand = cmd;
|
|
591
598
|
switch (cmd.type) {
|
|
592
599
|
case 'spawn':
|
|
600
|
+
mutationStarted = true;
|
|
593
601
|
requireSuccess(
|
|
594
602
|
world[worldInternal].materializePendingEntity(cmd.entity, cmd.componentDatas),
|
|
595
603
|
);
|
|
@@ -598,16 +606,19 @@ export function flushCommands(buffer: CommandBufferImpl, world: WorldForCommands
|
|
|
598
606
|
lastCommittedCommand = { index: commandIndex, kind: cmd.type };
|
|
599
607
|
break;
|
|
600
608
|
case 'despawn':
|
|
609
|
+
mutationStarted = true;
|
|
601
610
|
requireSuccess(world.despawn(cmd.entity));
|
|
602
611
|
applied += 1;
|
|
603
612
|
lastCommittedCommand = { index: commandIndex, kind: cmd.type };
|
|
604
613
|
break;
|
|
605
614
|
case 'addComponent':
|
|
615
|
+
mutationStarted = true;
|
|
606
616
|
requireSuccess(world.addComponent(cmd.entity, cmd.componentData));
|
|
607
617
|
applied += 1;
|
|
608
618
|
lastCommittedCommand = { index: commandIndex, kind: cmd.type };
|
|
609
619
|
break;
|
|
610
620
|
case 'removeComponent':
|
|
621
|
+
mutationStarted = true;
|
|
611
622
|
requireSuccess(world.removeComponent(cmd.entity, cmd.component));
|
|
612
623
|
applied += 1;
|
|
613
624
|
lastCommittedCommand = { index: commandIndex, kind: cmd.type };
|
|
@@ -618,7 +629,7 @@ export function flushCommands(buffer: CommandBufferImpl, world: WorldForCommands
|
|
|
618
629
|
} catch (error) {
|
|
619
630
|
buffer.abort(error);
|
|
620
631
|
if (error instanceof CommandFailedError) throw error;
|
|
621
|
-
if (applied === 0) {
|
|
632
|
+
if (!mutationStarted && applied === 0) {
|
|
622
633
|
throw commandFailure(
|
|
623
634
|
buffer,
|
|
624
635
|
Math.max(commandIndex, 0),
|
|
@@ -626,14 +637,16 @@ export function flushCommands(buffer: CommandBufferImpl, world: WorldForCommands
|
|
|
626
637
|
error,
|
|
627
638
|
);
|
|
628
639
|
}
|
|
629
|
-
|
|
630
|
-
|
|
631
|
-
|
|
632
|
-
|
|
633
|
-
|
|
634
|
-
|
|
635
|
-
|
|
636
|
-
|
|
640
|
+
if (world.execution.health === 'healthy') {
|
|
641
|
+
const poison = world[worldInternal].poisonExecution;
|
|
642
|
+
poison({
|
|
643
|
+
code: 'shared-kernel-failed',
|
|
644
|
+
kernelName: 'CommandBuffer.flush',
|
|
645
|
+
cause: error,
|
|
646
|
+
partialWrite: true,
|
|
647
|
+
retryable: false,
|
|
648
|
+
});
|
|
649
|
+
}
|
|
637
650
|
throw new SystemFailedError(
|
|
638
651
|
buffer._systemName,
|
|
639
652
|
buffer._scheduleName,
|
package/src/internal.ts
CHANGED
|
@@ -7,9 +7,11 @@
|
|
|
7
7
|
// owning package share the exact query implementation without a private path
|
|
8
8
|
// import or an untyped cast at each consumer.
|
|
9
9
|
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
10
|
+
// Keep this entry limited to package-owner metadata and the derived writer.
|
|
11
|
+
// Raw World storage stays source-private; semantic World reads live behind the
|
|
12
|
+
// separate `./world-read` entry.
|
|
13
|
+
export { componentId, componentSchema } from './component';
|
|
14
|
+
export { componentDefinition } from './component-schema';
|
|
13
15
|
|
|
14
16
|
import type { Result } from '@forgeax/engine-types';
|
|
15
17
|
import type { Component } from './component';
|