Skip to content

Commit d8d52f2

Browse files
refactor: events
1 parent 484fe09 commit d8d52f2

2 files changed

Lines changed: 38 additions & 19 deletions

File tree

src/events/event.ts

Lines changed: 38 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -1,28 +1,49 @@
1-
import { Actions, EventData } from './types';
1+
import { EventType, EventData } from '../actions/types';
2+
3+
const ALLOWED_ORIGINS: string[] =
4+
process.env.NODE_ENV === 'development'
5+
? ['http://localhost:3000']
6+
: ['https://nmrxiv.org'];
27

38
const namespace = 'nmr-wrapper';
49

5-
function trigger<T extends Actions>(action: T, data: EventData<T>) {
6-
const event = new CustomEvent(`${namespace}:${action}`, {
7-
detail: data,
8-
});
9-
window.dispatchEvent(event);
10+
function parseOrigin(origin: string) {
11+
const urlSegments = origin.split('://');
12+
const hostSegments = urlSegments[1].split('.');
13+
14+
const url = `${urlSegments[0]}://${hostSegments
15+
.slice(hostSegments.length > 1 ? 1 : 0)
16+
.join('.')}`;
17+
18+
return url;
19+
}
20+
21+
function trigger<T extends EventType>(type: T, data: EventData<T>) {
22+
window.postMessage({ type: `${namespace}:${type}`, data });
1023
}
1124

12-
function on<T extends Actions>(
13-
action: T,
14-
dataListener: (data: EventData<T>, event?: Event) => void,
25+
function on<T extends EventType>(
26+
type: T,
27+
dataListener: (data: EventData<T>) => void,
1528
options?: boolean | AddEventListenerOptions,
1629
) {
17-
function listener(object: Event) {
18-
const { detail, ...event } = object as CustomEvent;
19-
dataListener?.(detail, event);
30+
function listener(event: MessageEvent) {
31+
const {
32+
origin,
33+
data: { type: targetType, data },
34+
} = event;
35+
36+
if (!ALLOWED_ORIGINS.includes(parseOrigin(origin))) {
37+
throw new Error(`Invalid Origin ${origin}`);
38+
}
39+
40+
if (`${namespace}:${type}` === targetType) {
41+
dataListener?.(data);
42+
}
2043
}
21-
window.addEventListener(`${namespace}:${action}`, listener, options);
22-
}
44+
window.addEventListener(`message`, listener, options);
2345

24-
function clean(action: Actions, listener: (object: Event) => void) {
25-
window.removeEventListener(`${namespace}:${action}`, listener);
46+
return () => window.removeEventListener(`message`, listener);
2647
}
2748

28-
export default { trigger, on, clean };
49+
export default { trigger, on };

src/events/index.ts

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,3 @@
1-
import { Actions } from './types';
21
import event from './event';
32

43
export default event;
5-
export type { Actions };

0 commit comments

Comments
 (0)