or run

npx @tessl/cli init
Log in

Version

Tile

Overview

Evals

Files

Files

docs

environment-performance.mdevent-system.mdindex.mdobject-utilities.mdstring-processing.mdtype-checking.mdwarning-system.md
tile.json

event-system.mddocs/

0

# Event System

1

2

Type-safe event emitter implementation with support for wildcard listeners and strongly-typed event payloads. Forked from the mitt library with TypeScript enhancements.

3

4

## Capabilities

5

6

### Event Emitter Creation

7

8

Create a new event emitter instance with type-safe event handling.

9

10

```typescript { .api }

11

/**

12

* Create a type-safe event emitter

13

* @returns Event emitter instance with on/off/emit methods

14

*/

15

function createEmitter<Events extends Record<EventType, unknown>>(): Emittable<Events>;

16

```

17

18

**Usage Example:**

19

20

```typescript

21

import { createEmitter, type Emittable } from "@intlify/shared";

22

23

// Define event types

24

interface MyEvents {

25

userLogin: { userId: string; timestamp: number };

26

userLogout: { userId: string };

27

dataUpdate: { data: any[] };

28

}

29

30

// Create typed emitter

31

const emitter = createEmitter<MyEvents>();

32

33

// Type-safe event handling

34

emitter.on("userLogin", (payload) => {

35

// payload is automatically typed as { userId: string; timestamp: number }

36

console.log(`User ${payload?.userId} logged in at ${payload?.timestamp}`);

37

});

38

39

emitter.emit("userLogin", { userId: "123", timestamp: Date.now() });

40

```

41

42

### Event Registration

43

44

Register event handlers for specific events or all events using wildcard.

45

46

```typescript { .api }

47

/**

48

* Register an event handler for specific event type

49

* @param event - Event name or "*" for wildcard

50

* @param handler - Event handler function

51

*/

52

on<Key extends keyof Events>(

53

event: Key | '*',

54

handler: EventHandler<Events[Key]> | WildcardEventHandler<Events>

55

): void;

56

```

57

58

**Usage Examples:**

59

60

```typescript

61

import { createEmitter } from "@intlify/shared";

62

63

interface AppEvents {

64

error: { message: string; code: number };

65

success: { message: string };

66

}

67

68

const emitter = createEmitter<AppEvents>();

69

70

// Register specific event handler

71

emitter.on("error", (payload) => {

72

console.error(`Error ${payload?.code}: ${payload?.message}`);

73

});

74

75

// Register wildcard handler for all events

76

emitter.on("*", (eventName, payload) => {

77

console.log(`Event ${String(eventName)} fired:`, payload);

78

});

79

```

80

81

### Event Deregistration

82

83

Remove event handlers for specific events or wildcard handlers.

84

85

```typescript { .api }

86

/**

87

* Remove an event handler for specific event type

88

* @param event - Event name or "*" for wildcard

89

* @param handler - Event handler function to remove

90

*/

91

off<Key extends keyof Events>(

92

event: Key | '*',

93

handler: EventHandler<Events[Key]> | WildcardEventHandler<Events>

94

): void;

95

```

96

97

**Usage Example:**

98

99

```typescript

100

import { createEmitter } from "@intlify/shared";

101

102

const emitter = createEmitter<{ test: string }>();

103

104

const handler = (payload?: string) => {

105

console.log("Received:", payload);

106

};

107

108

// Register handler

109

emitter.on("test", handler);

110

111

// Later, remove the same handler

112

emitter.off("test", handler);

113

```

114

115

### Event Emission

116

117

Emit events to trigger all registered handlers.

118

119

```typescript { .api }

120

/**

121

* Emit an event to trigger all registered handlers

122

* @param event - Event name to emit

123

* @param payload - Optional event payload

124

*/

125

emit<Key extends keyof Events>(

126

event: Key,

127

payload?: Events[Key]

128

): void;

129

```

130

131

**Usage Example:**

132

133

