@virid/core 0.0.1 → 0.1.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/dist/index.js CHANGED
@@ -1,712 +1,32 @@
1
- var __defProp = Object.defineProperty;
2
- var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
3
- var __getOwnPropNames = Object.getOwnPropertyNames;
4
- var __hasOwnProp = Object.prototype.hasOwnProperty;
5
- var __name = (target, value) => __defProp(target, "name", { value, configurable: true });
6
- var __export = (target, all) => {
7
- for (var name in all)
8
- __defProp(target, name, { get: all[name], enumerable: true });
9
- };
10
- var __copyProps = (to, from, except, desc) => {
11
- if (from && typeof from === "object" || typeof from === "function") {
12
- for (let key of __getOwnPropNames(from))
13
- if (!__hasOwnProp.call(to, key) && key !== except)
14
- __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
15
- }
16
- return to;
17
- };
18
- var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
19
-
20
- // index.ts
21
- var index_exports = {};
22
- __export(index_exports, {
23
- AtomicModifyMessage: () => AtomicModifyMessage,
24
- BaseMessage: () => BaseMessage,
25
- Component: () => Component,
26
- Controller: () => Controller,
27
- ErrorMessage: () => ErrorMessage,
28
- EventMessage: () => EventMessage,
29
- Message: () => Message,
30
- MessageInternal: () => MessageInternal,
31
- MessageWriter: () => MessageWriter,
32
- SingleMessage: () => SingleMessage,
33
- System: () => System,
34
- WarnMessage: () => WarnMessage,
35
- activatInstance: () => activatInstance,
36
- createVirid: () => createVirid,
37
- publisher: () => publisher
38
- });
39
- module.exports = __toCommonJS(index_exports);
40
-
41
- // app.ts
42
- var import_inversify = require("inversify");
43
-
44
- // message/types.ts
45
- var BaseMessage = class {
46
- static {
47
- __name(this, "BaseMessage");
48
- }
49
- static send(...args) {
50
- MessageWriter.write(this, ...args);
51
- }
52
- senderInfo;
53
- constructor() {
54
- }
55
- };
56
- var SingleMessage = class extends BaseMessage {
57
- static {
58
- __name(this, "SingleMessage");
59
- }
60
- // @ts-ignore 只用来区分的标识符
61
- __kind = "SingleMessage";
62
- constructor() {
63
- super();
64
- }
65
- };
66
- var EventMessage = class extends BaseMessage {
67
- static {
68
- __name(this, "EventMessage");
69
- }
70
- // @ts-ignore 只用来区分的标识符
71
- __kind = "EventMessage";
72
- constructor() {
73
- super();
74
- }
75
- };
76
- var ErrorMessage = class extends EventMessage {
77
- static {
78
- __name(this, "ErrorMessage");
79
- }
80
- error;
81
- context;
82
- constructor(error, context) {
83
- super(), this.error = error, this.context = context;
84
- }
85
- };
86
- var WarnMessage = class extends EventMessage {
87
- static {
88
- __name(this, "WarnMessage");
89
- }
90
- context;
91
- constructor(context) {
92
- super(), this.context = context;
93
- }
94
- };
95
- var AtomicModifyMessage = class extends EventMessage {
96
- static {
97
- __name(this, "AtomicModifyMessage");
98
- }
99
- ComponentClass;
100
- recipe;
101
- label;
102
- constructor(ComponentClass, recipe, label) {
103
- super(), this.ComponentClass = ComponentClass, this.recipe = recipe, this.label = label;
104
- }
105
- };
106
-
107
- // message/io.ts
108
- var activeInstance = null;
109
- function activatInstance(instance) {
110
- activeInstance = instance;
111
- }
112
- __name(activatInstance, "activatInstance");
113
- var publisher = new Proxy({}, {
114
- get(_, prop) {
115
- if (prop === "dispatch") {
116
- return (message) => {
117
- if (!activeInstance) {
118
- console.error(`[Virid] Message dispatched before system init: ${message.constructor.name}`);
119
- return;
120
- }
121
- return activeInstance.dispatch(message);
122
- };
123
- }
124
- return Reflect.get(activeInstance || {}, prop);
125
- }
126
- });
127
- var MessageWriter = class {
128
- static {
129
- __name(this, "MessageWriter");
130
- }
131
- /**
132
- * 核心入口:无论是类还是实例,统一交给 Internal 处理
133
- */
134
- static write(target, ...args) {
135
- const instance = typeof target === "function" ? new target(...args) : target;
136
- publisher.dispatch(instance);
137
- }
138
- /**
139
- * 快捷方式:系统内部常用
140
- */
141
- static error(e, context) {
142
- this.write(new ErrorMessage(e, context));
143
- }
144
- static warn(context) {
145
- this.write(new WarnMessage(context));
146
- }
147
- };
148
-
149
- // message/dispatcher.ts
150
- var ExecutionTask = class {
151
- static {
152
- __name(this, "ExecutionTask");
153
- }
154
- fn;
155
- priority;
156
- message;
157
- context;
158
- constructor(fn, priority, message, context) {
159
- this.fn = fn;
160
- this.priority = priority;
161
- this.message = message;
162
- this.context = context;
163
- }
164
- triggerHooks(hooks) {
165
- const sample = Array.isArray(this.message) ? this.message[0] : this.message;
166
- if (!sample) return;
167
- for (const hook of hooks) {
168
- if (sample instanceof hook.type) {
169
- try {
170
- const result = hook.handler(this.message, this.context);
171
- if (result instanceof Promise) {
172
- result.catch((e) => MessageWriter.error(e, `[Virid Hook] Async Hook Error:
173
- ${hook.type.name}`));
174
- }
175
- } catch (e) {
176
- MessageWriter.error(e, `[Virid Hook] Hook Execute Failed:
177
- Triggered by: ${sample.constructor.name}
178
- Registered type: ${hook.type.name}`);
179
- }
180
- }
181
- }
182
- }
183
- execute(beforeHooks, afterHooks) {
184
- this.triggerHooks(beforeHooks);
185
- const runAfter = /* @__PURE__ */ __name(() => this.triggerHooks(afterHooks), "runAfter");
186
- try {
187
- const result = this.fn(this.message);
188
- if (result instanceof Promise) {
189
- return result.finally(() => runAfter());
190
- }
191
- runAfter();
192
- return result;
193
- } catch (e) {
194
- runAfter();
195
- throw e;
196
- }
197
- }
198
- };
199
- var Dispatcher = class {
200
- static {
201
- __name(this, "Dispatcher");
202
- }
203
- dirtySignalTypes = /* @__PURE__ */ new Set();
204
- eventQueue = [];
205
- isRunning = false;
206
- tickCount = 0;
207
- eventHub;
208
- // 使用 MessageIdentifier 允许存入 BaseMessage, SingleMessage 等抽象类
209
- beforeHooks = [];
210
- afterHooks = [];
211
- constructor(eventHub) {
212
- this.eventHub = eventHub;
213
- }
214
- // 添加执行钩子
215
- addBefore(type, hook) {
216
- this.beforeHooks.push({
217
- type,
218
- handler: hook
219
- });
220
- }
221
- addAfter(type, hook) {
222
- this.afterHooks.push({
223
- type,
224
- handler: hook
225
- });
226
- }
227
- cleanupHook = /* @__PURE__ */ __name(() => {
228
- }, "cleanupHook");
229
- setCleanupHook(hook) {
230
- this.cleanupHook = hook;
231
- }
232
- /**
233
- * 标记脏数据:根据基类判断进入哪个池子
234
- */
235
- markDirty(message) {
236
- if (message instanceof EventMessage) {
237
- this.eventQueue.push(message);
238
- } else if (message instanceof SingleMessage) {
239
- this.dirtySignalTypes.add(message.constructor);
240
- }
241
- }
242
- tick(interestMap) {
243
- if (this.isRunning || this.dirtySignalTypes.size === 0 && this.eventQueue.length === 0) return;
244
- if (this.tickCount > 100) {
245
- this.tickCount = 0;
246
- this.dirtySignalTypes.clear();
247
- this.eventQueue = [];
248
- this.eventHub.reset();
249
- MessageWriter.error(new Error("[Virid Dispatcher] Deadlock: Recursive loop detected."));
250
- return;
251
- }
252
- this.isRunning = true;
253
- this.tickCount++;
254
- queueMicrotask(() => {
255
- try {
256
- this.eventHub.flip();
257
- const signalSnapshot = new Set(this.dirtySignalTypes);
258
- const eventSnapshot = [
259
- ...this.eventQueue
260
- ];
261
- this.dirtySignalTypes.clear();
262
- this.eventQueue = [];
263
- const tasks = [];
264
- for (const msg of eventSnapshot) {
265
- const systems = interestMap.get(msg.constructor) || [];
266
- systems.forEach((s) => {
267
- tasks.push(new ExecutionTask(s.fn, s.priority, msg, s.fn.ccsContext));
268
- });
269
- }
270
- const signalFnSet = /* @__PURE__ */ new Set();
271
- for (const type of signalSnapshot) {
272
- const systems = interestMap.get(type) || [];
273
- systems.forEach((s) => {
274
- if (!signalFnSet.has(s.fn)) {
275
- tasks.push(new ExecutionTask(s.fn, s.priority, this.eventHub.peekSignal(type), s.fn.ccsContext));
276
- signalFnSet.add(s.fn);
277
- }
278
- });
279
- }
280
- tasks.sort((a, b) => b.priority - a.priority);
281
- for (const task of tasks) {
282
- try {
283
- const result = task.execute(this.beforeHooks, this.afterHooks);
284
- if (result instanceof Promise) {
285
- result.catch((e) => MessageWriter.error(e, `[Virid Dispatcher] Async Error:
286
- targetClass:${task.context.targetClass}
287
- methodName:${task.context.methodName}
288
- `));
289
- }
290
- } catch (e) {
291
- MessageWriter.error(e, `[Virid Dispatcher] Sync Error:
292
- targetClass:${task.context.targetClass}
293
- methodName:${task.context.methodName}
294
- `);
295
- }
296
- }
297
- const processedTypes = new Set(signalSnapshot);
298
- eventSnapshot.forEach((m) => processedTypes.add(m.constructor));
299
- this.cleanupHook(processedTypes);
300
- this.isRunning = false;
301
- if (this.dirtySignalTypes.size > 0 || this.eventQueue.length > 0) {
302
- this.tick(interestMap);
303
- } else {
304
- this.tickCount = 0;
305
- }
306
- } catch (e) {
307
- MessageWriter.error(e, "[Virid Dispatcher] Unhandled Error");
308
- }
309
- });
310
- }
311
- };
312
-
313
- // message/eventHub.ts
314
- var EventHub = class {
315
- static {
316
- __name(this, "EventHub");
317
- }
318
- // --- SIGNAL 存储 (分类池) ---
319
- signalActive = /* @__PURE__ */ new Map();
320
- signalStaging = /* @__PURE__ */ new Map();
321
- // --- EVENT 存储 (顺序流) ---
322
- eventActive = [];
323
- eventStaging = [];
324
- /**
325
- * 写入逻辑:根据消息策略分流
326
- */
327
- push(event) {
328
- if (event instanceof SingleMessage) {
329
- const type = event.constructor;
330
- if (!this.signalStaging.has(type)) this.signalStaging.set(type, []);
331
- this.signalStaging.get(type).push(event);
332
- } else if (event instanceof EventMessage) {
333
- this.eventStaging.push(event);
334
- } else {
335
- MessageWriter.error(new Error(`[Virid Message] Invalid Message:
336
- ${event.constructor.name} must extend SingleMessage or EventMessage`));
337
- }
338
- }
339
- /**
340
- * 翻转缓冲区:在 Dispatcher 的 Tick 开始时调用
341
- */
342
- flip() {
343
- this.signalActive = this.signalStaging;
344
- this.signalStaging = /* @__PURE__ */ new Map();
345
- this.eventActive = this.eventStaging;
346
- this.eventStaging = [];
347
- }
348
- /**
349
- * [SIGNAL专用] 批量读取某种类型的信号
350
- */
351
- peekSignal(type) {
352
- return this.signalActive.get(type) || [];
353
- }
354
- /**
355
- * [EVENT专用] 获取当前所有待处理的事件流
356
- */
357
- getEventStream() {
358
- return this.eventActive;
359
- }
360
- /**
361
- * [新增] 根据索引精准读取 EVENT 里的某个数据
362
- * 配合 Dispatcher 逐条分发时使用
363
- */
364
- peekEventAt(index) {
365
- return this.eventActive[index];
366
- }
367
- /**
368
- * 清理已处理的内容
369
- */
370
- clearSignals(types) {
371
- types.forEach((type) => this.signalActive.delete(type));
372
- }
373
- clearEvents() {
374
- this.eventActive = [];
375
- }
376
- /**
377
- * 重置所有池子
378
- */
379
- reset() {
380
- this.signalActive.clear();
381
- this.signalStaging.clear();
382
- this.eventActive = [];
383
- this.eventStaging = [];
384
- }
385
- };
386
-
387
- // message/registry.ts
388
- var MessageRegistry = class {
389
- static {
390
- __name(this, "MessageRegistry");
391
- }
392
- interestMap = /* @__PURE__ */ new Map();
393
- /**
394
- * 注册消息并返回一个卸载函数
395
- * 这种模式能完美适配 Controller 的生命周期销毁
396
- */
397
- register(eventClass, systemFn, priority = 0) {
398
- const systems = this.interestMap.get(eventClass) || [];
399
- const existingIndex = systems.findIndex((s) => s.fn === systemFn);
400
- if (existingIndex === -1) {
401
- systems.push({
402
- fn: systemFn,
403
- priority
404
- });
405
- systems.sort((a, b) => b.priority - a.priority);
406
- this.interestMap.set(eventClass, systems);
407
- } else {
408
- const funcName = systemFn.name || "Anonymous";
409
- MessageWriter.error(new Error(`[Virid Error] System Already Registered:
410
- Class ${eventClass.name}
411
- Function ${funcName}`));
412
- return () => {
413
- };
414
- }
415
- return () => {
416
- const currentSystems = this.interestMap.get(eventClass);
417
- if (currentSystems) {
418
- const index = currentSystems.findIndex((s) => s.fn === systemFn);
419
- if (index !== -1) {
420
- currentSystems.splice(index, 1);
421
- if (currentSystems.length === 0) {
422
- this.interestMap.delete(eventClass);
423
- }
424
- }
425
- }
426
- };
427
- }
428
- };
429
-
430
- // message/internal.ts
431
- var MessageInternal = class {
432
- static {
433
- __name(this, "MessageInternal");
434
- }
435
- eventHub = new EventHub();
436
- dispatcher = new Dispatcher(this.eventHub);
437
- registry = new MessageRegistry();
438
- middlewares = [];
439
- constructor() {
440
- this.dispatcher.setCleanupHook((processedTypes) => {
441
- this.eventHub.clearSignals(processedTypes);
442
- this.eventHub.clearEvents();
443
- });
444
- activatInstance(this);
445
- }
446
- useMiddleware(mw) {
447
- this.middlewares.push(mw);
448
- }
449
- onBeforeExecute(type, hook) {
450
- this.dispatcher.addBefore(type, hook);
451
- }
452
- onAfterExecute(type, hook) {
453
- this.dispatcher.addAfter(type, hook);
454
- }
455
- /**
456
- * 消息进入系统的唯一入口
457
- */
458
- dispatch(message) {
459
- if (!this.registry.interestMap.has(message.constructor)) {
460
- MessageWriter.error(new Error(`[Virid Dispatch] No handler for message: ${message.constructor.name}`));
461
- return;
462
- }
463
- this.pipeline(message, () => {
464
- this.eventHub.push(message);
465
- this.dispatcher.markDirty(message);
466
- this.dispatcher.tick(this.registry.interestMap);
467
- });
468
- }
469
- pipeline(message, finalAction) {
470
- let index = 0;
471
- const next = /* @__PURE__ */ __name(() => {
472
- if (index < this.middlewares.length) {
473
- this.middlewares[index++](message, next);
474
- } else {
475
- finalAction();
476
- }
477
- }, "next");
478
- next();
479
- }
480
- };
481
-
482
- // app.ts
483
- var installedPlugins = /* @__PURE__ */ new Set();
484
- var ViridApp = class {
485
- static {
486
- __name(this, "ViridApp");
487
- }
488
- container = new import_inversify.Container();
489
- messageInternal = new MessageInternal();
490
- bindBase(identifier) {
491
- return this.container.bind(identifier).toSelf();
492
- }
493
- get(identifier) {
494
- return this.container.get(identifier);
495
- }
496
- bindController(identifier) {
497
- return this.bindBase(identifier);
498
- }
499
- bindComponent(identifier) {
500
- return this.bindBase(identifier).inSingletonScope();
501
- }
502
- useMiddleware(mw) {
503
- this.messageInternal.useMiddleware(mw);
504
- }
505
- onBeforeExecute(type, hook) {
506
- this.messageInternal.onBeforeExecute(type, hook);
507
- }
508
- onAfterExecute(type, hook) {
509
- this.messageInternal.onAfterExecute(type, hook);
510
- }
511
- register(eventClass, systemFn, priority = 0) {
512
- return this.messageInternal.registry.register(eventClass, systemFn, priority);
513
- }
514
- use(plugin, options) {
515
- if (installedPlugins.has(plugin.name)) {
516
- MessageWriter.warn(`[Virid Plugin] Plugin ${plugin.name} has already been installed.`);
517
- return this;
518
- }
519
- try {
520
- plugin.install(this, options);
521
- installedPlugins.add(plugin.name);
522
- } catch (e) {
523
- MessageWriter.error(e, `[Virid Plugin] ${plugin.name}`);
524
- }
525
- return this;
526
- }
527
- };
528
- var viridApp = new ViridApp();
529
- function withContext(params, fn, methodName) {
530
- const context = {
531
- params,
532
- targetClass: Object,
533
- methodName,
534
- originalMethod: fn
535
- };
536
- fn.ccsContext = context;
537
- return fn;
538
- }
539
- __name(withContext, "withContext");
540
- var clr = {
541
- reset: "\x1B[0m",
542
- red: "\x1B[31m",
543
- yellow: "\x1B[33m",
544
- blue: "\x1B[34m",
545
- magenta: "\x1B[35m",
546
- cyan: "\x1B[36m",
547
- gray: "\x1B[90m",
548
- bold: "\x1B[1m"
549
- };
550
- var globalErrorHandler = /* @__PURE__ */ __name((err) => {
551
- const header = `${clr.red}${clr.bold} \u2716 [Virid Error] ${clr.reset}`;
552
- const context = `${clr.magenta}${err.context}${clr.reset}`;
553
- console.error(`${header}${clr.gray}Global Error Caught:${clr.reset}
554
- ${clr.red}Context:${clr.reset} ${context}
555
- ${clr.red}Details:${clr.reset}`, err.error || "Unknown Error");
556
- }, "globalErrorHandler");
557
- viridApp.register(ErrorMessage, withContext(ErrorMessage, globalErrorHandler, "GlobalErrorHandler"), -999);
558
- var globalWarnHandler = /* @__PURE__ */ __name((warn) => {
559
- const header = `${clr.yellow}${clr.bold} \u26A0 [Virid Warn] ${clr.reset}`;
560
- const context = `${clr.cyan}${warn.context}${clr.reset}`;
561
- console.warn(`${header}${clr.gray}Global Warn Caught:${clr.reset}
562
- ${clr.yellow}Context:${clr.reset} ${context}`);
563
- }, "globalWarnHandler");
564
- viridApp.register(WarnMessage, withContext(WarnMessage, globalWarnHandler, "GlobalWarnHandler"), -999);
565
- var atomicModifyHandler = /* @__PURE__ */ __name((modifications) => {
566
- const rawComponent = viridApp.container.get(modifications.ComponentClass);
567
- if (!rawComponent) {
568
- console.error(`[Virid Modify] Component Not Found:
569
- Component ${modifications.ComponentClass.name} not found in Registry.`);
570
- return;
571
- }
572
- try {
573
- modifications.recipe(rawComponent);
574
- MessageWriter.warn(`[Virid Modify] Successfully:
575
- Modify on ${modifications.ComponentClass.name}
576
- label: ${modifications.label}`);
577
- } catch (e) {
578
- MessageWriter.error(e, `[Virid Error] Modify Failed:
579
- ${modifications.label}`);
580
- }
581
- }, "atomicModifyHandler");
582
- viridApp.register(AtomicModifyMessage, withContext(AtomicModifyMessage, atomicModifyHandler, "GlobalAtomicModifier"), 1e3);
583
-
584
- // decorators/constants.ts
585
- var virid_METADATA = {
586
- SYSTEM: "virid:system_metadata",
587
- MESSAGE: "virid:message",
588
- CONTROLLER: "virid:controller",
589
- COMPONENT: "virid:component"
590
- };
591
-
592
- // decorators/ccs.ts
593
- var import_inversify2 = require("inversify");
594
- var import_reflect_metadata = require("reflect-metadata");
595
- function System(priority = 0) {
596
- return (target, key, descriptor) => {
597
- const originalMethod = descriptor.value;
598
- const types = Reflect.getMetadata("design:paramtypes", target, key) || [];
599
- if (types.length === 0) {
600
- MessageWriter.error(new Error(`[Virid System] System Parameter Loss:
601
- Unable to recognize system parameters, please confirm if import "reflection-metadata" was introduced at the beginning!`));
602
- }
603
- const readerConfigs = Reflect.getMetadata(virid_METADATA.MESSAGE, target, key) || [];
604
- if (readerConfigs.length > 1) {
605
- MessageWriter.warn(`[Virid System] Multiple Messages Are Not Allowed: ${key} has multiple @Message() decorators!`);
606
- return;
607
- }
608
- const wrappedSystem = /* @__PURE__ */ __name(function(currentMessage) {
609
- const args = types.map((type, index) => {
610
- const config = readerConfigs.find((c) => c.index === index);
611
- if (config) {
612
- const { eventClass, single } = config;
613
- const sample = Array.isArray(currentMessage) ? currentMessage[0] : currentMessage;
614
- if (!(sample instanceof eventClass)) {
615
- MessageWriter.error(new Error(`[Virid System] Type Mismatch: Expected ${eventClass.name}, but received ${sample?.constructor.name}`));
616
- return null;
617
- }
618
- if (sample instanceof SingleMessage) {
619
- if (single) {
620
- return Array.isArray(currentMessage) ? currentMessage[currentMessage.length - 1] : currentMessage;
621
- }
622
- return Array.isArray(currentMessage) ? currentMessage : [
623
- currentMessage
624
- ];
625
- }
626
- if (sample instanceof EventMessage) {
627
- return currentMessage;
628
- }
629
- return currentMessage;
630
- }
631
- const param = viridApp.get(type);
632
- if (!param) MessageWriter.error(new Error(`[Virid System] Unknown Inject Data Types: ${type.name} is not registered in the container!`));
633
- return param;
634
- });
635
- const result = originalMethod(...args);
636
- const handleResult = /* @__PURE__ */ __name((res) => {
637
- if (!res) return;
638
- const messages = Array.isArray(res) ? res : [
639
- res
640
- ];
641
- messages.forEach((m) => {
642
- if (m instanceof BaseMessage) {
643
- MessageWriter.write(m);
644
- }
645
- });
646
- }, "handleResult");
647
- return result instanceof Promise ? result.then(handleResult) : handleResult(result);
648
- }, "wrappedSystem");
649
- const taskContext = {
650
- params: types,
651
- targetClass: target,
652
- methodName: key,
653
- originalMethod
654
- };
655
- wrappedSystem.ccsContext = taskContext;
656
- descriptor.value = wrappedSystem;
657
- readerConfigs.forEach((config) => {
658
- viridApp.register(config.eventClass, wrappedSystem, priority);
659
- });
660
- };
661
- }
662
- __name(System, "System");
663
- function Message(eventClass, single = true) {
664
- return (target, key, index) => {
665
- const configs = Reflect.getMetadata(virid_METADATA.MESSAGE, target, key) || [];
666
- configs.push({
667
- index,
668
- eventClass,
669
- single
670
- });
671
- Reflect.defineMetadata(virid_METADATA.MESSAGE, configs, target, key);
672
- };
673
- }
674
- __name(Message, "Message");
675
- function Controller() {
676
- return (target) => {
677
- (0, import_inversify2.injectable)()(target);
678
- Reflect.defineMetadata(virid_METADATA.CONTROLLER, true, target);
679
- };
680
- }
681
- __name(Controller, "Controller");
682
- function Component() {
683
- return (target) => {
684
- (0, import_inversify2.injectable)()(target);
685
- Reflect.defineMetadata(virid_METADATA.COMPONENT, true, target);
686
- };
687
- }
688
- __name(Component, "Component");
689
-
690
- // index.ts
691
- function createVirid() {
692
- return viridApp;
693
- }
694
- __name(createVirid, "createVirid");
695
- // Annotate the CommonJS export names for ESM import in node:
696
- 0 && (module.exports = {
697
- AtomicModifyMessage,
698
- BaseMessage,
699
- Component,
700
- Controller,
701
- ErrorMessage,
702
- EventMessage,
703
- Message,
704
- MessageInternal,
705
- MessageWriter,
706
- SingleMessage,
707
- System,
708
- WarnMessage,
709
- activatInstance,
710
- createVirid,
711
- publisher
712
- });
1
+ /**
2
+ * @virid/core v0.0.1
3
+ * A lightweight and powerful message core built using dependency injection and CCS concepts
4
+ */
5
+ var se=Object.defineProperty;var he=(s,e,t)=>e in s?se(s,e,{enumerable:!0,configurable:!0,writable:!0,value:t}):s[e]=t;var o=(s,e)=>se(s,"name",{value:e,configurable:!0});var i=(s,e,t)=>he(s,typeof e!="symbol"?e+"":e,t);var G=class G{static send(...e){a.write(this,...e)}};o(G,"BaseMessage");var y=G,j=class j extends y{constructor(){super();i(this,"__kind","SingleMessage")}};o(j,"SingleMessage");var x=j,L=class L extends y{constructor(){super();i(this,"__kind","EventMessage")}};o(L,"EventMessage");var g=L,W=class W extends g{constructor(t,r){super();i(this,"error");i(this,"context");this.error=t,this.context=r}};o(W,"ErrorMessage");var v=W,F=class F extends g{constructor(t){super();i(this,"context");this.context=t}};o(F,"WarnMessage");var b=F,Q=class Q extends g{constructor(t){super();i(this,"context");this.context=t}};o(Q,"InfoMessage");var S=Q,z=class z extends g{constructor(t,r,n){super();i(this,"ComponentClass");i(this,"recipe");i(this,"label");this.ComponentClass=t,this.recipe=r,this.label=n}};o(z,"AtomicModifyMessage");var M=z;var V=null;function ne(s){V=s}o(ne,"activateInstance");var ue=new Proxy({},{get(s,e){return e==="dispatch"?t=>{if(!V){console.error(`[Virid] Message dispatched before system init: ${t.constructor.name}`);return}return V.dispatch(t)}:Reflect.get(V||{},e)}}),U=class U{static write(e,...t){let r=typeof e=="function"?new e(...t):e;ue.dispatch(r)}static error(e,t=""){this.write(new v(e,t))}static warn(e){this.write(new b(e))}static info(e){this.write(new S(e))}};o(U,"MessageWriter");var a=U;var J=class J{constructor(e){i(this,"dirtySignalTypes",new Set);i(this,"eventQueue",[]);i(this,"isRunning",!1);i(this,"globalTick",0);i(this,"internalDepth",0);i(this,"eventHub");i(this,"tickPayload",{});i(this,"beforeExecuteHooks",[]);i(this,"afterExecuteHooks",[]);i(this,"beforeTickHooks",[]);i(this,"afterTickHooks",[]);this.eventHub=e}addBeforeExecute(e,t,r){r?this.beforeExecuteHooks.unshift({type:e,handler:t}):this.beforeExecuteHooks.push({type:e,handler:t})}addAfterExecute(e,t,r){r?this.afterExecuteHooks.unshift({type:e,handler:t}):this.afterExecuteHooks.push({type:e,handler:t})}addBeforeTick(e,t){t?this.beforeTickHooks.unshift(e):this.beforeTickHooks.push(e)}addAfterTick(e,t){t?this.afterTickHooks.unshift(e):this.afterTickHooks.push(e)}markDirty(e){e instanceof g?this.eventQueue.push(e):e instanceof x&&this.dirtySignalTypes.add(e.constructor)}tick(e){if(!(this.isRunning||this.dirtySignalTypes.size===0&&this.eventQueue.length===0)){if(this.internalDepth>100){this.internalDepth=0,this.dirtySignalTypes.clear(),this.eventQueue=[],this.eventHub.reset(),a.error(new Error("[Virid Dispatcher] Deadlock: Recursive loop detected \u{1F4A5}."));return}this.isRunning=!0,this.internalDepth++,queueMicrotask(()=>{let t,r;try{this.internalDepth==0&&(this.tickPayload={},this.executeTickHooks(this.beforeTickHooks));let n=this.prepareSnapshot();t=n.signalSnapshot,r=n.eventSnapshot;let u=this.collectTasks(r,t,e);this.executeTasks(u)}catch(n){a.error(n,"[Virid Dispatcher] Unhandled Error")}finally{t&&r&&this.clear(r,t),this.isRunning=!1,this.dirtySignalTypes.size>0||this.eventQueue.length>0?this.tick(e):(this.executeTickHooks(this.afterTickHooks),this.globalTick++,this.internalDepth=0)}})}}collectTasks(e,t,r){let n=[];for(let l of e)(r.get(l.constructor)||[]).forEach(f=>{n.push(new D(f.fn,f.priority,l,{context:f.fn.systemContext,tick:this.globalTick,payload:{}}))});let u=new Set;for(let l of t)(r.get(l)||[]).forEach(f=>{u.has(f.fn)||(n.push(new D(f.fn,f.priority,this.eventHub.peekSignal(l),{context:f.fn.systemContext,tick:this.globalTick,payload:{}})),u.add(f.fn))});return n}executeTasks(e){e.sort((t,r)=>r.priority-t.priority);for(let t of e)try{let r=t.execute(this.beforeExecuteHooks,this.afterExecuteHooks);r instanceof Promise&&r.catch(n=>a.error(n,`[Virid Dispatcher]: Async System Error.
6
+ SystemLocation: ${t.hookContext.context.targetClass.name}.${t.hookContext.context.methodName}
7
+ MessageName: ${t.message.constructor.name}
8
+ MessageData: ${JSON.stringify(t.message)}`))}catch(r){a.error(r,`[Virid Dispatcher]: Sync System Error.
9
+ SystemLocation: ${t.hookContext.context.targetClass.name}.${t.hookContext.context.methodName}
10
+ MessageName: ${t.message.constructor.name}
11
+ MessageData: ${JSON.stringify(t.message)}`)}}prepareSnapshot(){this.eventHub.flip();let e=new Set(this.dirtySignalTypes),t=[...this.eventQueue];return this.dirtySignalTypes.clear(),this.eventQueue=[],{signalSnapshot:e,eventSnapshot:t}}clear(e,t){let r=new Set(t);e.forEach(n=>r.add(n.constructor)),this.eventHub.clearSignals(r),this.eventHub.clearEvents()}executeTickHooks(e){let t={tick:this.globalTick,timestamp:Date.now(),payload:this.tickPayload};e.forEach(r=>r(t))}};o(J,"Dispatcher");var I=J,Y=class Y{constructor(e,t,r,n){i(this,"fn");i(this,"priority");i(this,"message");i(this,"hookContext");this.fn=e,this.priority=t,this.message=r,this.hookContext=n}triggerHooks(e){let t=Array.isArray(this.message)?this.message[0]:this.message;if(t){for(let r of e)if(t instanceof r.type)try{let n=r.handler(this.message,this.hookContext);n instanceof Promise&&n.catch(u=>{a.error(u,`[Virid Hook] Async Hook Error:
12
+ It is prohibited to use asynchronous hooks within Hook:
13
+ ${r.type.name}`)})}catch(n){a.error(n,`[Virid Hook] Hook Execute Failed:
14
+ Triggered by: ${t.constructor.name}
15
+ Registered type: ${r.type.name}`)}}}execute(e,t){this.triggerHooks(e);let r=o(()=>this.triggerHooks(t),"runAfter");try{let n=this.fn(this.message);return n instanceof Promise?n.finally(()=>r()):(r(),n)}catch(n){throw r(),n}}};o(Y,"ExecutionTask");var D=Y;var q=class q{constructor(){i(this,"signalActive",new Map);i(this,"signalStaging",new Map);i(this,"eventActive",[]);i(this,"eventStaging",[])}push(e){if(e instanceof x){let t=e.constructor;this.signalStaging.has(t)||this.signalStaging.set(t,[]),this.signalStaging.get(t).push(e)}else e instanceof g?this.eventStaging.push(e):a.error(new Error(`[Virid Message] Invalid Message:
16
+ ${e.constructor.name} must extend SingleMessage or EventMessage`))}flip(){this.signalActive=this.signalStaging,this.signalStaging=new Map,this.eventActive=this.eventStaging,this.eventStaging=[]}peekSignal(e){return this.signalActive.get(e)||[]}getEventStream(){return this.eventActive}peekEventAt(e){return this.eventActive[e]}clearSignals(e){e.forEach(t=>this.signalActive.delete(t))}clearEvents(){this.eventActive=[]}reset(){this.signalActive.clear(),this.signalStaging.clear(),this.eventActive=[],this.eventStaging=[]}};o(q,"EventHub");var O=q;var K=class K{constructor(){i(this,"systemTaskMap",new Map)}register(e,t,r=0){let n=this.systemTaskMap.get(e)||[];if(n.findIndex(l=>l.fn===t)===-1)n.push({fn:t,priority:r}),n.sort((l,d)=>d.priority-l.priority),this.systemTaskMap.set(e,n);else{let l=t.name||"Anonymous";return a.error(new Error(`[Virid Error] System Already Registered:
17
+ Class ${e.name}
18
+ Function ${l}`)),()=>{}}return()=>{let l=this.systemTaskMap.get(e);if(l){let d=l.findIndex(f=>f.fn===t);d!==-1&&(l.splice(d,1),l.length===0&&this.systemTaskMap.delete(e))}}}};o(K,"MessageRegistry");var A=K;var X=class X{constructor(){i(this,"eventHub",new O);i(this,"dispatcher",new I(this.eventHub));i(this,"registry",new A);i(this,"middlewares",[]);ne(this)}useMiddleware(e,t){this.middlewares.push(e)}onBeforeExecute(e,t,r){this.dispatcher.addBeforeExecute(e,t,r)}onAfterExecute(e,t,r){this.dispatcher.addAfterExecute(e,t,r)}onBeforeTick(e,t){this.dispatcher.addBeforeTick(e,t)}onAfterTick(e,t){this.dispatcher.addAfterTick(e,t)}dispatch(e){if(!(e instanceof y)){a.error(new Error(`[Virid Dispatch] Type Error: Message must be an instance of BaseMessage,message:${e}`));return}this.pipeline(e,()=>{if(!this.registry.systemTaskMap.has(e.constructor)){a.error(new Error(`[Virid Dispatch] No handler for message: ${e.constructor.name}`));return}this.eventHub.push(e),this.dispatcher.markDirty(e),this.dispatcher.tick(this.registry.systemTaskMap)})}pipeline(e,t){let r=0,n=o(()=>{r<this.middlewares.length?this.middlewares[r++](e,n):t()},"next");n()}register(e,t,r=0){return this.registry.register(e,t,r)}};o(X,"MessageInternal");var $=X;var Z=class Z{constructor(){i(this,"bindings",new Map);i(this,"singletonInstances",new Map)}bind(e){let t={type:"transient",ctor:e};return this.bindings.set(e,t),{toSelf:o(()=>({inSingletonScope:o(()=>(t.type="singleton",{onActivation:o(r=>{},"onActivation")}),"inSingletonScope")}),"toSelf")}}get(e,t){let r=this.bindings.get(e);if(!r)throw new Error(`[Virid Container] Unbound Constructor: No binding found for ${e.name}`);let n=r.ctor;if(r.type==="singleton"){if(!this.singletonInstances.has(e)){let l=new n,d=t(l);this.singletonInstances.set(e,d)}return this.singletonInstances.get(e)}let u=new n;return t(u)}};o(Z,"ViridContainer");var P=Z;var c={reset:"\x1B[0m",red:"\x1B[31m",yellow:"\x1B[33m",blue:"\x1B[34m",magenta:"\x1B[35m",cyan:"\x1B[36m",gray:"\x1B[90m",bold:"\x1B[1m",green:"\x1B[32m"};function N(s,e,t){let r={params:s,targetClass:Object,methodName:t,originalMethod:e};return e.ccsContext=r,e}o(N,"withContext");var de=o(s=>{let e=`${c.green}${c.bold} \u2714 [Virid Info] ${c.reset}`,t=`${c.magenta}${s.context}${c.reset}`;console.log(`${e}${c.gray}Global Info Caught:${c.reset}
19
+ ${c.green}Details:${c.reset}`,s.context||"unknown Info")},"globalInfoHandler"),fe=o(s=>{let e=`${c.red}${c.bold} \u2716 [Virid Error] ${c.reset}`,t=`${c.magenta}${s.context}${c.reset}`;console.error(`${e}${c.gray}Global Error Caught:${c.reset}
20
+ ${c.red}Context:${c.reset} ${t}
21
+ ${c.red}Details:${c.reset}`,s.error||s||"unknown Error")},"globalErrorHandler"),pe=o(s=>{let e=`${c.yellow}${c.bold} \u26A0 [Virid Warn] ${c.reset}`,t=`${c.cyan}${s.context}${c.reset}`;console.warn(`${e}${c.gray}Global Warn Caught:${c.reset}
22
+ ${c.yellow}Context:${c.reset} ${t}`)},"globalWarnHandler"),ge=o(s=>{let e=T.get(s.ComponentClass);if(!e){console.error(`[Virid Modify] Component Not Found:
23
+ Component ${s.ComponentClass.name} not found in Registry.`);return}try{s.recipe(e),a.warn(`[Virid Modify] Successfully:
24
+ Modify on ${s.ComponentClass.name}
25
+ label: ${s.label}`)}catch(t){a.error(t,`[Virid Error] Modify Failed:
26
+ ${s.label}`)}},"atomicModifyHandler");function oe(s){s.register(M,N(M,ge,"GlobalAtomicModifier"),1e3),s.register(b,N(b,pe,"GlobalWarnHandler"),-999),s.register(v,N(v,fe,"GlobalErrorHandler"),-999),s.register(S,N(S,de,"GlobalInfoHandler"),-999),T=s}o(oe,"initializeGlobalSystems");var T=null,qe=new Proxy({},{get(s,e){return(...t)=>{if(!T){console.warn(`[Virid Vue] App method "${String(e)}" called before initialization.`);return}let r=T[e];if(typeof r=="function")return r.apply(T,t)}}});var ie=new Set,te=class te{constructor(){i(this,"container",new P);i(this,"messageInternal",new $);i(this,"activationHooks",[])}addActivationHook(e){this.activationHooks.push(e)}get(e){return e.length>0&&a.error(new Error(`[Virid Container] Violation: Component "${e.name}" should not have constructor arguments. Dependency Injection is only allowed in Systems.`)),this.container.get(e,t=>this.handleActivation(t))}handleActivation(e){return e&&this.activationHooks.reduce((t,r)=>{try{let n=r(t);return n===void 0&&a.warn(`[Virid Container] Hook Does Bot Return A Value: Hook "${r.name}" should return a instance to continue.`),n!==void 0?n:t}catch(n){return a.error(n,"[Virid Container] Activation Hook Failed"),t}},e)}bindController(e){return this.container.bind(e).toSelf(),{inSingletonScope:o(()=>({onActivation:o(()=>{},"onActivation")}),"inSingletonScope")}}bindComponent(e){return this.container.bind(e).toSelf().inSingletonScope(),{onActivation:o(()=>{},"onActivation")}}useMiddleware(e,t=!1){this.messageInternal.useMiddleware(e,t)}onBeforeExecute(e,t,r=!1){this.messageInternal.onBeforeExecute(e,t,r)}onAfterExecute(e,t,r=!1){this.messageInternal.onAfterExecute(e,t,r)}onBeforeTick(e,t=!1){this.messageInternal.onBeforeTick(e,t)}onAfterTick(e,t=!1){this.messageInternal.onAfterTick(e,t)}register(e,t,r=0){return this.messageInternal.register(e,t,r)}use(e,t){if(ie.has(e.name))return a.warn(`[Virid Plugin] Duplicate Installation: Plugin ${e.name} has already been installed.`),this;try{e.install(this,t),ie.add(e.name)}catch(r){a.error(r,`[Virid Plugin]: Install Failed: ${e.name}`)}return this}};o(te,"ViridApp");var ee=te,k=new ee;k.addActivationHook(_);oe(k);var m={SYSTEM:"virid:core:system",MESSAGE:"virid:core:message",CONTROLLER:"virid:core:controller",COMPONENT:"virid:core:component",SAFE:"virid:core:safe",OBSERVER:"virid:core:observer"};var C=o(s=>{if(!s)return;(Array.isArray(s)?s:[s]).forEach(t=>{t instanceof y?a.write(t):a.warn("[Virid HandleResult] Invalid Return Type: Must return Message or Message[].")})},"handleResult");function lt(s={priority:0,messageClass:null}){return(e,t,r)=>{let n=r.value,u=Reflect.getMetadata("design:paramtypes",e,t),l=Reflect.getMetadata(m.MESSAGE,e,t)||null;if(!u){let h=new Error(`[Virid System] System Parameter Loss:
27
+ Unable to recognize system parameters, please confirm if import "reflection-metadata" was introduced at the beginning!`);a.error(h);return}if(u.some(h=>h===void 0)){let h=new Error(`[Virid System] Parameter Metadata Loss in "${t}":
28
+ One or more parameters have 'undefined' types.
29
+ This usually happens when you forget to add a type annotation to a decorated parameter.
30
+ Check parameter at index: ${u.indexOf(void 0)}`);a.error(h);return}if(s.messageClass&&l){a.error(new Error(`[Virid System] Multiple Messages Are Not Allowed: Cannot use @ message() and SystemParams simultaneously in ${t}`));return}if(!s.messageClass&&!l){a.error(new Error(`[Virid System] System Parameter Loss:
31
+ Please declare the message type using the Message decorator`));return}let d=o(h=>{let w=u.map((H,ae)=>{if(l&&l.index==ae){let{messageClass:B,single:ce}=l,R=Array.isArray(h)?h[0]:h;if(!(R instanceof B)){let le=R.constructor.name;throw new Error(`[Virid System] Type Mismatch: Expected ${B.name}, but received ${le}`)}if(R instanceof x)return ce?Array.isArray(h)?h[h.length-1]:h:Array.isArray(h)?h:[h];if(R instanceof g)return h;throw new Error(`[Virid System] unknown Message Types: Message ${B.name} is not a subclass of SingleMessage or EventMessage!`)}let re=k.get(H);if(!re)throw new Error(`[Virid System] unknown Inject Data Types: ${H.name} is not registered in the container!`);return re}),E=n.apply(e,w);return E instanceof Promise?E.then(C):C(E)},"wrappedSystem"),f={params:u,targetClass:e,methodName:t,originalMethod:n};d.systemContext=f,r.value=d;let p=s.messageClass||l.messageClass;k.register(p,d,s.priority)}}o(lt,"System");function ht(s,e=!0){return(t,r,n)=>{if(Reflect.hasOwnMetadata(m.MESSAGE,t,r)){a.error(new Error(`[Virid Message] Multiple Messages Are Not Allowed: ${r} has multiple @Message() decorators!`));return}let u={index:n,messageClass:s,single:e};Reflect.defineMetadata(m.MESSAGE,u,t,r)}}o(ht,"Message");function ut(){return(s,e,t)=>{let r=Reflect.getMetadata(m.SAFE,s)||new Set;r.add(e),Reflect.defineMetadata(m.SAFE,r,s)}}o(ut,"Safe");function dt(s,[]){return(e,t)=>{let r=Reflect.getMetadata(m.OBSERVER,e)||[];r.push({key:t,callback:s}),Reflect.defineMetadata(m.OBSERVER,r,e)}}o(dt,"Observer");function ft(){return s=>{Reflect.defineMetadata(m.CONTROLLER,!0,s)}}o(ft,"Controller");function pt(){return s=>{Reflect.defineMetadata(m.COMPONENT,!0,s)}}o(pt,"Component");var me=["push","pop","shift","unshift","splice","sort","reverse"];function _(s){return!s||typeof s!="object"||Object.prototype.hasOwnProperty.call(s,"__virid_observer_processed__")||(Object.defineProperty(s,"__virid_observer_processed__",{value:!0,enumerable:!1,configurable:!0}),(Reflect.getMetadata(m.OBSERVER,s.constructor)||[]).forEach(({propertyKey:t,callback:r})=>{let n={value:s[t]},u=new Proxy(n,{get(d,f){let p=d.value;return Array.isArray(p)&&me.includes(f)?(...h)=>{let w=[...p],E=p[f].apply(p,h),H=r.call(s,w,p);return C(H),E}:p},set(d,f,p){let h=d.value;if(p===h)return!0;d.value=p;let w=r.call(s,h,p);return C(w),!0}}),l=o(()=>u.value,"getter");l.__virid_box__=n,Object.defineProperty(s,t,{get:l,set:o(d=>{u.value=d},"set"),enumerable:!0,configurable:!0}),n.value&&typeof n.value=="object"&&_(n.value)}),Reflect.ownKeys(s).forEach(t=>{if(t==="__virid_observer_processed__")return;let r=Object.getOwnPropertyDescriptor(s,t);if(r&&r.get)return;let n=s[t];n&&typeof n=="object"&&_(n)})),s}o(_,"bindObservers");function Ct(){return k}o(Ct,"createVirid");export{M as AtomicModifyMessage,y as BaseMessage,pt as Component,ft as Controller,v as ErrorMessage,g as EventMessage,S as InfoMessage,ht as Message,$ as MessageInternal,A as MessageRegistry,a as MessageWriter,dt as Observer,ut as Safe,x as SingleMessage,lt as System,m as VIRID_METADATA,b as WarnMessage,ne as activateInstance,_ as bindObservers,Ct as createVirid,C as handleResult,ue as publisher};
32
+ //# sourceMappingURL=index.js.map