@daneren2005/shared-memory-ecs 1.5.1 → 1.7.0

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.
Files changed (32) hide show
  1. package/README.md +222 -44
  2. package/dist/actions/add-component-worker.d.ts +3 -0
  3. package/dist/actions/build-worker-entity.d.ts +4 -2
  4. package/dist/actions/create-entity-worker.d.ts +2 -2
  5. package/dist/actions/kill-entity-worker.d.ts +2 -2
  6. package/dist/actions/remove-component-worker.d.ts +3 -0
  7. package/dist/component-definition.d.ts +2 -0
  8. package/dist/create-system-worker-DURlIMia.js +345 -0
  9. package/dist/create-system-worker-DURlIMia.js.map +1 -0
  10. package/dist/entity-class.d.ts +51 -0
  11. package/dist/entity-component.d.ts +7 -2
  12. package/dist/entity-factory.d.ts +21 -5
  13. package/dist/entity.d.ts +11 -2
  14. package/dist/index.d.ts +15 -8
  15. package/dist/index.js +379 -166
  16. package/dist/index.js.map +1 -1
  17. package/dist/systems/{component-system.d.ts → entity-worker-system.d.ts} +39 -18
  18. package/dist/systems/system.d.ts +1 -1
  19. package/dist/systems/worker-system.d.ts +22 -0
  20. package/dist/systems/workers/apply-query-delta.d.ts +1 -1
  21. package/dist/systems/workers/create-entity-system-worker.d.ts +8 -0
  22. package/dist/systems/workers/create-system-worker.d.ts +9 -0
  23. package/dist/systems/workers/entity-system-web-worker.d.ts +18 -0
  24. package/dist/systems/workers/{component-worker-message.d.ts → entity-system-worker-message.d.ts} +8 -4
  25. package/dist/worker.d.ts +10 -6
  26. package/dist/worker.js +2 -2
  27. package/dist/world.d.ts +17 -17
  28. package/package.json +2 -1
  29. package/dist/create-component-worker-BM942gjg.js +0 -288
  30. package/dist/create-component-worker-BM942gjg.js.map +0 -1
  31. package/dist/systems/workers/component-web-worker.d.ts +0 -17
  32. package/dist/systems/workers/create-component-worker.d.ts +0 -8
@@ -4,11 +4,11 @@ import type BaseEntity from '../entity';
4
4
  import type { BaseComponent, ComponentDefinitionMap, ComponentMap } from '../component-definition';
5
5
  import type { ComponentTypedArray } from '../memory-component';
6
6
  import System, { type SystemConfig } from './system';
