or run

npx @tessl/cli init
Log in

Version

Tile

Overview

Evals

Files

Files

docs

context-processing.mddocument-loading.mderror-handling.mdevent-handling.mdindex.mdrdf-operations.mdtransformations.mdurl-utilities.mdutilities.md
tile.json

event-handling.mddocs/

0

# Event Handling

1

2

Event handling system for debugging, monitoring, and safe mode operations. JSON-LD operations can emit various events during processing, and the library provides a comprehensive event handling system for logging, debugging, and implementing custom processing behavior.

3

4

## Capabilities

5

6

### Event Handlers

7

8

The library provides several built-in event handlers for different use cases.

9

10

```javascript { .api }

11

/**

12

* Logs all events to console

13

* @param event - The event object

14

*/

15

function logEventHandler(event);

16

17

/**

18

* Logs only warning-level events to console

19

* @param event - The event object

20

*/

21

function logWarningEventHandler(event);

22

23

/**

24

* Safe event handler that prevents exceptions from stopping processing

25

* @param event - The event object

26

*/

27

function safeEventHandler(event);

28

29

/**

30

* Sets the default event handler for all operations

31

* @param handler - The event handler function

32

*/

33

function setDefaultEventHandler(handler);

34

35

/**

36

* Event handler that leaves events unhandled (no-op)

37

* @param event - The event object

38

*/

39

function unhandledEventHandler(event);

40

41

/**

42

* Strict event handler that throws exceptions for warnings and errors

43

* @param event - The event object

44

*/

45

function strictEventHandler(event);

46

```

47

48

**Usage Examples:**

49

50

```javascript

51

const jsonld = require('jsonld');

52

53

// Use log event handler to see all events

54

jsonld.setDefaultEventHandler(jsonld.logEventHandler);

55

56

// Use warning-only event handler for production

57

jsonld.setDefaultEventHandler(jsonld.logWarningEventHandler);

58

59

// Use safe event handler to prevent crashes

60

jsonld.setDefaultEventHandler(jsonld.safeEventHandler);

61

62

// Use strict event handler to fail fast on warnings/errors

63

jsonld.setDefaultEventHandler(jsonld.strictEventHandler);

64

65

// Custom event handler

66

const customEventHandler = (event) => {

67

if (event.level === 'warning') {

68

console.warn('JSON-LD Warning:', event.message);

69

console.warn('Details:', event.details);

70

}

71

};

72

73

jsonld.setDefaultEventHandler(customEventHandler);

74

75

// Use specific handler for one operation

76

await jsonld.compact(doc, context, {

77

eventHandler: customEventHandler

78

});

79

```

80

81

### Event Structure

82

83

Events emitted by JSON-LD operations follow a consistent structure.

84

85

```javascript { .api }

86

/**

87

* Event object structure

88

*/

89

interface JsonLdEvent {

90

/**

91

* Event severity level

92

*/

93

level: 'info' | 'warning' | 'error';

94

95

/**

96

* Event type/code identifier

97

*/

98

code: string;

99

100

/**

101

* Human-readable event message

102

*/

103

message: string;

104

105

/**

106

* Additional event-specific details

107

*/

108

details?: any;

109

110

/**

111

* Context where the event occurred

112

*/

113

context?: any;

114

}

115

116

/**

117

* Event handler function type

118

*/

119

type EventHandler = (event: JsonLdEvent) => void;

120

```

121

122

### Common Events

123

124

Events that may be emitted during JSON-LD processing.

125

126

**Warning Events:**

127

- **Deprecated Context**: Use of deprecated context features

128

- **Lossy Processing**: Data may be lost during processing

129

- **Invalid Value**: Invalid values encountered but processing continues

130

- **Missing Context**: Context could not be loaded but processing continues

131

132

**Info Events:**

133

- **Context Loaded**: Remote context successfully loaded

134

- **Processing Step**: Information about processing steps

135

- **Cache Hit**: Context resolved from cache

136

137

**Usage Examples:**

138

139

```javascript

140

// Monitor all events during processing

141

const eventMonitor = (event) => {

142

console.log(`[${event.level.toUpperCase()}] ${event.code}: ${event.message}`);

143

144

if (event.details) {

145

console.log('Event details:', event.details);

146

}

147

148

// Track warnings for monitoring

149

if (event.level === 'warning') {

150

trackWarning(event.code, event.message);

151

}

152

};

153

154

jsonld.setDefaultEventHandler(eventMonitor);

155

156

// Process document with event monitoring

157

const result = await jsonld.compact(doc, context);

158

```

159

160

### Safe Mode Integration

161

162

Event handlers are particularly important when using safe mode, as they provide visibility into potential issues.

163

164

**Usage Examples:**

165

166

```javascript

167

// Safe mode with detailed event logging

168

const safeProcessor = async (doc, context) => {

169

const events = [];

170

171

const eventCollector = (event) => {

172

events.push(event);

173

174

// Still log warnings and errors

175

if (event.level !== 'info') {

176

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

177

}

178

};

179

180

try {

181

const result = await jsonld.compact(doc, context, {

182

safe: true,

183

eventHandler: eventCollector

184

});

185

186

return {

187

result,

188

events,

189

warnings: events.filter(e => e.level === 'warning'),

190

errors: events.filter(e => e.level === 'error')

191

};

192

} catch (error) {

193

return {

194

result: null,

195

error,

196

events,

197

warnings: events.filter(e => e.level === 'warning'),

198

errors: events.filter(e => e.level === 'error')

199

};

200

}

201

};

202

203

// Use safe processor

204

const {result, warnings, errors} = await safeProcessor(doc, context);

205

206

if (warnings.length > 0) {

207

console.log(`Processing completed with ${warnings.length} warnings`);

208

}

209

210

if (errors.length > 0) {

211

console.log(`Processing encountered ${errors.length} errors`);

212

}

213

```

