<!DOCTYPE html>
	<html lang="pl" dir="ltr">
	<head>
		<meta charset="UTF-8">
		<title>Ehhhhhh</title>
	</head>
	<body>
		<script src="registerCustomEventDispatcher.js"></script>
		<script>
			registerCustomEventDispatcher( 'raiseEvent', 'mycustomevent' );

			const worker = new Worker( 'worker.js' );

			worker.raiseEvent( 'whatever' );
		</script>
	</body>
	</html>
self.importScripts( 'registerCustomEvent.js' );

registerCustomEvent( 'mycustomevent' );

self.addEventListener( 'mycustomevent', console.log );
self.onmycustomevent = console.warn;
function registerCustomEvent( eventName ) {
	self.addEventListener( 'message', ( { data: { type, name, detail } = {} } ) => {
		if ( type !== 'event' && name !== eventName ) {
			return;
		}

		const event = new CustomEvent( name, {
			detail
		} );
		self.dispatchEvent( event );
	} );

	self.addEventListener( eventName, ( evt ) => {
		if ( typeof self[ `on${ eventName }` ] === 'function' ) {
			self[ `on${ eventName }` ].call( self, evt );
		}
	} );
}
function registerCustomEventDispatcher( dispatcherName, eventName ) {
	Object.defineProperty( Worker.prototype, dispatcherName, {
		value( detail ) {
			const event = {
				type: 'event',
				name: eventName,
				detail
			};
			this.postMessage( event );
		}
	} );
}