```typescript

134

import { createEmitter } from "@intlify/shared";

135

136

interface NotificationEvents {

137

notification: {

138

title: string;

139

body: string;

140

type: "info" | "warning" | "error"

141

};

142

}

143

144

const emitter = createEmitter<NotificationEvents>();

145

146

emitter.on("notification", (payload) => {

147

if (payload) {

148

showNotification(payload.title, payload.body, payload.type);

149

}

150

});

151

152

// Emit notification event

153

emitter.emit("notification", {

154

title: "Update Available",

155

body: "A new version is available for download",

156

type: "info"

157

});

158

```

159

160

## Core Types

161

162

### Event Type Definition

163

164

```typescript { .api }

165

/**

166

* Valid event identifier types

167

*/

168

type EventType = string | symbol;

169

```

170

171

### Event Handler Types

172

173

```typescript { .api }

174

/**

175

* Standard event handler function

176

*/

177

type EventHandler<T = unknown> = (payload?: T) => void;

178

179

/**

180

* Wildcard event handler that receives event name and payload

181

*/

182

type WildcardEventHandler<T = Record<string, unknown>> = (

183

event: keyof T,

184

payload?: T[keyof T]

185

) => void;

186

```

187

188

### Event Handler Collections

189

190

```typescript { .api }

191

/**

192

* Array of event handlers for a specific event

193

*/

194

type EventHandlerList<T = unknown> = Array<EventHandler<T>>;

195

196

/**

197

* Array of wildcard event handlers

198

*/

199

type WildcardEventHandlerList<T = Record<string, unknown>> = Array<

200

WildcardEventHandler<T>

201

>;

202

203

/**

204

* Map storing all event handlers by event name

205

*/

206

type EventHandlerMap<Events extends Record<EventType, unknown>> = Map<

207

keyof Events | '*',

208

EventHandlerList<Events[keyof Events]> | WildcardEventHandlerList<Events>

209

>;

210

```

211

212

### Emittable Interface

213

214

```typescript { .api }

215

/**

216

* Core event emitter interface with type safety

217

*/

218

interface Emittable<Events extends Record<EventType, unknown> = {}> {

219

/**

220

* Map of registered event handlers by event name

221

*/

222

events: EventHandlerMap<Events>;

223

224

/**

225

* Register an event handler

226

* @param event - Event name or "*" for wildcard

227

* @param handler - Handler function

228

*/

229

on<Key extends keyof Events>(

230

event: Key | '*',

231

handler: EventHandler<Events[Key]> | WildcardEventHandler<Events>

232

): void;

233

234

/**

235

* Remove an event handler

236

* @param event - Event name or "*" for wildcard

237

* @param handler - Handler function to remove

238

*/

239

off<Key extends keyof Events>(

240

event: Key | '*',

241

handler: EventHandler<Events[Key]> | WildcardEventHandler<Events>

242

): void;

243

244

/**

245

* Emit an event to all registered handlers

246

* @param event - Event name to emit

247

* @param payload - Event payload

248

*/

249

emit<Key extends keyof Events>(

250

event: Key,

251

payload?: Events[Key]

252

): void;

253

}

254

```

255

256

## Advanced Usage

257

258

### Multiple Handlers

259

260

```typescript

261

import { createEmitter } from "@intlify/shared";

262

263

interface LogEvents {

264

log: { level: string; message: string; timestamp: number };

265

}

266

267

const logger = createEmitter<LogEvents>();

268

269

// Multiple handlers for same event

270

logger.on("log", (payload) => {

271

console.log(`[${payload?.level}] ${payload?.message}`);

272

});

273

274

logger.on("log", (payload) => {

275

if (payload?.level === "error") {

276

sendToErrorReporting(payload);

277

}

278

});

279

280

// Wildcard logger

281

logger.on("*", (eventName, payload) => {

282

saveToDatabase(String(eventName), payload);

283

});

284

```

285

286

### Handler Cleanup

287

288

```typescript

289

import { createEmitter } from "@intlify/shared";

290

291

const emitter = createEmitter<{ cleanup: void }>();

292

293

// Store handler reference for later cleanup

294

const cleanupHandler = () => {

295

console.log("Cleaning up resources");

296

};

297

298

emitter.on("cleanup", cleanupHandler);

299

300

// Later, remove handler to prevent memory leaks

301

emitter.off("cleanup", cleanupHandler);

302

```