diff --git a/CHANGELOG.md b/CHANGELOG.md
index 75f5e18..e7dd774 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -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
diff --git a/callbacks.js b/callbacks.js
index 8059cfe..5fb4232 100644
--- a/callbacks.js
+++ b/callbacks.js
@@ -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',
@@ -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 });
@@ -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.');
@@ -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;
diff --git a/events.js b/events.js
index 58e5bff..a192616 100644
--- a/events.js
+++ b/events.js
@@ -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;
diff --git a/package-lock.json b/package-lock.json
index 901b348..73197ed 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -1,12 +1,12 @@
{
"name": "@aegisjsproject/callback-registry",
- "version": "2.0.1",
+ "version": "2.0.2",
"lockfileVersion": 3,
"requires": true,
"packages": {
"": {
"name": "@aegisjsproject/callback-registry",
- "version": "2.0.1",
+ "version": "2.0.2",
"funding": [
{
"type": "librepay",
@@ -23,10 +23,10 @@
},
"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"
},
@@ -138,15 +138,15 @@
}
},
"node_modules/@eslint/config-array": {
- "version": "0.23.2",
- "resolved": "https://registry.npmjs.org/@eslint/config-array/-/config-array-0.23.2.tgz",
- "integrity": "sha512-YF+fE6LV4v5MGWRGj7G404/OZzGNepVF8fxk7jqmqo3lrza7a0uUcDnROGRBG1WFC1omYUS/Wp1f42i0M+3Q3A==",
+ "version": "0.23.3",
+ "resolved": "https://registry.npmjs.org/@eslint/config-array/-/config-array-0.23.3.tgz",
+ "integrity": "sha512-j+eEWmB6YYLwcNOdlwQ6L2OsptI/LO6lNBuLIqe5R7RetD658HLoF+Mn7LzYmAWWNNzdC6cqP+L6r8ujeYXWLw==",
"dev": true,
"license": "Apache-2.0",
"dependencies": {
- "@eslint/object-schema": "^3.0.2",
+ "@eslint/object-schema": "^3.0.3",
"debug": "^4.3.1",
- "minimatch": "^10.2.1"
+ "minimatch": "^10.2.4"
},
"engines": {
"node": "^20.19.0 || ^22.13.0 || >=24"
@@ -166,9 +166,9 @@
}
},
"node_modules/@eslint/core": {
- "version": "1.1.0",
- "resolved": "https://registry.npmjs.org/@eslint/core/-/core-1.1.0.tgz",
- "integrity": "sha512-/nr9K9wkr3P1EzFTdFdMoLuo1PmIxjmwvPozwoSodjNBdefGujXQUF93u1DDZpEaTuDvMsIQddsd35BwtrW9Xw==",
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/@eslint/core/-/core-1.1.1.tgz",
+ "integrity": "sha512-QUPblTtE51/7/Zhfv8BDwO0qkkzQL7P/aWWbqcf4xWLEYn1oKjdO0gglQBB4GAsu7u6wjijbCmzsUTy6mnk6oQ==",
"dev": true,
"license": "Apache-2.0",
"dependencies": {
@@ -200,9 +200,9 @@
}
},
"node_modules/@eslint/object-schema": {
- "version": "3.0.2",
- "resolved": "https://registry.npmjs.org/@eslint/object-schema/-/object-schema-3.0.2.tgz",
- "integrity": "sha512-HOy56KJt48Bx8KmJ+XGQNSUMT/6dZee/M54XyUyuvTvPXJmsERRvBchsUVx1UMe1WwIH49XLAczNC7V2INsuUw==",
+ "version": "3.0.3",
+ "resolved": "https://registry.npmjs.org/@eslint/object-schema/-/object-schema-3.0.3.tgz",
+ "integrity": "sha512-iM869Pugn9Nsxbh/YHRqYiqd23AmIbxJOcpUMOuWCVNdoQJ5ZtwL6h3t0bcZzJUlC3Dq9jCFCESBZnX0GTv7iQ==",
"dev": true,
"license": "Apache-2.0",
"engines": {
@@ -210,13 +210,13 @@
}
},
"node_modules/@eslint/plugin-kit": {
- "version": "0.6.0",
- "resolved": "https://registry.npmjs.org/@eslint/plugin-kit/-/plugin-kit-0.6.0.tgz",
- "integrity": "sha512-bIZEUzOI1jkhviX2cp5vNyXQc6olzb2ohewQubuYlMXZ2Q/XjBO0x0XhGPvc9fjSIiUN0vw+0hq53BJ4eQSJKQ==",
+ "version": "0.6.1",
+ "resolved": "https://registry.npmjs.org/@eslint/plugin-kit/-/plugin-kit-0.6.1.tgz",
+ "integrity": "sha512-iH1B076HoAshH1mLpHMgwdGeTs0CYwL0SPMkGuSebZrwBp16v415e9NZXg2jtrqPVQjf6IANe2Vtlr5KswtcZQ==",
"dev": true,
"license": "Apache-2.0",
"dependencies": {
- "@eslint/core": "^1.1.0",
+ "@eslint/core": "^1.1.1",
"levn": "^0.4.1"
},
"engines": {
@@ -832,9 +832,9 @@
}
},
"node_modules/@shgysk8zer0/rollup-import": {
- "version": "2.0.2",
- "resolved": "https://registry.npmjs.org/@shgysk8zer0/rollup-import/-/rollup-import-2.0.2.tgz",
- "integrity": "sha512-MLC9jHLZ2an2pID10nwRelzI1kX0xJZxiMY2k9wwz7Asl+1h0rs6WtyN4wCRKERdlEI0I2D8JjKQq+GiG211fw==",
+ "version": "2.0.3",
+ "resolved": "https://registry.npmjs.org/@shgysk8zer0/rollup-import/-/rollup-import-2.0.3.tgz",
+ "integrity": "sha512-WDcbYcSo+LgOU2duR8J6OZCpXP3eLtI4+SQI4Y4+d/8JJdOHqCtHeZ8NUjz9/2j1PDFphOFPid7kLbFJ5/VMTQ==",
"dev": true,
"funding": [
{
@@ -848,9 +848,9 @@
],
"license": "MIT",
"dependencies": {
- "@shgysk8zer0/consts": "^1.0.7",
- "@shgysk8zer0/npm-utils": "^1.1.2",
- "magic-string": "^0.30.0"
+ "@shgysk8zer0/consts": "^1.0.8",
+ "@shgysk8zer0/npm-utils": "^1.1.4",
+ "magic-string": "^0.30.21"
},
"engines": {
"node": ">=18.0.0"
@@ -1217,19 +1217,19 @@
}
},
"node_modules/eslint": {
- "version": "10.0.2",
- "resolved": "https://registry.npmjs.org/eslint/-/eslint-10.0.2.tgz",
- "integrity": "sha512-uYixubwmqJZH+KLVYIVKY1JQt7tysXhtj21WSvjcSmU5SVNzMus1bgLe+pAt816yQ8opKfheVVoPLqvVMGejYw==",
+ "version": "10.0.3",
+ "resolved": "https://registry.npmjs.org/eslint/-/eslint-10.0.3.tgz",
+ "integrity": "sha512-COV33RzXZkqhG9P2rZCFl9ZmJ7WL+gQSCRzE7RhkbclbQPtLAWReL7ysA0Sh4c8Im2U9ynybdR56PV0XcKvqaQ==",
"dev": true,
"license": "MIT",
"peer": true,
"dependencies": {
"@eslint-community/eslint-utils": "^4.8.0",
"@eslint-community/regexpp": "^4.12.2",
- "@eslint/config-array": "^0.23.2",
+ "@eslint/config-array": "^0.23.3",
"@eslint/config-helpers": "^0.5.2",
- "@eslint/core": "^1.1.0",
- "@eslint/plugin-kit": "^0.6.0",
+ "@eslint/core": "^1.1.1",
+ "@eslint/plugin-kit": "^0.6.1",
"@humanfs/node": "^0.16.6",
"@humanwhocodes/module-importer": "^1.0.1",
"@humanwhocodes/retry": "^0.4.2",
@@ -1238,7 +1238,7 @@
"cross-spawn": "^7.0.6",
"debug": "^4.3.2",
"escape-string-regexp": "^4.0.0",
- "eslint-scope": "^9.1.1",
+ "eslint-scope": "^9.1.2",
"eslint-visitor-keys": "^5.0.1",
"espree": "^11.1.1",
"esquery": "^1.7.0",
@@ -1251,7 +1251,7 @@
"imurmurhash": "^0.1.4",
"is-glob": "^4.0.0",
"json-stable-stringify-without-jsonify": "^1.0.1",
- "minimatch": "^10.2.1",
+ "minimatch": "^10.2.4",
"natural-compare": "^1.4.0",
"optionator": "^0.9.3"
},
@@ -1274,9 +1274,9 @@
}
},
"node_modules/eslint-scope": {
- "version": "9.1.1",
- "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-9.1.1.tgz",
- "integrity": "sha512-GaUN0sWim5qc8KVErfPBWmc31LEsOkrUJbvJZV+xuL3u2phMUK4HIvXlWAakfC8W4nzlK+chPEAkYOYb5ZScIw==",
+ "version": "9.1.2",
+ "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-9.1.2.tgz",
+ "integrity": "sha512-xS90H51cKw0jltxmvmHy2Iai1LIqrfbw57b79w/J7MfvDfkIkFZ+kj6zC3BjtUwh150HsSSdxXZcsuv72miDFQ==",
"dev": true,
"license": "BSD-2-Clause",
"dependencies": {
diff --git a/package.json b/package.json
index 4a6ada6..2ac071a 100644
--- a/package.json
+++ b/package.json
@@ -1,6 +1,6 @@
{
"name": "@aegisjsproject/callback-registry",
- "version": "2.0.1",
+ "version": "2.0.2",
"description": " A callback registry for AegisJSProject",
"keywords": [
"aegis",
@@ -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"
},
diff --git a/test/index.js b/test/index.js
index 14c1815..2478e03 100644
--- a/test/index.js
+++ b/test/index.js
@@ -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);
@@ -41,9 +41,13 @@ const getSvg = () => new Blob([`
`], { 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`
-