7
- import ComponentWebWorker from './workers/component-web-worker';
8
- export default abstract class ComponentSystem<C extends ComponentMap, T extends EntityUpdateComponents<C>, W extends ComponentSystemWorld = ComponentSystemWorld, D = unknown> extends System<C> {
7
+ import EntitySystemWebWorker from './workers/entity-system-web-worker';
8
+ export default abstract class EntityWorkerSystem<C extends ComponentMap, T extends EntityUpdateComponents<C>, W extends EntityWorkerSystemWorld = EntityWorkerSystemWorld, D = unknown> extends System<C> {
9
9
  entities: Map<number, BaseEntity<C>>;
10
- options: ComponentSystemConfig<C, T, W, D>;
11
- worker: Worker | ComponentWebWorker<C, T, W, D>;
10
+ options: EntityWorkerSystemConfig<C, T, W, D>;
11
+ worker: Worker | EntitySystemWebWorker<C, T, W, D>;
12
12
  isWorkerThread: boolean;
13
13
  private initialized;
14
14
  private initPromise;
@@ -16,10 +16,12 @@ export default abstract class ComponentSystem<C extends ComponentMap, T extends
16
16
  private runCompletePromise;
17
17
  private isRunning;
18
18
  private generation;
19
- private queryEntities;
19
+ protected queryEntities: {
20
+ [key: string]: Map<number, BaseEntity<C>>;
21
+ };
20
22
  private queryDeltas;
21
23
  addDataToWorld?(world: W): void;
22
- constructor(world: BaseWorld<ComponentDefinitionMap, C>, options: ComponentSystemConfig<C, T, W, D>);
24
+ constructor(world: BaseWorld<ComponentDefinitionMap, C>, options: EntityWorkerSystemConfig<C, T, W, D>);
23
25
  private initWorker;
24
26
  init(): Promise<void> | void;
25
27
  finishLoading(): Promise<void>;
@@ -32,11 +34,11 @@ export default abstract class ComponentSystem<C extends ComponentMap, T extends
32
34
  private buildQueryDelta;
33
35
  private buildComponents;
34
36
  isEntityInSystem(entity: BaseEntity<C>): boolean;
35
- private matchesQuery;
37
+ protected matchesQuery(entity: BaseEntity<C>, query: EntityWorkerSystemQuery<C>): boolean;
36
38
  private getQueryDelta;
37
39
  private markAdded;
38
40
  private markRemoved;
39
- private updateEntityList;
41
+ protected updateEntityList(queryName: string, list: Map<number, BaseEntity<C>>, entity: BaseEntity<C>, shouldInclude: boolean): void;
40
42
  checkAddEntity(entity: BaseEntity<C>): boolean;
41
43
  removeEntity(entity: BaseEntity<C>): void;
42
44
  recheckMembership(): void;
@@ -52,15 +54,15 @@ export type EntityQueryComponents<C extends ComponentMap = ComponentMap> = {
52
54
  components: EntityUpdateComponents<C>;
53
55
  }>;
54
56
  };
55
- type EntityUpdateFunctionImpl<C extends ComponentMap, T extends EntityUpdateComponents<C>, W extends ComponentSystemWorld = ComponentSystemWorld> = (world: W, entityId: number, components: T, queries: EntityQueryComponents<C>, callbacks: ComponentSystemCallbacks<C>) => void;
56
- export type EntityUpdateFunction<C extends ComponentMap, T extends EntityUpdateComponents<C>, W extends ComponentSystemWorld = ComponentSystemWorld, D = unknown> = EntityUpdateFunctionImpl<C, T, W> & {
57
+ type EntityUpdateFunctionImpl<C extends ComponentMap, T extends EntityUpdateComponents<C>, W extends EntityWorkerSystemWorld = EntityWorkerSystemWorld> = (world: W, entityId: number, components: T, queries: EntityQueryComponents<C>, callbacks: EntityWorkerSystemCallbacks<C>) => void;
58
+ export type EntityUpdateFunction<C extends ComponentMap, T extends EntityUpdateComponents<C>, W extends EntityWorkerSystemWorld = EntityWorkerSystemWorld, D = unknown> = EntityUpdateFunctionImpl<C, T, W> & {
57
59
  preRun?: EntityUpdatePreRunFunction<C, T, W>;
58
60
  entityRemoved?: EntityRemovedFunction<C, W>;
59
61
  init?: EntityUpdateInitFunction<W, D>;
60
62
  };
61
- export type EntityUpdateInitFunction<W extends ComponentSystemWorld = ComponentSystemWorld, D = unknown> = (data: D | undefined) => Partial<W> | void;
62
- export type EntityUpdatePreRunFunction<C extends ComponentMap, T extends EntityUpdateComponents<C>, W extends ComponentSystemWorld = ComponentSystemWorld> = (world: W, entities: Array<UpdateEntityConfigObject<T>>, queries: EntityQueryComponents<C>, callbacks: ComponentSystemCallbacks<C>) => void;
63
- export type EntityRemovedFunction<C extends ComponentMap = ComponentMap, W extends ComponentSystemWorld = ComponentSystemWorld> = (world: W, entityId: number, callbacks: ComponentSystemCallbacks<C>) => void;
63
+ export type EntityUpdateInitFunction<W extends EntityWorkerSystemWorld = EntityWorkerSystemWorld, D = unknown> = (data: D | undefined) => Partial<W> | void;
64
+ export type EntityUpdatePreRunFunction<C extends ComponentMap, T extends EntityUpdateComponents<C>, W extends EntityWorkerSystemWorld = EntityWorkerSystemWorld> = (world: W, entities: Array<UpdateEntityConfigObject<T>>, queries: EntityQueryComponents<C>, callbacks: EntityWorkerSystemCallbacks<C>) => void;
65
+ export type EntityRemovedFunction<C extends ComponentMap = ComponentMap, W extends EntityWorkerSystemWorld = EntityWorkerSystemWorld> = (world: W, entityId: number, callbacks: EntityWorkerSystemCallbacks<C>) => void;
64
66
  export type UpdateEntityConfig<T extends EntityUpdateComponents = EntityUpdateComponents> = number | UpdateEntityConfigObject<T>;
65
67
  export type UpdateEntityConfigObject<T extends EntityUpdateComponents> = {
66
68
  entityId: number;
@@ -74,48 +76,67 @@ export interface WorkerAllocator {
74
76
  allocateEid(): number;
75
77
  allocateComponentBlock(name: string, values: Array<number>): number;
76
78
  }
77
- export interface ComponentSystemWorld {
79
+ export interface EntityWorkerSystemWorld {
78
80
  gameTime: number;
79
81
  elapsedTime: number;
80
82
  getString(pointer: number): string;
81
83
  heap?: MemoryHeap;
82
84
  allocate?: WorkerAllocator;
83
85
  buildEntityDescriptor?(config: WorkerCreateEntityConfig): WorkerCreatedEntity;
86
+ buildComponentDescriptor?(name: string, config: Record<string, unknown>): WorkerCreatedComponent;
84
87
  }
85
88
  export type WorkerCreateEntityConfig = {
86
89
  type: string;
90
+ class?: never;
87
91
  } & {
88
92
  [key: string]: unknown;
89
93
  };
90
94
  export interface WorkerCreatedEntity {
91
95
  eid: number;
92
96
  type: string;
97
+ class?: string;
93
98
  isStatic?: boolean;
94
99
  components: {
95
100
  [name: string]: number;
96
101
  };
97
102
  }
98
- export interface ComponentSystemCallbacks<C extends ComponentMap = ComponentMap> {
103
+ export interface WorkerCreatedComponent {
104
+ name: string;
105
+ index: number;
106
+ }
107
+ export type WorkerComponentChange = {
108
+ type: 'add';
109
+ entityId: number;
110
+ component: WorkerCreatedComponent;
111
+ } | {
112
+ type: 'remove';
113
+ entityId: number;
114
+ componentName: string;
115
+ };
116
+ export interface EntityWorkerSystemCallbacks<C extends ComponentMap = ComponentMap> {
99
117
  entityComponentChanged<K extends keyof C, P extends keyof C[K]>(entityId: number, componentName: K, prop: P, value: C[K][P]): void;
100
118
  emitEntityEvent(entityId: number, event: string, ...args: Array<unknown>): void;
101
119
  emitSystemEvent(event: string, entityId: number): void;
102
120
  entityDied(entityId: number): void;
103
121
  createEntity(entity: WorkerCreatedEntity): void;
122
+ addComponent(entityId: number, component: WorkerCreatedComponent): void;
123
+ removeComponent<K extends keyof C>(entityId: number, componentName: K): void;
104
124
  }
105
- export interface ComponentSystemQuery<C extends ComponentMap = ComponentMap> {
125
+ export interface EntityWorkerSystemQuery<C extends ComponentMap = ComponentMap> {
106
126
  required: Array<keyof C>;
107
127
  optional?: Array<keyof C>;
108
128
  not?: Array<keyof C>;
109
129
  filter?: (entity: BaseEntity<C>) => boolean;
110
130
  }
111
- export interface ComponentSystemConfig<C extends ComponentMap, T extends EntityUpdateComponents<C>, W extends ComponentSystemWorld = ComponentSystemWorld, D = unknown> extends SystemConfig, ComponentSystemQuery<C> {
131
+ export interface EntityWorkerSystemConfig<C extends ComponentMap, T extends EntityUpdateComponents<C>, W extends EntityWorkerSystemWorld = EntityWorkerSystemWorld, D = unknown> extends SystemConfig, EntityWorkerSystemQuery<C> {
112
132
  updateFunction: EntityUpdateFunction<C, T, W, D>;
113
133
  getWorker: () => Worker;
114
134
  forceMainThread?: boolean;
115
135
  getInitData?: () => D;
116
136
  createsEntities?: boolean;
137
+ addsComponents?: boolean;
117
138
  queries?: {
118
- [key: string]: ComponentSystemQuery<C>;
139
+ [key: string]: EntityWorkerSystemQuery<C>;
119
140
  };
120
141
  }
121
142
  export type { BaseComponent };
@@ -28,7 +28,7 @@ export interface SystemConfig {
28
28
  deltaBetweenRuns?: number;
29
29
  firstRun?: boolean;
30
30
  }
31
- export type SystemErrorPhase = 'preRun' | 'update' | 'entityRemoved' | 'run';
31
+ export type SystemErrorPhase = 'preRun' | 'update' | 'entityRemoved' | 'run' | 'died';
32
32
  export interface SystemError {
33
33
  system: string;
34
34
  error: Error;
@@ -0,0 +1,22 @@
1
+ import type BaseWorld from '../world';
2
+ import type BaseEntity from '../entity';
3
+ import type { ComponentDefinitionMap, ComponentMap } from '../component-definition';
4
+ import type { SystemConfig } from './system';
5
+ import EntityWorkerSystem, { type EntityWorkerSystemQuery, type EntityWorkerSystemWorld, type EntityUpdateComponents } from './entity-worker-system';
6
+ import { type WorkerSystemRunFunction } from './workers/create-system-worker';
7
+ export default class WorkerSystem<C extends ComponentMap, W extends EntityWorkerSystemWorld = EntityWorkerSystemWorld, D = unknown> extends EntityWorkerSystem<C, EntityUpdateComponents<C>, W, D> {
8
+ constructor(world: BaseWorld<ComponentDefinitionMap, C>, options: WorkerSystemConfig<C, W, D>);
9
+ checkAddEntity(entity: BaseEntity<C>): boolean;
10
+ shouldRun(): boolean;
11
+ }
12
+ export interface WorkerSystemConfig<C extends ComponentMap, W extends EntityWorkerSystemWorld = EntityWorkerSystemWorld, D = unknown> extends SystemConfig {
13
+ updateFunction: WorkerSystemRunFunction<C, W, D>;
14
+ getWorker: () => Worker;
15
+ forceMainThread?: boolean;
16
+ getInitData?: () => D;
17
+ createsEntities?: boolean;
18
+ queries?: {
19
+ [key: string]: EntityWorkerSystemQuery<C>;
20
+ };
21
+ }
22
+ export type { WorkerSystemRunFunction };
@@ -1,2 +1,2 @@
1
- import type { EntityUpdateComponents, QueryDelta, UpdateEntityConfigObject } from '../component-system';
1
+ import type { EntityUpdateComponents, QueryDelta, UpdateEntityConfigObject } from '../entity-worker-system';
2
2
  export declare function applyQueryDelta<T extends EntityUpdateComponents>(list: Array<UpdateEntityConfigObject<T>>, delta: QueryDelta<T>): Array<UpdateEntityConfigObject<T>>;
@@ -0,0 +1,8 @@
1
+ import type EntitySystemWorkerMessage from './entity-system-worker-message';
2
+ import type { ComponentDefinitionMap, ComponentMap } from '../../component-definition';
3
+ import type { EntityWorkerSystemWorld, EntityUpdateComponents, EntityUpdateFunction } from '../entity-worker-system';
4
+ export interface EntitySystemWorkerScope {
5
+ onmessage: ((e: MessageEvent) => void) | null;
6
+ postMessage(message: EntitySystemWorkerMessage): void;
7
+ }
8
+ export default function createEntitySystemWorker<C extends ComponentMap, T extends EntityUpdateComponents<C>, W extends EntityWorkerSystemWorld = EntityWorkerSystemWorld, D = unknown>(scope: EntitySystemWorkerScope, updateFunction: EntityUpdateFunction<C, T, W, D>, definitions?: ComponentDefinitionMap): void;
@@ -0,0 +1,9 @@
1
+ import { type EntitySystemWorkerScope } from './create-entity-system-worker';
2
+ import type { ComponentDefinitionMap, ComponentMap } from '../../component-definition';
3
+ import type { EntityWorkerSystemCallbacks, EntityWorkerSystemWorld, EntityQueryComponents, EntityUpdateComponents, EntityUpdateFunction, EntityUpdateInitFunction, EntityRemovedFunction } from '../entity-worker-system';
4
+ export type WorkerSystemRunFunction<C extends ComponentMap, W extends EntityWorkerSystemWorld = EntityWorkerSystemWorld, D = unknown> = ((world: W, queries: EntityQueryComponents<C>, callbacks: EntityWorkerSystemCallbacks<C>) => void) & {
5
+ init?: EntityUpdateInitFunction<W, D>;
6
+ entityRemoved?: EntityRemovedFunction<C, W>;
7
+ };
8
+ export declare function toEntityUpdateFunction<C extends ComponentMap, W extends EntityWorkerSystemWorld = EntityWorkerSystemWorld, D = unknown>(run: WorkerSystemRunFunction<C, W, D>): EntityUpdateFunction<C, EntityUpdateComponents<C>, W, D>;
9
+ export default function createSystemWorker<C extends ComponentMap, W extends EntityWorkerSystemWorld = EntityWorkerSystemWorld, D = unknown>(scope: EntitySystemWorkerScope, runFunction: WorkerSystemRunFunction<C, W, D>, definitions?: ComponentDefinitionMap): void;
@@ -0,0 +1,18 @@
1
+ import WebWorker from './web-worker';
2
+ import type EntitySystemWorkerMessage from './entity-system-worker-message';
3
+ import type BaseWorld from '../../world';
4
+ import type { ComponentDefinitionMap, ComponentMap } from '../../component-definition';
5
+ import type { EntityWorkerSystemWorld, EntityUpdateComponents, EntityUpdateFunction } from '../entity-worker-system';
6
+ export default class EntitySystemWebWorker<C extends ComponentMap, T extends EntityUpdateComponents<C>, W extends EntityWorkerSystemWorld = EntityWorkerSystemWorld, D = unknown> extends WebWorker {
7
+ private updateFunction;
8
+ private entities;
9
+ private queryEntities;
10
+ private worldExtension;
11
+ private world;
12
+ private allocator;
13
+ private createsEntities;
14
+ private addsComponents;
15
+ constructor(updateFunction: EntityUpdateFunction<C, T, W, D>, world: BaseWorld<ComponentDefinitionMap, C>, createsEntities?: boolean, addsComponents?: boolean);
16
+ postMessage(message: EntitySystemWorkerMessage<W, D>): void;
17
+ onMessageTyped(message: EntitySystemWorkerMessage<W, D>): void;
18
+ }
@@ -1,6 +1,7 @@
1
1
  import type { MemoryHeapMemory, GrowBufferData } from '@daneren2005/shared-memory-objects/memory-heap';
2
2
  import type { WorldSharedMemory } from '../../world';
3
- import type { ComponentSystemWorld, QueryDelta, WorkerCreatedEntity } from '../component-system';
3
+ import type { EntityWorkerSystemWorld, QueryDelta, WorkerComponentChange, WorkerCreatedEntity } from '../entity-worker-system';
4
+ import type { WorkerEntityClassRegistry } from '../../entity-class';
4
5
  interface InitMessage {
5
6
  type: 'init';
6
7
  }
@@ -15,6 +16,8 @@ interface LoadMessage<D = unknown> {
15
16
  factoryConfigs?: {
16
17
  [type: string]: Record<string, unknown>;
17
18
  };
19
+ factoryClasses?: WorkerEntityClassRegistry;
20
+ addsComponents?: boolean;
18
21
  }
19
22
  interface GrowBufferMessage {
20
23
  type: 'grow-buffer';
@@ -30,7 +33,7 @@ interface LoadedMessage {
30
33
  interface ResetMessage {
31
34
  type: 'reset';
32
35
  }
33
- interface RunUpdateMessage<W extends ComponentSystemWorld = ComponentSystemWorld> {
36
+ interface RunUpdateMessage<W extends EntityWorkerSystemWorld = EntityWorkerSystemWorld> {
34
37
  type: 'run';
35
38
  generation: number;
36
39
  world: W;
@@ -59,7 +62,8 @@ interface EntityEventsMessage {
59
62
  events: Array<EntityEvent>;
60
63
  systemEvents: SystemEvents;
61
64
  created: Array<WorkerCreatedEntity>;
65
+ componentChanges: Array<WorkerComponentChange>;
62
66
  errors: Array<WorkerRunError>;
63
67
  }
64
- type ComponentWorkerMessage<W extends ComponentSystemWorld = ComponentSystemWorld, D = unknown> = InitMessage | InitCompleteMessage | LoadMessage<D> | LoadedMessage | ResetMessage | GrowBufferMessage | GrowBufferFromWorkerMessage | RunUpdateMessage<W> | EntityEventsMessage;
65
- export default ComponentWorkerMessage;
68
+ type EntitySystemWorkerMessage<W extends EntityWorkerSystemWorld = EntityWorkerSystemWorld, D = unknown> = InitMessage | InitCompleteMessage | LoadMessage<D> | LoadedMessage | ResetMessage | GrowBufferMessage | GrowBufferFromWorkerMessage | RunUpdateMessage<W> | EntityEventsMessage;
69
+ export default EntitySystemWorkerMessage;
package/dist/worker.d.ts CHANGED
@@ -1,8 +1,12 @@
1
- export { default as createComponentWorker } from './systems/workers/create-component-worker';
2
- export type { ComponentWorkerScope } from './systems/workers/create-component-worker';
1
+ export { default as createEntitySystemWorker } from './systems/workers/create-entity-system-worker';
2
+ export type { EntitySystemWorkerScope } from './systems/workers/create-entity-system-worker';
3
+ export { default as createSystemWorker } from './systems/workers/create-system-worker';
4
+ export type { WorkerSystemRunFunction } from './systems/workers/create-system-worker';
3
5
  export { default as createEntityWorker } from './actions/create-entity-worker';
6
+ export { default as addComponentWorker } from './actions/add-component-worker';
7
+ export { default as removeComponentWorker } from './actions/remove-component-worker';
4
8
  export { default as killEntityWorker } from './actions/kill-entity-worker';
5
- export { DEAD_INDEX, TYPE_INDEX } from './entity-component';
6
- export type { default as ComponentWorkerMessage } from './systems/workers/component-worker-message';
7
- export type { EntityEvent, SystemEvents } from './systems/workers/component-worker-message';
8
- export type { ComponentSystemWorld, ComponentSystemCallbacks, WorkerAllocator, WorkerCreateEntityConfig, WorkerCreatedEntity, EntityUpdateComponents, EntityQueryComponents, EntityUpdateFunction, EntityUpdateInitFunction, EntityUpdatePreRunFunction, EntityRemovedFunction, UpdateEntityConfigObject, } from './systems/component-system';
9
+ export { CLASS_INDEX, DEAD_INDEX, TYPE_INDEX } from './entity-component';
10
+ export type { default as EntitySystemWorkerMessage } from './systems/workers/entity-system-worker-message';
11
+ export type { EntityEvent, SystemEvents } from './systems/workers/entity-system-worker-message';
12
+ export type { EntityWorkerSystemWorld, EntityWorkerSystemCallbacks, WorkerAllocator, WorkerCreateEntityConfig, WorkerCreatedEntity, WorkerCreatedComponent, WorkerComponentChange, EntityUpdateComponents, EntityQueryComponents, EntityUpdateFunction, EntityUpdateInitFunction, EntityUpdatePreRunFunction, EntityRemovedFunction, UpdateEntityConfigObject, } from './systems/entity-worker-system';
package/dist/worker.js CHANGED
@@ -1,2 +1,2 @@
1
- import { i as e, n as t, o as n, r, t as i } from "./create-component-worker-BM942gjg.js";
2
- export { e as DEAD_INDEX, n as TYPE_INDEX, i as createComponentWorker, t as createEntityWorker, r as killEntityWorker };
1
+ import { a as e, c as t, d as n, i as r, l as i, o as a, r as o, s, t as c } from "./create-system-worker-DURlIMia.js";
2
+ export { t as CLASS_INDEX, i as DEAD_INDEX, n as TYPE_INDEX, e as addComponentWorker, o as createEntitySystemWorker, a as createEntityWorker, c as createSystemWorker, s as killEntityWorker, r as removeComponentWorker };
package/dist/world.d.ts CHANGED
@@ -5,15 +5,15 @@ import type { SharedAllocatedMemory } from '@daneren2005/shared-memory-objects/a
5
5
  import type { SharedPoolMemory } from '@daneren2005/shared-memory-objects/shared-pool';
6
6
  import MemoryComponent from './memory-component';
7
7
  import ConstantStringCache from './constant-string-cache';
8
- import BaseEntity from './entity';
8
+ import type BaseEntity from './entity';
9
9
  import type System from './systems/system';
10
- import type { WorkerCreatedEntity } from './systems/component-system';
10
+ import type { WorkerCreatedEntity } from './systems/entity-worker-system';
11
11
  import type { ComponentDefinitionMap, ComponentMap, ComponentsOf, EntityConfigOf, RegisteredComponentDefinition, RegisteredComponentRegistry } from './component-definition';
12
12
  import { type EntityComponent } from './entity-component';
13
13
  import EntityFactory from './entity-factory';
14
- export interface WorldOptions<C extends ComponentMap = ComponentMap, Cfg = any> {
14
+ export interface WorldOptions<C extends ComponentMap = ComponentMap, Cfg = any, E extends BaseEntity<C, Cfg> = BaseEntity<C, Cfg>> {
15
15
  heapSize?: number;
16
- factory?: EntityFactory<C, Cfg>;
16
+ factory?: EntityFactory<C, Cfg, E>;
17
17
  }
18
18
  export interface WorldConfig<Cfg = any> {
19
19
  entities: Array<Cfg>;
@@ -27,15 +27,15 @@ export interface WorldSharedMemory {
27
27
  };
28
28
  eidCounter: SharedAllocatedMemory;
29
29
  }
30
- export default class BaseWorld<R extends ComponentDefinitionMap = ComponentDefinitionMap, C extends ComponentMap = ComponentsOf<R>, Cfg = EntityConfigOf<R>> extends EventEmitter {
30
+ export default class BaseWorld<R extends ComponentDefinitionMap = ComponentDefinitionMap, C extends ComponentMap = ComponentsOf<R>, Cfg = EntityConfigOf<R>, E extends BaseEntity<C, Cfg> = BaseEntity<C, Cfg>> extends EventEmitter {
31
31
  heap: MemoryHeap;
32
32
  constantStrings: ConstantStringCache;
33
33
  private eidCounter;
34
34
  registry: RegisteredComponentRegistry<C> & {
35
35
  entity: RegisteredComponentDefinition<EntityComponent>;
36
36
  };
37
- factory: EntityFactory<C, Cfg>;
38
- entities: Map<number, BaseEntity<C, Cfg>>;
37
+ factory: EntityFactory<C, Cfg, E>;
38
+ entities: Map<number, E>;
39
39
  systems: Array<System<C>>;
40
40
  gameTime: number;
41
41
  playerTime: number;
@@ -45,21 +45,21 @@ export default class BaseWorld<R extends ComponentDefinitionMap = ComponentDefin
45
45
  pristine: boolean;
46
46
  private activeFreeBuffer;
47
47
  private nextFreeBuffer;
48
- constructor(registry: R, options?: WorldOptions<C, Cfg>);
48
+ constructor(registry: R, options?: WorldOptions<C, Cfg, E>);
49
49
  allocateEid(): number;
50
50
  getSharedComponentMemory(): WorldSharedMemory;
51
51
  addGrownBuffer(data: GrowBufferData): void;
52
52
  private get needsSpareBuffer();
53
53
  init(): Promise<void>;
54
54
  private finishLoadingSystems;
55
- addEntity(entity: BaseEntity<C, Cfg>, created?: boolean): BaseEntity<C, Cfg>;
56
- loadEntity(config: Cfg, created?: boolean): BaseEntity<C, Cfg>;
57
- adoptEntity(descriptor: WorkerCreatedEntity): BaseEntity<C, Cfg>;
55
+ addEntity(entity: E, created?: boolean): E;
56
+ loadEntity(config: Cfg, created?: boolean): E;
57
+ adoptEntity(descriptor: WorkerCreatedEntity): E;
58
58
  load(config: WorldConfig<Cfg>): void;
59
59
  clear(): Promise<void>;
60
- removeEntity(entity: BaseEntity<C, Cfg>): void;
61
- onEntityDied(entity: BaseEntity<C, Cfg>): void;
62
- getEntityByEid(eid: number): BaseEntity<C, Cfg> | undefined;
60
+ removeEntity(entity: E): void;
61
+ onEntityDied(entity: E): void;
62
+ getEntityByEid(eid: number): E | undefined;
63
63
  deferComponentMemoryFree(memoryComponent: MemoryComponent, index: number, free?: () => void): void;
64
64
  notifySystemRunCompleted(system: System<C>): void;
65
65
  private processFreeBuffers;
@@ -77,8 +77,8 @@ export default class BaseWorld<R extends ComponentDefinitionMap = ComponentDefin
77
77
  private runUpdate;
78
78
  pause(): void;
79
79
  resume(): void;
80
- addEntityToComponentSystem(entity: BaseEntity<C>, component: keyof C): void;
81
- removeEntityFromComponentSystem(entity: BaseEntity<C>, component: keyof C): void;
82
- private componentAffectsComponentSystem;
80
+ addEntityToEntityWorkerSystem(entity: BaseEntity<C>, component: keyof C): void;
81
+ removeEntityFromEntityWorkerSystem(entity: BaseEntity<C>, component: keyof C): void;
82
+ private componentAffectsEntityWorkerSystem;
83
83
  destroy(): void;
84
84
  }
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.5.1",
5
+ "version": "1.7.0",
6
6
  "type": "module",
7
7
  "sideEffects": false,
8
8
  "repository": {
@@ -39,6 +39,7 @@
39
39
  "lint": "cross-env NODE_ENV=production oxlint .",
40
40
  "lint:fix": "cross-env NODE_ENV=production oxlint --fix .",
41
41
  "test": "vitest run",
42
+ "bench": "vitest bench --run --config vitest.benchmark.config.ts",
42
43
  "release": "semantic-release",
43
44
  "prepare": "husky"
44
45
  },