@daneren2005/shared-memory-ecs 1.0.0 → 1.0.1

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/package.json CHANGED
@@ -2,7 +2,7 @@
2
2
  "name": "@daneren2005/shared-memory-ecs",
3
3
  "description": "A small, reusable Entity/Component/System core backed by shared memory.",
4
4
  "author": "Scott Jackson",
5
- "version": "1.0.0",
5
+ "version": "1.0.1",
6
6
  "type": "module",
7
7
  "repository": {
8
8
  "type": "git",
@@ -27,7 +27,7 @@
27
27
  ],
28
28
  "scripts": {
29
29
  "build": "vite build && tsc --emitDeclarationOnly",
30
- "type-check": "tsc --noEmit -p tsconfig.test.json",
30
+ "type-check": "tsc --noEmit",
31
31
  "lint": "cross-env NODE_ENV=production oxlint .",
32
32
  "lint:fix": "cross-env NODE_ENV=production oxlint --fix .",
33
33
  "test": "vitest run",
@@ -39,7 +39,6 @@
39
39
  "eventemitter3": "^3.1.2"
40
40
  },
41
41
  "devDependencies": {
42
- "@semantic-release/changelog": "^6.0.3",
43
42
  "@semantic-release/git": "^10.0.1",
44
43
  "@stylistic/eslint-plugin": "^5.10.0",
45
44
  "@types/node": "^26.1.1",
@@ -1,17 +0,0 @@
1
- import type { TypedArrayConstructor } from '@daneren2005/shared-memory-objects';
2
- import type MemoryComponent from './memory-component';
3
- import type { ComponentTypedArray } from './memory-component';
4
- import type BaseEntity from './entity';
5
- export interface BaseComponent {
6
- index: number;
7
- }
8
- export type ComponentMap = Record<string, BaseComponent>;
9
- export interface ComponentDefinition<Component extends BaseComponent, T extends ComponentTypedArray = ComponentTypedArray, Config = any, Serialization = any> {
10
- type: TypedArrayConstructor<T>;
11
- size: number;
12
- load(entity: BaseEntity, memory: MemoryComponent<T>, config: Config): Component;
13
- save?(component: Component): Serialization;
14
- }
15
- export type ComponentRegistry<C extends ComponentMap> = {
16
- [K in keyof C]: ComponentDefinition<C[K]>;
17
- };
package/dist/entity.d.ts DELETED
@@ -1,28 +0,0 @@
1
- import { EventEmitter } from 'eventemitter3';
2
- import type BaseWorld from './world';
3
- import type { ComponentMap } from './component-definition';
4
- export default class BaseEntity<C extends ComponentMap = ComponentMap> extends EventEmitter {
5
- static eidCounter: number;
6
- readonly eid: number;
7
- id?: string;
8
- config?: any;
9
- world: BaseWorld<C>;
10
- components: Partial<C>;
11
- dead: boolean;
12
- isStatic: boolean;
13
- constructor(world: BaseWorld<C>, config?: any);
14
- loadComponent<K extends keyof C>(name: K, config: any): C[K];
15
- removeComponent<K extends keyof C>(name: K): void;
16
- setComponent<K extends keyof C, P extends keyof C[K]>(componentName: K, prop: P, value: C[K][P]): void;
17
- /**
18
- * NOTE: Does not emit component-property-updated!
19
- */
20
- setComponentBulk<K extends keyof C>(componentName: K, values: Partial<C[K]>): void;
21
- deleteComponent<K extends keyof C>(componentName: K, prop: keyof C[K]): void;
22
- deleteAllComponentMemory(): void;
23
- load(config: any): void;
24
- save(): {
25
- [key: string]: any;
26
- };
27
- finishLoading(): void;
28
- }
package/dist/index.d.ts DELETED
@@ -1,18 +0,0 @@
1
- export { default as BaseWorld } from './world';
2
- export type { WorldOptions } from './world';
3
- export { default as BaseEntity } from './entity';
4
- export { default as MemoryComponent } from './memory-component';
5
- export type { ComponentTypedArray } from './memory-component';
6
- export type { BaseComponent, ComponentMap, ComponentDefinition, ComponentRegistry, } from './component-definition';
7
- export { default as System } from './systems/system';
8
- export type { SystemConfig } from './systems/system';
9
- export { default as IterableSystem } from './systems/iterable-system';
10
- export type { IterableSystemConfig } from './systems/iterable-system';
11
- export { default as EntitySystem } from './systems/entity-system';
12
- export type { EntitySystemConfig } from './systems/entity-system';
13
- export { default as ComponentSystem } from './systems/component-system';
14
- export type { ComponentSystemConfig, ComponentSystemQuery, ComponentSystemWorld, ComponentSystemCallbacks, EntityUpdateComponents, EntityQueryComponents, EntityUpdateFunction, EntityUpdatePreRunFunction, EntityRemovedFunction, UpdateEntityConfig, UpdateEntityConfigObject, } from './systems/component-system';
15
- export { default as WebWorker } from './systems/workers/web-worker';
16
- export { default as ComponentWebWorker } from './systems/workers/component-web-worker';
17
- export { default as createComponentWorker } from './systems/workers/create-component-worker';
18
- export type { default as ComponentWorkerMessage } from './systems/workers/component-worker-message';
@@ -1,15 +0,0 @@
1
- import { LocalPool, type MemoryHeap, type TypedArrayConstructor } from '@daneren2005/shared-memory-objects';
2
- export type ComponentTypedArray = Uint32Array | Int32Array | Float32Array | Float64Array;
3
- export default class MemoryComponent<T extends ComponentTypedArray = ComponentTypedArray> {
4
- heap: MemoryHeap;
5
- pool: LocalPool<T>;
6
- constructor(heap: MemoryHeap, type: TypedArrayConstructor<T>, dataLength: number);
7
- get length(): number;
8
- get rawLength(): number;
9
- create(values: Array<number>): number;
10
- getBlock(index: number): T;
11
- get(index: number, dataIndex: number): number;
12
- set(index: number, dataIndex: number, value: number): void;
13
- delete(index: number): void;
14
- clear(): void;
15
- }
@@ -1,76 +0,0 @@
1
- import type BaseWorld from '../world';
2
- import type BaseEntity from '../entity';
3
- import type { BaseComponent, ComponentMap } from '../component-definition';
4
- import type { ComponentTypedArray } from '../memory-component';
5
- import System, { type SystemConfig } from './system';
6
- import ComponentWebWorker from './workers/component-web-worker';
7
- export default abstract class ComponentSystem<C extends ComponentMap = ComponentMap, T extends EntityUpdateComponents<C> = EntityUpdateComponents<C>> extends System<C> {
8
- entities: Array<BaseEntity<C>>;
9
- options: ComponentSystemConfig<C, T>;
10
- worker: Worker | ComponentWebWorker<C, T>;
11
- isWorkerThread: boolean;
12
- private loaded;
13
- private loadingPromise;
14
- private isRunning;
15
- private queryEntityComponentCache;
16
- private queryEntities;
17
- private removedEntityBuffer;
18
- addDataToWorld?(world: ComponentSystemWorld): void;
19
- constructor(world: BaseWorld<C>, options: ComponentSystemConfig<C, T>);
20
- private initWorker;
21
- init(): Promise<void> | void;
22
- update(elapsedTime: number): boolean;
23
- run(elapsedTime: number): void;
24
- runQuery(queryName: string, entities: Array<BaseEntity<C>>, query: ComponentSystemQuery<C>): Array<UpdateEntityConfig<T>>;
25
- isEntityInSystem(entity: BaseEntity<C>): boolean;
26
- private matchesQuery;
27
- private updateEntityList;
28
- checkAddEntity(entity: BaseEntity<C>): boolean;
29
- removeEntity(entity: BaseEntity<C>): void;
30
- shouldRun(): boolean;
31
- destroy(): void;
32
- }
33
- export type EntityUpdateComponents<C extends ComponentMap = ComponentMap> = {
34
- [K in keyof C]?: ComponentTypedArray;
35
- };
36
- export type EntityQueryComponents<C extends ComponentMap = ComponentMap> = {
37
- [key: string]: Array<{
38
- entityId: number;
39
- components: EntityUpdateComponents<C>;
40
- }>;
41
- };
42
- type EntityUpdateFunctionImpl<C extends ComponentMap, T extends EntityUpdateComponents<C>> = (world: ComponentSystemWorld, entityId: number, components: T, queries: EntityQueryComponents<C>, callbacks: ComponentSystemCallbacks<C>) => void;
43
- export type EntityUpdateFunction<C extends ComponentMap, T extends EntityUpdateComponents<C> = EntityUpdateComponents<C>> = EntityUpdateFunctionImpl<C, T> & {
44
- preRun?: EntityUpdatePreRunFunction<C, T>;
45
- entityRemoved?: EntityRemovedFunction<C>;
46
- };
47
- export type EntityUpdatePreRunFunction<C extends ComponentMap, T extends EntityUpdateComponents<C>> = (world: ComponentSystemWorld, entities: Array<UpdateEntityConfigObject<T>>, queries: EntityQueryComponents<C>, callbacks: ComponentSystemCallbacks<C>) => void;
48
- export type EntityRemovedFunction<C extends ComponentMap = ComponentMap> = (world: ComponentSystemWorld, entityId: number, callbacks: ComponentSystemCallbacks<C>) => void;
49
- export type UpdateEntityConfig<T extends EntityUpdateComponents = EntityUpdateComponents> = number | UpdateEntityConfigObject<T>;
50
- export type UpdateEntityConfigObject<T extends EntityUpdateComponents> = {
51
- entityId: number;
52
- components: T;
53
- };
54
- export interface ComponentSystemWorld {
55
- gameTime: number;
56
- elapsedTime: number;
57
- [key: string]: unknown;
58
- }
59
- export interface ComponentSystemCallbacks<C extends ComponentMap = ComponentMap> {
60
- entityComponentChanged<K extends keyof C, P extends keyof C[K]>(entityId: number, componentName: K, prop: P, value: C[K][P]): void;
61
- }
62
- export interface ComponentSystemQuery<C extends ComponentMap = ComponentMap> {
63
- required: Array<keyof C>;
64
- optional?: Array<keyof C>;
65
- not?: Array<keyof C>;
66
- filter?: (entity: BaseEntity<C>) => boolean;
67
- }
68
- export interface ComponentSystemConfig<C extends ComponentMap, T extends EntityUpdateComponents<C>> extends SystemConfig, ComponentSystemQuery<C> {
69
- updateFunction: EntityUpdateFunction<C, T>;
70
- getWorker: () => Worker;
71
- forceMainThread?: boolean;
72
- queries?: {
73
- [key: string]: ComponentSystemQuery<C>;
74
- };
75
- }
76
- export type { BaseComponent };
@@ -1,21 +0,0 @@
1
- import type BaseWorld from '../world';
2
- import type BaseEntity from '../entity';
3
- import type { ComponentMap } from '../component-definition';
4
- import IterableSystem, { type IterableSystemConfig } from './iterable-system';
5
- export default abstract class EntitySystem<C extends ComponentMap, T extends BaseEntity<C> = BaseEntity<C>> extends IterableSystem<C, T> {
6
- entities: Array<T>;
7
- options: EntitySystemConfig<C>;
8
- constructor(world: BaseWorld<C>, options?: EntitySystemConfig<C>);
9
- getIterables(): Array<T>;
10
- updateIterable(entity: T, elapsedTime: number): void;
11
- filterEntity(entity: BaseEntity<C>): boolean;
12
- isEntityInSystem(entity: BaseEntity<C>): boolean;
13
- abstract updateEntity(entity: T, elapsedTime: number): void;
14
- checkAddEntity(entity: BaseEntity<C>): boolean;
15
- removeEntity(entity: BaseEntity<C>): void;
16
- shouldRun(): boolean;
17
- }
18
- export interface EntitySystemConfig<C extends ComponentMap> extends IterableSystemConfig {
19
- components?: Array<keyof C>;
20
- updateEntityOnAdd?: boolean;
21
- }
@@ -1,21 +0,0 @@
1
- import type BaseWorld from '../world';
2
- import type { ComponentMap } from '../component-definition';
3
- import System, { type SystemConfig } from './system';
4
- export default abstract class IterableSystem<C extends ComponentMap, T> extends System<C> {
5
- remainingInstancesToRun: Array<T>;
6
- remainingInstancesStartTime: number | null;
7
- iterationsPerCheck: number;
8
- maxMsPerFrame: number;
9
- constructor(world: BaseWorld<C>, options: IterableSystemConfig);
10
- clear(): void;
11
- update(elapsedTime: number): boolean;
12
- run(elapsedTime: number): void;
13
- runIterables(iterables: Array<T>, elapsedTime: number): void;
14
- beforeRunIterables(): void;
15
- abstract getIterables(): Array<T>;
16
- abstract updateIterable(iterable: T, elapsedTime: number): void;
17
- }
18
- export interface IterableSystemConfig extends SystemConfig {
19
- iterationsPerCheck?: number;
20
- maxMsPerFrame?: number;
21
- }
@@ -1,22 +0,0 @@
1
- import type BaseWorld from '../world';
2
- import type { ComponentMap } from '../component-definition';
3
- export default abstract class System<C extends ComponentMap = ComponentMap> {
4
- world: BaseWorld<C>;
5
- name: string;
6
- currentDelta: number;
7
- deltaBetweenRuns: number;
8
- firstRun: boolean;
9
- constructor(world: BaseWorld<C>, options?: SystemConfig);
10
- init(): void | Promise<void>;
11
- clear(): void;
12
- finishLoading(): void;
13
- update(elapsedTime: number): boolean;
14
- abstract run(elapsedTime: number): void;
15
- shouldRun(): boolean;
16
- destroy(): void;
17
- }
18
- export interface SystemConfig {
19
- name: string;
20
- deltaBetweenRuns?: number;
21
- firstRun?: boolean;
22
- }
@@ -1,10 +0,0 @@
1
- import WebWorker from './web-worker';
2
- import type ComponentWorkerMessage from './component-worker-message';
3
- import type { ComponentMap } from '../../component-definition';
4
- import type { EntityUpdateComponents, EntityUpdateFunction } from '../component-system';
5
- export default class ComponentWebWorker<C extends ComponentMap, T extends EntityUpdateComponents<C>> extends WebWorker {
6
- private updateFunction;
7
- constructor(updateFunction: EntityUpdateFunction<C, T>);
8
- postMessage(message: ComponentWorkerMessage): void;
9
- onMessageTyped(message: ComponentWorkerMessage): void;
10
- }
@@ -1,27 +0,0 @@
1
- import type { ComponentSystemWorld, UpdateEntityConfig } from '../component-system';
2
- interface InitMessage {
3
- type: 'init';
4
- }
5
- interface LoadedMessage {
6
- type: 'loaded';
7
- }
8
- interface RunUpdateMessage {
9
- type: 'run';
10
- world: ComponentSystemWorld;
11
- entities: Array<UpdateEntityConfig>;
12
- queries: {
13
- [key: string]: Array<UpdateEntityConfig>;
14
- };
15
- removed: Array<number>;
16
- }
17
- interface EntityEventsMessage {
18
- type: 'run-complete';
19
- runTime: number;
20
- events: Array<{
21
- entityId: number;
22
- event: string;
23
- args: Array<any>;
24
- }>;
25
- }
26
- type ComponentWorkerMessage = InitMessage | LoadedMessage | RunUpdateMessage | EntityEventsMessage;
27
- export default ComponentWorkerMessage;
@@ -1,3 +0,0 @@
1
- import type { ComponentMap } from '../../component-definition';
2
- import type { EntityUpdateComponents, EntityUpdateFunction } from '../component-system';
3
- export default function createComponentWorker<C extends ComponentMap, T extends EntityUpdateComponents<C>>(updateFunction: EntityUpdateFunction<C, T>): void;
@@ -1,4 +0,0 @@
1
- export default abstract class WebWorker {
2
- abstract postMessage(message: any): void | Promise<void>;
3
- onmessage(message: any, transferrables?: Array<any>): void;
4
- }
package/dist/world.d.ts DELETED
@@ -1,39 +0,0 @@
1
- import { EventEmitter } from 'eventemitter3';
2
- import { MemoryHeap } from '@daneren2005/shared-memory-objects';
3
- import MemoryComponent from './memory-component';
4
- import BaseEntity from './entity';
5
- import type System from './systems/system';
6
- import type { ComponentMap, ComponentRegistry } from './component-definition';
7
- export interface WorldOptions {
8
- heapSize?: number;
9
- }
10
- export default class BaseWorld<C extends ComponentMap = ComponentMap> extends EventEmitter {
11
- heap: MemoryHeap;
12
- registry: ComponentRegistry<C>;
13
- components: {
14
- [K in keyof C]: MemoryComponent;
15
- };
16
- entities: Array<BaseEntity<C>>;
17
- entitiesByEid: {
18
- [eid: number]: BaseEntity<C>;
19
- };
20
- systems: Array<System<C>>;
21
- gameTime: number;
22
- destroyed: boolean;
23
- constructor(registry: ComponentRegistry<C>, options?: WorldOptions);
24
- init(): Promise<void>;
25
- addEntity(entity: BaseEntity<C>, created?: boolean): BaseEntity<C>;
26
- loadEntity(config: any, created?: boolean): BaseEntity<C>;
27
- removeEntity(entity: BaseEntity<C>): void;
28
- getEntityByEid(eid: number): BaseEntity<C> | undefined;
29
- addSystem<T extends System<C>>(system: T): T;
30
- addSystemIfNotExists(system: System<C>): void;
31
- removeSystem(name: string): void;
32
- update(elapsedTime: number): {
33
- lastSystemError?: Error | null;
34
- };
35
- addEntityToComponentSystem(entity: BaseEntity<C>, component: keyof C): void;
36
- removeEntityFromComponentSystem(entity: BaseEntity<C>, component: keyof C): void;
37
- private componentAffectsComponentSystem;
38
- destroy(): void;
39
- }