Skip to content

Commit 252a207

Browse files
committed
update
1 parent 196c9ef commit 252a207

16 files changed

Lines changed: 592 additions & 539 deletions

File tree

bun.lock

Lines changed: 5 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

packages/native/src/event.ts

Lines changed: 35 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -67,6 +67,7 @@ import { getWeakRef } from "./utils/getWeakRef";
6767
import { getPromiseResults } from "./utils/getPromiseResults";
6868
import { isPromise } from "./utils/isPromise";
6969
import { resolveValue } from "./utils/resolveValue";
70+
import { FastEventHooks } from "./types/FastEventHooks";
7071

7172
/**
7273
* FastEvent 事件发射器类
@@ -99,6 +100,7 @@ export class FastEvent<
99100
/** 事件监听器执行时的上下文对象 */
100101
private _context: Context;
101102

103+
private _hooks?: FastEventHooks;
102104
/** 保留的事件消息映射,Key是事件名称,Value是保留的事件消息 */
103105
retainedMessages: Map<string, any> = new Map<string, any>();
104106

@@ -166,7 +168,36 @@ export class FastEvent<
166168
get id() {
167169
return this._options.id!;
168170
}
169-
171+
get hooks(): FastEventHooks {
172+
if (!this._hooks) {
173+
this._hooks = {
174+
AddListener: [],
175+
RemoveListener: [],
176+
ClearListeners: [],
177+
ListenerError: [],
178+
BeforeExecuteListener: [],
179+
AfterExecuteListener: [],
180+
};
181+
}
182+
return this._hooks;
183+
}
184+
/**
185+
* 执行Hook
186+
* @param hookName
187+
* @param args
188+
* @returns
189+
*/
190+
private _executeHooks(hookName: keyof FastEventHooks, args: any[]) {
191+
if (!this._hooks) return;
192+
const hooks = this.hooks[hookName];
193+
if (Array.isArray(hooks)) {
194+
Promise.allSettled(
195+
hooks.map((hook) => {
196+
return (hook as any).apply(this, args);
197+
}),
198+
);
199+
}
200+
}
170201
/**
171202
* 初始化选项
172203
*
@@ -1076,12 +1107,9 @@ export class FastEvent<
10761107
}
10771108
if (isFunction(this._options.onAfterExecuteListener)) {
10781109
Promise.allSettled(results).then((r: any[]) => {
1079-
this._options.onAfterExecuteListener!.call(
1080-
this,
1081-
message,
1082-
getPromiseResults(r),
1083-
nodes,
1084-
);
1110+
const args = [message, getPromiseResults(r), nodes];
1111+
this._options.onAfterExecuteListener!.apply(this, args as any);
1112+
this._executeHooks("AfterExecuteListener", args);
10851113
});
10861114
}
10871115
return results;
Lines changed: 42 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,42 @@
1+
import { FastEventListenerNode, TypedFastEventListener } from "./FastEventListeners";
2+
import { TypedFastEventMessage } from "./FastEventMessages";
3+
import { FastEventListenerArgs, FastEventListenOptions } from "./FastEvents";
4+
import { FastEventSubscriber } from "./FastEventSubscribers";
5+
6+
export type AddListenerHook = (
7+
type: string,
8+
listener: TypedFastEventListener,
9+
options: FastEventListenOptions<Record<string, any>, any>,
10+
) => boolean | FastEventSubscriber | void;
11+
// 当移除监听器时回调
12+
export type RemoveListenerHook = (type: string, listener: TypedFastEventListener) => void;
13+
14+
// 当清空监听器时回调
15+
export type ClearListenersHook = () => void;
16+
// 当监听器函数执行出错时的回调,用于诊断时使用,可以打印错误信息
17+
export type ListenerErrorHook = (
18+
error: Error,
19+
listener: TypedFastEventListener,
20+
message: TypedFastEventMessage<any, any>,
21+
args: FastEventListenerArgs<any> | undefined,
22+
) => void;
23+
// 当执行监听器前时回调,返回false代表取消执行,any[]返回给emit
24+
export type BeforeExecuteListenerHook = (
25+
message: TypedFastEventMessage<any, any>,
26+
args: FastEventListenerArgs<any>,
27+
) => boolean | void | any[];
28+
// 当执行监听器后时回调
29+
export type AfterExecuteListenerHook = (
30+
message: TypedFastEventMessage<any, any>,
31+
returns: any[],
32+
listeners: FastEventListenerNode[],
33+
) => void;
34+
35+
export type FastEventHooks = {
36+
AddListener: AddListenerHook[];
37+
RemoveListener: RemoveListenerHook[];
38+
ClearListeners: ClearListenersHook[];
39+
ListenerError: ListenerErrorHook[];
40+
BeforeExecuteListener: BeforeExecuteListenerHook[];
41+
AfterExecuteListener: AfterExecuteListenerHook[];
42+
};

packages/native/src/types/index.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,3 +8,4 @@ export * from "./FastEventSubscribers";
88
export * from "./FastEvents";
99
export * from "./transformed";
1010
export * from "./closest";
11+
export * from "./FastEventHooks";

packages/viewer/index.html

Lines changed: 32 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,9 @@
1414
}
1515

1616
body {
17-
font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, sans-serif;
17+
font-family:
18+
-apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial,
19+
sans-serif;
1820
background: linear-gradient(135deg, #667eea 0%, #764ba2 100%);
1921
min-height: 100vh;
2022
padding: 2rem;
@@ -186,18 +188,37 @@ <h1>🚀 FastEvent Viewer</h1>
186188
</div>
187189

188190
<div class="controls-wrapper">
191+
<button class="control-btn" onclick="addSimpleSubscribe()">✈️ 增加订阅</button>
189192
<button class="control-btn" onclick="triggerSimpleEvent()">📝 简单事件</button>
190-
<button class="control-btn success" onclick="triggerTaggedEvent()">🏷️ 带标签事件</button>
191-
<button class="control-btn warning" onclick="triggerTransformEvent()">🔄 Transform 事件</button>
192-
<button class="control-btn danger" onclick="triggerErrorEvent()">❌ 错误事件</button>
193-
<button class="control-btn" onclick="triggerMultiListenerEvent()">👥 多监听器事件</button>
194-
<button class="control-btn" onclick="triggerCountedEvent()">🔢 计数限制事件</button>
193+
<button class="control-btn success" onclick="triggerTaggedEvent()">
194+
🏷️ 带标签事件
195+
</button>
196+
<button class="control-btn warning" onclick="triggerTransformEvent()">
197+
🔄 Transform 事件
198+
</button>
199+
<button class="control-btn danger" onclick="triggerErrorEvent()">
200+
❌ 错误事件
201+
</button>
202+
<button class="control-btn" onclick="triggerMultiListenerEvent()">
203+
👥 多监听器事件
204+
</button>
205+
<button class="control-btn" onclick="triggerCountedEvent()">
206+
🔢 计数限制事件
207+
</button>
195208
<button class="control-btn" onclick="triggerBatchEvents()">📦 批量事件</button>
196-
<button class="control-btn" onclick="triggerWildcardEvents()">🎯 通配符事件</button>
209+
<button class="control-btn" onclick="triggerWildcardEvents()">
210+
🎯 通配符事件
211+
</button>
197212
<button class="control-btn" onclick="triggerAsyncEvent()">⏳ 异步事件</button>
198-
<button class="control-btn" onclick="triggerLongRunningEvent()">⏰ 长时间执行</button>
199-
<button class="control-btn success" onclick="startRandomEvents()">🎲 启动随机事件</button>
200-
<button class="control-btn danger" onclick="stopRandomEvents()">⏹️ 停止随机事件</button>
213+
<button class="control-btn" onclick="triggerLongRunningEvent()">
214+
⏰ 长时间执行
215+
</button>
216+
<button class="control-btn success" onclick="startRandomEvents()">
217+
🎲 启动随机事件
218+
</button>
219+
<button class="control-btn danger" onclick="stopRandomEvents()">
220+
⏹️ 停止随机事件
221+
</button>
201222
</div>
202223
</div>
203224
</div>
@@ -227,6 +248,7 @@ <h1>🚀 FastEvent Viewer</h1>
227248
window.triggerLongRunningEvent = demo.triggerLongRunningEvent;
228249
window.startRandomEvents = demo.startRandomEvents;
229250
window.stopRandomEvents = demo.stopRandomEvents;
251+
window.addSimpleSubscribe = demo.addSimpleSubscribe;
230252
</script>
231253
</body>
232254
</html>

packages/viewer/package.json

Lines changed: 18 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -1,32 +1,33 @@
11
{
22
"name": "fastevent-viewer",
3-
"version": "2.4.1",
4-
"description": "visualizes and inspects events for fastevent!",
5-
"main": "dist/index.js",
6-
"module": "dist/index.mjs",
7-
"types": "./dist/index.d.ts",
8-
"private": false,
9-
"access": "public",
10-
"homepage": "https://zhangfisher.github.io/fastevent/",
11-
"repository": {
12-
"type": "git",
13-
"url": "git+https://github.com/zhangfisher/fastevent.git"
14-
},
3+
"version": "2.4.1",
4+
"description": "visualizes and inspects events for fastevent!",
5+
"main": "dist/index.js",
6+
"module": "dist/index.mjs",
7+
"types": "./dist/index.d.ts",
8+
"private": false,
9+
"access": "public",
10+
"homepage": "https://zhangfisher.github.io/fastevent/",
11+
"repository": {
12+
"type": "git",
13+
"url": "git+https://github.com/zhangfisher/fastevent.git"
14+
},
1515
"scripts": {
1616
"dev": "vite",
1717
"build": "tsc && vite build",
1818
"preview": "vite preview"
1919
},
20-
"dependencies": {
20+
"dependencies": {
21+
"@lit-labs/preact-signals": "^1.0.3",
2122
"lit": "^3.3.2"
2223
},
2324
"devDependencies": {
2425
"typescript": "~5.9.3",
2526
"vite": "^8.0.0",
2627
"fastevent": "workspace:*"
2728
},
28-
"keywords": [
29-
"eventemitter",
30-
"events"
31-
]
29+
"keywords": [
30+
"eventemitter",
31+
"events"
32+
]
3233
}

packages/viewer/src/demo.ts

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,11 @@ function simpleEventHandler(data: any) {
1919
}
2020
emitter.on("test/simple", simpleEventHandler);
2121

22+
export function addSimpleSubscribe() {
23+
emitter.on("test/simple", () => {
24+
return Math.abs(Math.random() * 100);
25+
});
26+
}
2227
// 带标签的用户登录监听器 - 返回对象
2328
function userLoginHandler(data: any) {
2429
console.log("[用户登录]", data);

packages/viewer/src/eventViewer/index.ts

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -143,7 +143,7 @@ export class FastEventViewer extends LitElement {
143143
status: status,
144144
fn: new WeakRef(meta[0]),
145145
name: meta[0].name || "anonymous",
146-
count: `${meta[2]}/${meta[1]}`,
146+
count: `${meta[2]}/${meta[1] === 0 ? "∞" : meta[1]}`,
147147
tag: meta[3],
148148
flags: meta[4] as FastEventListenerFlags | undefined,
149149
result: meta[5],
@@ -441,12 +441,13 @@ export class FastEventViewer extends LitElement {
441441
render() {
442442
return html`
443443
${this.renderHeader()}
444-
${this._showListeners
445-
? html`<fastevent-listeners
444+
${
445+
this._showListeners
446+
? html`<fastevent-listeners
446447
.emitter="${this.emitter}"
447448
?dark="${this.dark}">
448449
</fastevent-listeners>`
449-
: html`${this.renderToolbar()}${this.renderLogs()}`
450+
: html`${this.renderToolbar()}${this.renderLogs()}`
450451
}
451452
`;
452453
}

packages/viewer/src/eventViewer/styles.ts

Lines changed: 2 additions & 77 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,8 @@
11
import { css } from "lit";
2+
import { icons } from "../styles/icons";
23

34
export const styles = css`
5+
${icons}
46
:host {
57
display: flex;
68
flex-direction: column;
@@ -117,83 +119,6 @@ export const styles = css`
117119
background: rgba(24, 144, 255, 0.1);
118120
}
119121
120-
.icon {
121-
--icon-size: 16px;
122-
display: inline-block;
123-
background-color: currentColor;
124-
mask-size: cover;
125-
-webkit-mask-size: cover;
126-
vertical-align: text-bottom;
127-
position: relative;
128-
width: var(--icon-size);
129-
height: var(--icon-size);
130-
}
131-
132-
.icon.home {
133-
mask-image: var(--icon-home);
134-
-webkit-mask-image: var(--icon-home);
135-
}
136-
137-
.icon.close {
138-
mask-image: var(--icon-close);
139-
-webkit-mask-image: var(--icon-close);
140-
}
141-
142-
.icon.settings {
143-
mask-image: var(--icon-settings);
144-
-webkit-mask-image: var(--icon-settings);
145-
}
146-
147-
.icon.yes {
148-
mask-image: var(--icon-yes);
149-
-webkit-mask-image: var(--icon-yes);
150-
}
151-
152-
.icon.copy {
153-
mask-image: var(--icon-copy);
154-
-webkit-mask-image: var(--icon-copy);
155-
}
156-
157-
.icon.file {
158-
mask-image: var(--icon-file);
159-
-webkit-mask-image: var(--icon-file);
160-
}
161-
162-
.icon.listeners {
163-
mask-image: var(--icon-listeners);
164-
-webkit-mask-image: var(--icon-listeners);
165-
}
166-
167-
.icon.error {
168-
mask-image: var(--icon-error);
169-
-webkit-mask-image: var(--icon-error);
170-
}
171-
172-
.icon.success {
173-
mask-image: var(--icon-success);
174-
-webkit-mask-image: var(--icon-success);
175-
}
176-
177-
.icon.loading {
178-
mask-image: var(--icon-loading);
179-
-webkit-mask-image: var(--icon-loading);
180-
}
181-
182-
.icon.refresh {
183-
mask-image: var(--icon-refresh);
184-
-webkit-mask-image: var(--icon-refresh);
185-
}
186-
187-
.icon.cancel {
188-
mask-image: var(--icon-cancel);
189-
-webkit-mask-image: var(--icon-cancel);
190-
}
191-
192-
.icon.clear {
193-
mask-image: var(--icon-clear);
194-
-webkit-mask-image: var(--icon-clear);
195-
}
196-
197122
.logs {
198123
flex: 1;
199124
display: flex;

0 commit comments

Comments
 (0)