Skip to content

Commit

Permalink
New feature: custom ledger events
Browse files Browse the repository at this point in the history
  • Loading branch information
coreybutler committed Dec 12, 2021
1 parent 7e19cb0 commit 598c502
Show file tree
Hide file tree
Showing 3 changed files with 80 additions and 2 deletions.
2 changes: 1 addition & 1 deletion package.json
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
{
"name": "ngn",
"version": "2.0.0-alpha.11",
"version": "2.0.0-alpha.12",
"description": "A JavaScript library for building systems and frameworks.",
"main": "./src/index.js",
"module": "index.js",
Expand Down
64 changes: 63 additions & 1 deletion src/internal.js
Original file line number Diff line number Diff line change
Expand Up @@ -36,7 +36,69 @@ export const plugins = new Proxy(globalThis[REFERENCE_ID], {
}
})

export const LEDGER = new EventEmitter({
class LedgerEventEmitter extends EventEmitter {
#events = new Map()

/**
* Create a custom ledger event type and reference method.
*
* ```
* // Create the event type and method name
* const [EXAMPLE_EVENT_TYPE, fireCustomEvent] = NGN.LEDGER.createEventType('Custom Event Name')
*
* // Listen for the new event type
* NGN.LEDGER.on(EXAMPLE_EVENT_TYPE, function (payloadData) {
* console.log(`Event: "${this.event}"`)
* console.log(payloadData)
* })
*
* // Emit an event to the ledger
* fireCustomEvent('my.custom.event', { payload: 'data' })
* ```
* @param {string} eventName
* Name of the event reference, such as `EXAMPLE_EVENT`.
*/
registerEventType (eventName) {
if (this.#events.has(eventName)) {
throw new Error(`"${eventName}" already exists.`)
}

const CUSTOM_EVENT = Symbol(eventName)
const emitterFn = function () {
LEDGER_EVENT(CUSTOM_EVENT)(...arguments)
}
this.#events.set(eventName, emitterFn)

return [CUSTOM_EVENT, emitterFn]
}

/**
* @property {object} events
* A collection of ledger events (built-in & custom)
*/
get events () {
return Object.assign({
INFO_EVENT,
WARN_EVENT,
ERROR_EVENT,
INTERNAL_EVENT
}, Object.fromEntries(this.#events))
}

/**
* @property {object} emitters
* A collection of ledger event emitters (by event type).
*/
get emitters () {
const methods = { INFO, WARN, ERROR, INTERNAL }
for (const [name, fn] of Object.entries(this.#events)) {
methods[name] = fn
}
return methods
}
}

export const LEDGER = new LedgerEventEmitter({
name: 'NGN Ledger',
description: 'A ledger of events, outputs, and information produced by the system.'
})
Expand Down
16 changes: 16 additions & 0 deletions tests/04-emitter-basic.js
Original file line number Diff line number Diff line change
Expand Up @@ -297,6 +297,22 @@ test('NGN.BUS Special Events', t => {
NGN.WARN('message')
})

test('NGN.LEDGER Custom Events', t => {
const [EXAMPLE_EVENT, customLedgerEventEmitter] = NGN.LEDGER.registerEventType('EXAMPLE_EVENT')

t.expect('symbol', typeof EXAMPLE_EVENT, 'Registered custom event type')
t.expect('function', typeof customLedgerEventEmitter, 'Registered ledger custom event emitter')

NGN.LEDGER.once(EXAMPLE_EVENT, function (label, payload) {
t.pass('EXAMPLE_EVENT custom ledger event recognized')
t.expect('my.event', label, 'Developer-specified custom label recognized')
t.expect('object', typeof payload, 'Payload recognized')
t.end()
})

customLedgerEventEmitter('my.event', { payload: true })
})

test('pool()', t => {
ee = new EventEmitter()
let count = 0
Expand Down

0 comments on commit 598c502

Please # to comment.