-
Notifications
You must be signed in to change notification settings - Fork 1.1k
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Add global registry #1367
Add global registry #1367
Conversation
Maybe in order to have an easier time debugging problems, we could:
I spend now some time thinking about how we could have a pure // ASSUMPTION or GOAL:
// any "event" will or has to trigger the "registry way" and "legacy way" before any next event can trigger anything again
var ms = 0
var x = ms ? `ms${ms}` : 'same tick'
var id, legacyEV, registryEV
module.exports = handler => function (event) {
if (this === 'registry') registryHandler(event)
else legacyHandler(event)
}
function registryHandler (event) {
if (registryEV) return errDoubleRegistryCall()
registryEV = event
if (legacyEV && legacyEV === registryEV) return resolve()
if (legacyEV && legacyEV !== registryEV) return errWrongEventRegistry()
id = setTimeout(check, ms)
}
function legacyHandler (event) {
if (legacyEV) return errDoubleLegacyCall()
legacyEV = event
if (registryEV && registryEV === legacyEV) return resolve()
if (registryEV && registryEV !== legacyEV) return errWrongEventLegacy()
handler(event)
}
// HELPER
const resolve = () => {
id = registryEV = legacyEV = clearTimeout(id)
}
const check = () => {
if (legacyEV && legacyEV === registryEV) return resolve()
if (legacyEV && legacyEV !== registryEV) return errWrongEventRegistry()
errSlowLegacyHandler()
}
const errDoubleRegistryCall = () => {
console.error('errDoubleRegistryCall: unhandled event', legacyEV)
throw new Error('registry triggered again before legacy handler')
}
const errDoubleLegacyCall = () => {
console.error('errDoubleLegacyCall: unhandled event', legacyEV)
throw new Error('Legacy triggered again before registry handler')
}
const errWrongEventLegacy = () => {
console.error('errWrongEventLegacy: unhandled event', legacyEV)
throw new Error('legacy triggered with wrong event')
}
const errWrongEventRegistry = () => {
console.error('errWrongEventRegistry: unhandled event', registryEV)
throw new Error('registry triggered with wrong event')
}
const errSlowLegacyHandler = () => {
console.error('errSlowLegacyHandler: unhandled event', legacyEV)
throw new Error(`legacy was not triggered within ${x}`)
} const makeHandler = require('./global/make-handler.js')
const registry = require('./global/registry')
module.exports = Foobar {
constructor (api, events, opts) {
const { uid, events: eventsNew, api: apiNew } = registry.get('app/compiler')
const handler = makeHandler(event => {
console.log('event xxx:', event)
})
events.compiler.register('xxx', handler.bind('registry'))
eventsNew.xxx(handler)
}
} |
I just looked at some documentations, seems using the Error.trace will be a bit tricky cause not standardized (current code does not work for Firefox) and subject to changes - https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Error/Stack |
A little |
No description provided.