214

215

### Custom Event Handlers

216

217

Create custom event handlers for specific use cases like metrics collection, filtering, or integration with logging systems.

218

219

**Usage Examples:**

220

221

```javascript

222

// Metrics collection event handler

223

class MetricsEventHandler {

224

constructor() {

225

this.metrics = {

226

warnings: 0,

227

errors: 0,

228

contextsLoaded: 0,

229

cacheHits: 0

230

};

231

}

232

233

handle(event) {

234

// Count events by level

235

if (event.level === 'warning') {

236

this.metrics.warnings++;

237

} else if (event.level === 'error') {

238

this.metrics.errors++;

239

}

240

241

// Track specific event types

242

switch (event.code) {

243

case 'context loaded':

244

this.metrics.contextsLoaded++;

245

break;

246

case 'cache hit':

247

this.metrics.cacheHits++;

248

break;

249

}

250

}

251

252

getMetrics() {

253

return {...this.metrics};

254

}

255

256

reset() {

257

Object.keys(this.metrics).forEach(key => {

258

this.metrics[key] = 0;

259

});

260

}

261

}

262

263

// Use metrics handler

264

const metricsHandler = new MetricsEventHandler();

265

jsonld.setDefaultEventHandler(event => metricsHandler.handle(event));

266

267

// Process documents

268

await jsonld.compact(doc1, context);

269

await jsonld.expand(doc2);

270

271

// Check metrics

272

console.log('Processing metrics:', metricsHandler.getMetrics());

273

274

// Filtering event handler (only log specific events)

275

const filteredEventHandler = (event) => {

276

// Only log warnings and errors

277

if (event.level === 'warning' || event.level === 'error') {

278

console.log(`[${event.level.toUpperCase()}] ${event.code}: ${event.message}`);

279

}

280

281

// Only log specific event codes

282

const importantCodes = ['deprecated context', 'lossy processing', 'invalid value'];

283

if (importantCodes.includes(event.code)) {

284

console.log(`Important event: ${event.message}`);

285

}

286

};

287

288

// Integration with external logging system

289

const loggerIntegrationHandler = (event) => {

290

// Send to external logger

291

logger.log({

292

level: event.level,

293

message: `JSON-LD ${event.code}: ${event.message}`,

294

metadata: {

295

code: event.code,

296

details: event.details,

297

context: event.context,

298

timestamp: new Date().toISOString()

299

}

300

});

301

};

302

```

303

304

### Event Handler Best Practices

305

306

**Performance Considerations:**

307

- Keep event handlers lightweight as they're called frequently

308

- Avoid synchronous I/O operations in event handlers

309

- Consider using event filtering to reduce processing overhead

310

311

**Error Handling:**

312

- Event handlers should not throw exceptions

313

- Use try-catch within handlers to prevent disrupting JSON-LD processing

314

- Consider using the `safeEventHandler` as a wrapper for custom handlers

315

316

**Debugging:**

317

- Use `logEventHandler` during development for full visibility

318

- Switch to `logWarningEventHandler` or filtered handlers in production

319

- Collect events in safe mode for post-processing analysis

320

321

**Usage Examples:**

322

323

```javascript

324

// Safe wrapper for custom event handlers

325

const makeSafeEventHandler = (handler) => {

326

return (event) => {

327

try {

328

handler(event);

329

} catch (error) {

330

console.error('Event handler error:', error);

331

}

332

};

333

};

334

335

// Use safe wrapper

336

const safeCustomHandler = makeSafeEventHandler(customEventHandler);

337

jsonld.setDefaultEventHandler(safeCustomHandler);

338

339

// Development vs production event handling

340

const isDevelopment = process.env.NODE_ENV === 'development';

341

342

jsonld.setDefaultEventHandler(

343

isDevelopment

344

? jsonld.logEventHandler

345

: jsonld.logWarningEventHandler

346

);

347

```

348

349

## Types

350

351

```javascript { .api }

352

/**

353

* Event severity levels

354

*/

355

type EventLevel = 'info' | 'warning' | 'error';

356

357

/**

358

* Common event codes

359

*/

360

type EventCode =

361

| 'deprecated context'

362

| 'lossy processing'

363

| 'invalid value'

364

| 'missing context'

365

| 'context loaded'

366

| 'processing step'

367

| 'cache hit'

368

| string; // Additional custom codes

369

370

/**

371

* Event handler options in JSON-LD operations

372

*/

373

interface EventHandlerOptions {

374

/**

375

* Custom event handler for this operation

376

*/

377

eventHandler?: EventHandler;

378

}

379

380

/**

381

* Built-in event handlers available

382

*/

383

interface EventHandlers {

384

/**

385

* Logs all events to console

386

*/

387

logEventHandler: EventHandler;

388

389

/**

390

* Logs only warning-level events

391

*/

392

logWarningEventHandler: EventHandler;

393

394

/**

395

* Safe event handler preventing exceptions

396

*/

397

safeEventHandler: EventHandler;

398

399

/**

400

* No-op event handler

401

*/

402

unhandledEventHandler: EventHandler;

403

404

/**

405

* Strict event handler that throws on warnings/errors

406

*/

407

strictEventHandler: EventHandler;

408

}

409

```