@flowlab/event
Version:
FlowLab event-driven system
161 lines (154 loc) • 4.61 kB
JavaScript
// src/bus/EventBus.ts
var EventBus = class {
handlers = /* @__PURE__ */ new Map();
/**
* 触发事件
* @param eventName - 事件名称
* @param payload - 事件数据
*/
async emit(eventName, payload) {
const handlers = this.handlers.get(eventName);
if (handlers) {
for (const handler of handlers) {
try {
await handler(payload);
} catch (err) {
console.error(`[FlowLab EventBus] Error handling event ${eventName}`, err);
}
}
}
}
/**
* 绑定事件处理器
* @param eventName - 事件名称
* @param handler - 事件处理函数
*/
on(eventName, handler) {
if (!this.handlers.has(eventName)) {
this.handlers.set(eventName, /* @__PURE__ */ new Set());
}
this.handlers.get(eventName)?.add(handler);
}
/**
* 解绑事件处理器
* @param eventName - 事件名称
* @param handler - 事件处理函数
*/
off(eventName, handler) {
this.handlers.get(eventName)?.delete(handler);
}
};
// src/bus/InMemoryBus.ts
var InMemoryBus = class extends EventBus {
running = false;
async start() {
this.running = true;
console.log("[FlowLab] \u2705 InMemory EventBus started successfully");
}
async stop() {
this.running = false;
console.log("[FlowLab] \u{1F6D1} InMemory EventBus stopped");
}
isRunning() {
return this.running;
}
};
// src/internal/context.ts
var currentEventBus = new InMemoryBus();
function getCurrentEventBus() {
return currentEventBus;
}
// src/api/emitEvents.ts
async function emitEvent(eventName, payload) {
const bus = getCurrentEventBus();
await bus.emit(eventName, payload);
}
// src/cli/index.ts
import { cac } from "cac";
import colors from "picocolors";
// package.json
var package_default = {
name: "@flowlab/event",
version: "0.1.0",
description: "FlowLab event-driven system",
main: "dist/index.js",
types: "dist/index.d.ts",
bin: {
"flow-event": "./dist/cli/index.js"
},
exports: {
".": {
import: "./dist/index.js",
require: "./dist/index.js"
}
},
files: [
"dist"
],
scripts: {
build: "tsup --config tsup.config.ts",
dev: "tsup src/index.ts --watch",
test: "jest"
},
keywords: [
"event",
"event-driven",
"event-bus",
"event-emitter",
"event-handler",
"event-listener",
"event-dispatcher"
],
author: "luke king",
license: "MIT",
dependencies: {
cac: "^6.7.14",
eventemitter3: "^5.0.1",
ioredis: "^5.6.0",
picocolors: "^1.1.1"
},
devDependencies: {
"@types/jest": "^29.5.14",
jest: "^29.7.0",
"ts-jest": "^29.3.0",
tsup: "^7.2.0",
typescript: "^5.3.3"
}
};
// src/cli/index.ts
import pc from "picocolors";
var cli = cac("flowlab-event");
cli.version(package_default.version).help();
cli.command("emit <event> [data]", "\u89E6\u53D1\u4E00\u4E2A\u4E8B\u4EF6\uFF08JSON \u5B57\u7B26\u4E32\u6216\u6587\u4EF6\uFF09").option("--pretty", "\u7F8E\u5316\u8F93\u51FA").action(async (eventName, data, options) => {
console.log(colors.cyan(`
\u{1F680} \u6B63\u5728\u89E6\u53D1\u4E8B\u4EF6: ${colors.bold(eventName)}
`));
let parsed = {};
try {
parsed = JSON.parse(data);
} catch (e) {
console.warn(colors.yellow("\u26A0\uFE0F \u53C2\u6570\u4E0D\u662F\u6709\u6548 JSON\uFF0C\u4F7F\u7528\u7A7A\u5BF9\u8C61\u66FF\u4EE3"));
}
try {
await emitEvent(eventName, parsed);
console.log(colors.green(`\u2705 \u5DF2\u6210\u529F\u89E6\u53D1\u4E8B\u4EF6 ${eventName}`));
} catch (err) {
console.error(colors.red(`\u274C \u89E6\u53D1\u5931\u8D25: ${err.message}`));
process.exit(1);
}
});
cli.command("welcome", "\u663E\u793A\u6B22\u8FCE\u4FE1\u606F").action(() => {
console.log("\n" + pc.bold(pc.cyan("\u{1F389} \u6B22\u8FCE\u4F7F\u7528 FlowLab CLI - \u4E8B\u4EF6\u5F15\u64CE\u6A21\u5757")));
console.log(pc.dim("--------------------------------------------"));
console.log(pc.blue(`\u{1F4E6} \u6A21\u5757\u540D: ${package_default.name}`));
console.log(pc.green(`\u{1F527} \u7248\u672C\u53F7: v${package_default.version}`));
console.log(pc.yellow("\u{1F464} \u4F5C\u8005: Luke"));
console.log(pc.magenta("\u{1F4D8} \u6587\u6863: https://github.com/countstarss/flowlab"));
console.log(pc.dim("--------------------------------------------"));
console.log(pc.cyan("\n\u{1F680} \u4F60\u53EF\u4EE5\u5F00\u59CB\u4F7F\u7528\u5982\u4E0B\u547D\u4EE4:"));
console.log(pc.dim(` $ event emit user.signup '{"email": "test@example.com"}'`));
console.log("\n");
});
cli.parse();
//# sourceMappingURL=index.mjs.map