Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
5 changes: 5 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,11 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0

## [Unreleased]

## [v2.0.2] - 2026-03-11

### Added
- Add support for objects with a `handleEvent` property to be callbacks

## [v2.0.1] - 2026-03-06

### Changed
Expand Down
14 changes: 10 additions & 4 deletions callbacks.js
Original file line number Diff line number Diff line change
Expand Up @@ -44,6 +44,8 @@ export const FUNCS = {
prevent: 'aegis:ui:prevent',
revokeObjectURL: 'aegis:ui:revokeObjectURL',
cancelAnimationFrame: 'aegis:ui:cancelAnimationFrame',
clearInterval: 'aegis:clearInterval',
clearTimeout: 'aegis:clearTimeout',
requestFullscreen: 'aegis:ui:requestFullscreen',
toggleFullscreen: 'aegis:ui:toggleFullsceen',
exitFullsceen: 'aegis:ui:exitFullscreen',
Expand Down Expand Up @@ -232,7 +234,7 @@ export const clearRegistry = () => registry.clear();
* @param {Function} callback Callback function to register
* @param {object} [config]
* @param {DisposableStack|AsyncDisposableStack} [config.stack] Optional `DisposableStack` to handle disposal and unregistering.
* @returns {string} The automatically generated key/name of the registered callback
* @returns {CallbackRegistryKey} The automatically generated key/name of the registered callback
*/
export const createCallback = (callback, { stack } = {}) => registerCallback('aegis:callback:' + crypto.randomUUID(), callback, { stack });

Expand All @@ -259,14 +261,16 @@ export function callCallback(name, ...args) {
* @param {Function} callback The callback value to register
* @param {object} config
* @param {DisposableStack|AsyncDisposableStack} [config.stack] Optional `DisposableStack` to handle disposal and unregistering.
* @returns {string} The registered name/key
* @returns {CallbackRegistryKey} The registered name/key
*/
export function registerCallback(name, callback, { stack } = {}) {
if (typeof name === 'string') {
return registerCallback(new CallbackRegistryKey(name), callback, { stack });
}else if (! (name instanceof CallbackRegistryKey)) {
} else if (! (name instanceof CallbackRegistryKey)) {
throw new TypeError('Callback name must be a disposable string/CallbackRegistryKey.');
} if (! (callback instanceof Function)) {
} else if (typeof callback === 'object' && typeof callback.handleEvent === 'function') {
return registerCallback(name, callback.handleEvent.bind(callback), { stack });
} else if (! (typeof callback === 'function' || typeof callback?.handleEvent === 'function')) {
throw new TypeError('Callback must be a function.');
} else if (! _isRegistrationOpen) {
throw new TypeError('Cannot register new callbacks because registry is closed.');
Expand Down Expand Up @@ -340,3 +344,5 @@ export function on(event, callback, { capture = false, passive = false, once = f
return parts.map(([prop, val]) => `${prop}="${val}"`).join(' ');
}
}

globalThis.registry = registry;
2 changes: 1 addition & 1 deletion events.js
Original file line number Diff line number Diff line change
Expand Up @@ -212,9 +212,9 @@ const eventAttrs = new Signal.State([
onError,
]);

const selector = new Signal.Computed(() => eventAttrs.get().map(attr => `[${CSS.escape(attr)}]`).join(', '));

const attrToProp = attr => `on${attr[EVENT_PREFIX_LENGTH].toUpperCase()}${attr.substring(EVENT_PREFIX_LENGTH + 1)}`;
const selector = new Signal.Computed(() => eventAttrs.get().map(attr => `[${CSS.escape(attr)}]`).join(','));

export const eventToProp = event => EVENT_PREFIX + event;

Expand Down
74 changes: 37 additions & 37 deletions package-lock.json

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

8 changes: 4 additions & 4 deletions package.json
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
{
"name": "@aegisjsproject/callback-registry",
"version": "2.0.1",
"version": "2.0.2",
"description": " A callback registry for AegisJSProject",
"keywords": [
"aegis",
Expand Down Expand Up @@ -78,10 +78,10 @@
"homepage": "https://github.com/AegisJSProject/callback-registry#readme",
"devDependencies": {
"@rollup/plugin-terser": "^1.0.0",
"@shgysk8zer0/eslint-config": "^1.0.5",
"@shgysk8zer0/eslint-config": "^1.0.7",
"@shgysk8zer0/polyfills": "^0.6.2",
"@shgysk8zer0/rollup-import": "^2.0.2",
"eslint": "^10.0.2",
"@shgysk8zer0/rollup-import": "^2.0.3",
"eslint": "^10.0.3",
"http-server": "^14.1.1",
"rollup": "^4.59.0"
},
Expand Down
15 changes: 10 additions & 5 deletions test/index.js
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
import { onClick, onClose, onCommand, observeEvents, onLoad, onError, registerSignal, signal as signalAttr, controller as controllerAttr, registerController, onDblclick } from '@aegisjsproject/callback-registry/events.js';
import { createCallback, FUNCS, on, toggleFullsceen, requestFullscreen } from '@aegisjsproject/callback-registry/callbacks.js';
import { onClick, onClose, onCommand, observeEvents, onLoad, onError, registerSignal, signal as signalAttr, controller as controllerAttr, registerController, onDblclick } from '/events.js';
import { createCallback, registerCallback, FUNCS, on, toggleFullsceen, requestFullscreen, getCallback } from '/callbacks.js';

const controller = new AbortController();
const signal = registerSignal(controller.signal);
Expand Down Expand Up @@ -41,9 +41,13 @@ const getSvg = () => new Blob([`
</svg>
`], { type: 'image/svg+xml' });

const callback = registerCallback('handle:event', { handleEvent: event => console.log('handleEvent', event) });
console.log(callback);
setTimeout(() => console.log({ handleEvent: getCallback(callback) }), 5000);

/* eslint-disable indent */
document.body.append(html`
<nav id="nav" ${on('my:foo', ({
<nav id="nav" ${on('myfoo', ({
type, timeStamp, isTrusted,
detail: { type: dType, timeStamp: dtimeStamp, isTrusted: dIsTrusted, target: { tagName: target } } = {},
}) => {
Expand All @@ -57,6 +61,7 @@ document.body.append(html`
code.slot = 'events';
document.getElementById('container').append(code, ', ');
}, { signal })}">
<button type="button" ${onClick}="${callback}">Handle Event</button>
<button type="button" ${onClick}="${FUNCS.navigate.reload}" ${signalAttr}="${signal}">Reload</button>
<button type="button" ${onClick}="${FUNCS.navigate.close}" ${signalAttr}="${signal}">Close</button>
<button type="button" ${onClick}="${FUNCS.ui.print}" ${signalAttr}="${signal}">Print</button>
Expand All @@ -74,8 +79,8 @@ document.body.append(html`
li.textContent = `${event.type} @ ${event.timeStamp}`;
document.getElementById('list').append(li);
}, { signal })}>Add to list</button>
<button type="button" id="abort-btn" ${on('click', () => controller.abort(), { signal, stack })}>Abort</button>
<button type="button" ${on('click', event => event.target.parentElement.dispatchEvent(new CustomEvent('my:foo', { detail: event })), { signal })}>Foo</button>
<!--<button type="button" id="abort-btn" ${on('click', () => controller.abort(), { signal, stack })}>Abort</button>-->
<button type="button" ${on('click', event => event.target.parentElement.dispatchEvent(new CustomEvent('myfoo', { detail: event })), { signal })}>Foo</button>
</nav>
<main id="main" ${onCommand}="${FUNCS.debug.log}">
<div id="container" ${onDblclick}="${FUNCS.ui.requestFullscreen}">
Expand Down
Loading