Skip to content

Commit 740a84a

Browse files
Merge pull request #13 from Fullscript/support-domain-in-event-listener
fix(messagelistener.ts): generate events for custom domain
2 parents 1eded90 + 751acf2 commit 740a84a

File tree

4 files changed

+42
-10
lines changed

4 files changed

+42
-10
lines changed

src/eventSystem/messageListener/messageListener.spec.ts

Lines changed: 36 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,19 +1,25 @@
1+
import { FullscriptOptions } from "../../fullscript";
12
import { createDispatcher, Dispatcher } from "../dispatcher";
23

34
import { initializeMessageListener } from "./messageListener";
45

56
describe("initializeMessageListener", () => {
67
let dispatcher: Dispatcher;
8+
let mockFullscriptOptions: FullscriptOptions;
79

810
beforeEach(() => {
911
dispatcher = createDispatcher();
12+
mockFullscriptOptions = {
13+
publicKey: "mockPublicKey",
14+
env: "us",
15+
};
1016
});
1117

1218
it("registers a message event listener", () => {
1319
const addEventListener = jest.fn();
1420
window.addEventListener = addEventListener;
1521

16-
initializeMessageListener("us", dispatcher);
22+
initializeMessageListener(mockFullscriptOptions, dispatcher);
1723
expect(addEventListener).toHaveBeenCalled();
1824
});
1925

@@ -24,7 +30,7 @@ describe("initializeMessageListener", () => {
2430
});
2531
window.addEventListener = addEventListener;
2632
dispatcher.dispatch = jest.fn();
27-
initializeMessageListener("us", dispatcher);
33+
initializeMessageListener(mockFullscriptOptions, dispatcher);
2834

2935
const mockEvent = {
3036
origin: "https://us.fullscript.com",
@@ -38,14 +44,39 @@ describe("initializeMessageListener", () => {
3844
expect(dispatcher.dispatch).toHaveBeenCalledWith(mockEvent.data.type, mockEvent.data.payload);
3945
});
4046

41-
it("does not dispatch events if message origin does not match fullscript-js origin", () => {
47+
it("dispatches events if message origin and custom domain match", () => {
48+
let mockCallback;
49+
const optionsWithDomain = {
50+
...mockFullscriptOptions,
51+
domain: "http://test.fullscript.com",
52+
};
53+
const addEventListener = jest.fn((_, callback) => {
54+
mockCallback = callback;
55+
});
56+
window.addEventListener = addEventListener;
57+
dispatcher.dispatch = jest.fn();
58+
initializeMessageListener(optionsWithDomain, dispatcher);
59+
60+
const mockEvent = {
61+
origin: "http://test.fullscript.com",
62+
data: {
63+
type: "treatmentPlan.activated",
64+
payload: "treatmentPlanData",
65+
},
66+
};
67+
68+
mockCallback(new MessageEvent("message", mockEvent));
69+
expect(dispatcher.dispatch).toHaveBeenCalledWith(mockEvent.data.type, mockEvent.data.payload);
70+
});
71+
72+
it("does not dispatch events if message origin does not match fullscript-js origin and no custom domain", () => {
4273
let mockCallback;
4374
const addEventListener = jest.fn((_, callback) => {
4475
mockCallback = callback;
4576
});
4677
window.addEventListener = addEventListener;
4778
dispatcher.dispatch = jest.fn();
48-
initializeMessageListener("us", dispatcher);
79+
initializeMessageListener(mockFullscriptOptions, dispatcher);
4980

5081
const mockEvent = {
5182
origin: "https://malicious.com",
@@ -65,7 +96,7 @@ describe("initializeMessageListener", () => {
6596
mockCallback = callback;
6697
});
6798
window.addEventListener = addEventListener;
68-
initializeMessageListener("us", dispatcher);
99+
initializeMessageListener(mockFullscriptOptions, dispatcher);
69100

70101
const mockEvent = {
71102
origin: "https://us.fullscript.com",

src/eventSystem/messageListener/messageListener.ts

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,9 @@
1-
import { FullscriptEnv, FULLSCRIPT_DOMAINS } from "../../fullscript";
1+
import { FullscriptOptions, FULLSCRIPT_DOMAINS } from "../../fullscript";
22
import { Dispatcher } from "../dispatcher";
33

4-
const initializeMessageListener = (env: FullscriptEnv, dispatcher: Dispatcher): void => {
5-
const origin = FULLSCRIPT_DOMAINS[env];
4+
const initializeMessageListener = (options: FullscriptOptions, dispatcher: Dispatcher): void => {
5+
const { domain, env } = options;
6+
const origin = domain ?? FULLSCRIPT_DOMAINS[env];
67

78
window.addEventListener("message", (e: MessageEvent) => {
89
// !!!! Absolutely required for security purposes !!!!!

src/feature/featureUtil.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@ const getFeatureURL = <F extends FeatureType>(
1414
const { publicKey, env, domain } = fullscriptOptions;
1515
const queryString = buildQueryString({ ...featureOptions, publicKey, frameId });
1616
validateFeatureType(featureType);
17-
const fsDomain = domain ? domain : FULLSCRIPT_DOMAINS[env];
17+
const fsDomain = domain ?? FULLSCRIPT_DOMAINS[env];
1818

1919
return `${fsDomain}/api/embeddable/session${FEATURE_PATHS[featureType]}${queryString}&target_origin=${window.location.origin}`;
2020
};

src/index.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,6 @@ export type {
1919
export const Fullscript = (options: FullscriptOptions): Client => {
2020
validateFullscriptOptions(options);
2121
const eventDispatcher = createDispatcher();
22-
initializeMessageListener(options.env, eventDispatcher);
22+
initializeMessageListener(options, eventDispatcher);
2323
return createClient(options, eventDispatcher);
2424
};

0 commit comments

Comments
 (0)