iframe-pubsub 1.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1,65 @@
1
+ /**
2
+ * Message to send to another page or component.
3
+ *
4
+ * @property {string} from - The ID of the sending page or component.
5
+ * @property {string} to - The ID of the receiving page or component.
6
+ * @property {any} payload - The payload of the message.
7
+ */
8
+ interface IMessage {
9
+ from: string;
10
+ to: string;
11
+ payload: any;
12
+ }
13
+ type MessageCallback = (message: IMessage) => void | Promise<void>;
14
+ declare class PubSub {
15
+ private static instance;
16
+ private subscribers;
17
+ private mainCallback?;
18
+ private constructor();
19
+ static getInstance(): PubSub;
20
+ onMessage(callback: MessageCallback): void;
21
+ /**
22
+ * Registers a callback function to be called when a message is received.
23
+ *
24
+ * @param pageId The ID of the page or component to register for.
25
+ * @param callback The callback function to be called when a message is received.
26
+ */
27
+ register(pageId: string, callback: MessageCallback): void;
28
+ /**
29
+ * Unregister a page or component from the pubsub.
30
+ * Should unregister the registered page or component if it has been removed.
31
+ *
32
+ * @param pageId The ID of the page or component to unregister from.
33
+ */
34
+ unregister(pageId: string): void;
35
+ sendMessage(message: IMessage): void;
36
+ private handleMessage;
37
+ }
38
+ declare class Client {
39
+ private pageId;
40
+ private callback?;
41
+ private pubsub;
42
+ private isIframe;
43
+ /**
44
+ * Create a new client instance.
45
+ *
46
+ * @param pageId The ID of the page or component to register to.
47
+ */
48
+ constructor(pageId: string);
49
+ /**
50
+ * Listen for messages from the parent page with a callback.
51
+ *
52
+ * @param callback The callback function to register.
53
+ */
54
+ onMessage(callback: MessageCallback): void;
55
+ /**
56
+ * Send a message to the another page or component.
57
+ *
58
+ * @param to The ID of the page or component to send the message to.
59
+ * @param payload The payload of the message.
60
+ */
61
+ sendMessage(to: string, payload: any): void;
62
+ private handleMessage;
63
+ }
64
+
65
+ export { Client, type IMessage, type MessageCallback, PubSub };
@@ -0,0 +1,65 @@
1
+ /**
2
+ * Message to send to another page or component.
3
+ *
4
+ * @property {string} from - The ID of the sending page or component.
5
+ * @property {string} to - The ID of the receiving page or component.
6
+ * @property {any} payload - The payload of the message.
7
+ */
8
+ interface IMessage {
9
+ from: string;
10
+ to: string;
11
+ payload: any;
12
+ }
13
+ type MessageCallback = (message: IMessage) => void | Promise<void>;
14
+ declare class PubSub {
15
+ private static instance;
16
+ private subscribers;
17
+ private mainCallback?;
18
+ private constructor();
19
+ static getInstance(): PubSub;
20
+ onMessage(callback: MessageCallback): void;
21
+ /**
22
+ * Registers a callback function to be called when a message is received.
23
+ *
24
+ * @param pageId The ID of the page or component to register for.
25
+ * @param callback The callback function to be called when a message is received.
26
+ */
27
+ register(pageId: string, callback: MessageCallback): void;
28
+ /**
29
+ * Unregister a page or component from the pubsub.
30
+ * Should unregister the registered page or component if it has been removed.
31
+ *
32
+ * @param pageId The ID of the page or component to unregister from.
33
+ */
34
+ unregister(pageId: string): void;
35
+ sendMessage(message: IMessage): void;
36
+ private handleMessage;
37
+ }
38
+ declare class Client {
39
+ private pageId;
40
+ private callback?;
41
+ private pubsub;
42
+ private isIframe;
43
+ /**
44
+ * Create a new client instance.
45
+ *
46
+ * @param pageId The ID of the page or component to register to.
47
+ */
48
+ constructor(pageId: string);
49
+ /**
50
+ * Listen for messages from the parent page with a callback.
51
+ *
52
+ * @param callback The callback function to register.
53
+ */
54
+ onMessage(callback: MessageCallback): void;
55
+ /**
56
+ * Send a message to the another page or component.
57
+ *
58
+ * @param to The ID of the page or component to send the message to.
59
+ * @param payload The payload of the message.
60
+ */
61
+ sendMessage(to: string, payload: any): void;
62
+ private handleMessage;
63
+ }
64
+
65
+ export { Client, type IMessage, type MessageCallback, PubSub };
package/dist/index.js ADDED
@@ -0,0 +1,177 @@
1
+ "use strict";
2
+ var __defProp = Object.defineProperty;
3
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
4
+ var __getOwnPropNames = Object.getOwnPropertyNames;
5
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
6
+ var __defNormalProp = (obj, key, value) => key in obj ? __defProp(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
7
+ var __export = (target, all) => {
8
+ for (var name in all)
9
+ __defProp(target, name, { get: all[name], enumerable: true });
10
+ };
11
+ var __copyProps = (to, from, except, desc) => {
12
+ if (from && typeof from === "object" || typeof from === "function") {
13
+ for (let key of __getOwnPropNames(from))
14
+ if (!__hasOwnProp.call(to, key) && key !== except)
15
+ __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
16
+ }
17
+ return to;
18
+ };
19
+ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
20
+ var __publicField = (obj, key, value) => __defNormalProp(obj, typeof key !== "symbol" ? key + "" : key, value);
21
+
22
+ // src/index.ts
23
+ var index_exports = {};
24
+ __export(index_exports, {
25
+ Client: () => Client,
26
+ PubSub: () => PubSub
27
+ });
28
+ module.exports = __toCommonJS(index_exports);
29
+ var _PubSub = class _PubSub {
30
+ constructor() {
31
+ __publicField(this, "subscribers");
32
+ __publicField(this, "mainCallback");
33
+ this.subscribers = /* @__PURE__ */ new Map();
34
+ this.handleMessage = this.handleMessage.bind(this);
35
+ window.addEventListener("message", this.handleMessage);
36
+ }
37
+ static getInstance() {
38
+ if (!_PubSub.instance) {
39
+ _PubSub.instance = new _PubSub();
40
+ }
41
+ return _PubSub.instance;
42
+ }
43
+ onMessage(callback) {
44
+ this.mainCallback = callback;
45
+ }
46
+ /**
47
+ * Registers a callback function to be called when a message is received.
48
+ *
49
+ * @param pageId The ID of the page or component to register for.
50
+ * @param callback The callback function to be called when a message is received.
51
+ */
52
+ register(pageId, callback) {
53
+ this.subscribers.set(pageId, { callback });
54
+ }
55
+ /**
56
+ * Unregister a page or component from the pubsub.
57
+ * Should unregister the registered page or component if it has been removed.
58
+ *
59
+ * @param pageId The ID of the page or component to unregister from.
60
+ */
61
+ unregister(pageId) {
62
+ this.subscribers.delete(pageId);
63
+ }
64
+ sendMessage(message) {
65
+ if (this.mainCallback) {
66
+ this.mainCallback(message);
67
+ }
68
+ const subscriber = this.subscribers.get(message.to);
69
+ if (!subscriber) return;
70
+ if (subscriber.source) {
71
+ subscriber.source.postMessage(message, "*");
72
+ } else {
73
+ subscriber.callback(message);
74
+ }
75
+ }
76
+ async handleMessage(event) {
77
+ const data = event.data;
78
+ const source = event.source;
79
+ if (data?.type === "REGISTER") {
80
+ const registration = data;
81
+ this.subscribers.set(registration.pageId, {
82
+ source,
83
+ callback: (message2) => {
84
+ source.postMessage(message2, "*");
85
+ }
86
+ });
87
+ return;
88
+ }
89
+ if (!data || !data.from || !data.to) return;
90
+ const message = data;
91
+ if (this.mainCallback) {
92
+ await this.mainCallback(message);
93
+ }
94
+ const subscriber = this.subscribers.get(message.to);
95
+ if (!subscriber) return;
96
+ if (subscriber.source) {
97
+ subscriber.source.postMessage(message, "*");
98
+ } else {
99
+ await subscriber.callback(message);
100
+ }
101
+ }
102
+ };
103
+ __publicField(_PubSub, "instance");
104
+ var PubSub = _PubSub;
105
+ var Client = class {
106
+ /**
107
+ * Create a new client instance.
108
+ *
109
+ * @param pageId The ID of the page or component to register to.
110
+ */
111
+ constructor(pageId) {
112
+ __publicField(this, "pageId");
113
+ __publicField(this, "callback");
114
+ __publicField(this, "pubsub");
115
+ __publicField(this, "isIframe");
116
+ this.pageId = pageId;
117
+ this.pubsub = PubSub.getInstance();
118
+ this.isIframe = window !== window.parent;
119
+ if (this.isIframe) {
120
+ window.parent.postMessage({
121
+ type: "REGISTER",
122
+ pageId: this.pageId
123
+ }, "*");
124
+ window.addEventListener("message", this.handleMessage.bind(this));
125
+ } else {
126
+ this.pubsub.register(pageId, this.handleMessage.bind(this));
127
+ }
128
+ }
129
+ /**
130
+ * Listen for messages from the parent page with a callback.
131
+ *
132
+ * @param callback The callback function to register.
133
+ */
134
+ onMessage(callback) {
135
+ this.callback = callback;
136
+ }
137
+ /**
138
+ * Send a message to the another page or component.
139
+ *
140
+ * @param to The ID of the page or component to send the message to.
141
+ * @param payload The payload of the message.
142
+ */
143
+ sendMessage(to, payload) {
144
+ const message = {
145
+ from: this.pageId,
146
+ to,
147
+ payload
148
+ };
149
+ if (this.isIframe) {
150
+ window.parent.postMessage(message, "*");
151
+ } else {
152
+ this.pubsub.sendMessage(message);
153
+ }
154
+ }
155
+ async handleMessage(event) {
156
+ let message;
157
+ if (event.data) {
158
+ const evt = event;
159
+ message = evt.data;
160
+ } else {
161
+ message = event;
162
+ }
163
+ if (!message || !message.from || !message.to || message.to !== this.pageId) return;
164
+ if (this.callback) {
165
+ try {
166
+ await this.callback(message);
167
+ } catch (error) {
168
+ console.error(`Client ${this.pageId} failed to process message:`, error);
169
+ }
170
+ }
171
+ }
172
+ };
173
+ // Annotate the CommonJS export names for ESM import in node:
174
+ 0 && (module.exports = {
175
+ Client,
176
+ PubSub
177
+ });
package/dist/index.mjs ADDED
@@ -0,0 +1,153 @@
1
+ var __defProp = Object.defineProperty;
2
+ var __defNormalProp = (obj, key, value) => key in obj ? __defProp(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
3
+ var __publicField = (obj, key, value) => __defNormalProp(obj, typeof key !== "symbol" ? key + "" : key, value);
4
+
5
+ // src/index.ts
6
+ var _PubSub = class _PubSub {
7
+ constructor() {
8
+ __publicField(this, "subscribers");
9
+ __publicField(this, "mainCallback");
10
+ this.subscribers = /* @__PURE__ */ new Map();
11
+ this.handleMessage = this.handleMessage.bind(this);
12
+ window.addEventListener("message", this.handleMessage);
13
+ }
14
+ static getInstance() {
15
+ if (!_PubSub.instance) {
16
+ _PubSub.instance = new _PubSub();
17
+ }
18
+ return _PubSub.instance;
19
+ }
20
+ onMessage(callback) {
21
+ this.mainCallback = callback;
22
+ }
23
+ /**
24
+ * Registers a callback function to be called when a message is received.
25
+ *
26
+ * @param pageId The ID of the page or component to register for.
27
+ * @param callback The callback function to be called when a message is received.
28
+ */
29
+ register(pageId, callback) {
30
+ this.subscribers.set(pageId, { callback });
31
+ }
32
+ /**
33
+ * Unregister a page or component from the pubsub.
34
+ * Should unregister the registered page or component if it has been removed.
35
+ *
36
+ * @param pageId The ID of the page or component to unregister from.
37
+ */
38
+ unregister(pageId) {
39
+ this.subscribers.delete(pageId);
40
+ }
41
+ sendMessage(message) {
42
+ if (this.mainCallback) {
43
+ this.mainCallback(message);
44
+ }
45
+ const subscriber = this.subscribers.get(message.to);
46
+ if (!subscriber) return;
47
+ if (subscriber.source) {
48
+ subscriber.source.postMessage(message, "*");
49
+ } else {
50
+ subscriber.callback(message);
51
+ }
52
+ }
53
+ async handleMessage(event) {
54
+ const data = event.data;
55
+ const source = event.source;
56
+ if (data?.type === "REGISTER") {
57
+ const registration = data;
58
+ this.subscribers.set(registration.pageId, {
59
+ source,
60
+ callback: (message2) => {
61
+ source.postMessage(message2, "*");
62
+ }
63
+ });
64
+ return;
65
+ }
66
+ if (!data || !data.from || !data.to) return;
67
+ const message = data;
68
+ if (this.mainCallback) {
69
+ await this.mainCallback(message);
70
+ }
71
+ const subscriber = this.subscribers.get(message.to);
72
+ if (!subscriber) return;
73
+ if (subscriber.source) {
74
+ subscriber.source.postMessage(message, "*");
75
+ } else {
76
+ await subscriber.callback(message);
77
+ }
78
+ }
79
+ };
80
+ __publicField(_PubSub, "instance");
81
+ var PubSub = _PubSub;
82
+ var Client = class {
83
+ /**
84
+ * Create a new client instance.
85
+ *
86
+ * @param pageId The ID of the page or component to register to.
87
+ */
88
+ constructor(pageId) {
89
+ __publicField(this, "pageId");
90
+ __publicField(this, "callback");
91
+ __publicField(this, "pubsub");
92
+ __publicField(this, "isIframe");
93
+ this.pageId = pageId;
94
+ this.pubsub = PubSub.getInstance();
95
+ this.isIframe = window !== window.parent;
96
+ if (this.isIframe) {
97
+ window.parent.postMessage({
98
+ type: "REGISTER",
99
+ pageId: this.pageId
100
+ }, "*");
101
+ window.addEventListener("message", this.handleMessage.bind(this));
102
+ } else {
103
+ this.pubsub.register(pageId, this.handleMessage.bind(this));
104
+ }
105
+ }
106
+ /**
107
+ * Listen for messages from the parent page with a callback.
108
+ *
109
+ * @param callback The callback function to register.
110
+ */
111
+ onMessage(callback) {
112
+ this.callback = callback;
113
+ }
114
+ /**
115
+ * Send a message to the another page or component.
116
+ *
117
+ * @param to The ID of the page or component to send the message to.
118
+ * @param payload The payload of the message.
119
+ */
120
+ sendMessage(to, payload) {
121
+ const message = {
122
+ from: this.pageId,
123
+ to,
124
+ payload
125
+ };
126
+ if (this.isIframe) {
127
+ window.parent.postMessage(message, "*");
128
+ } else {
129
+ this.pubsub.sendMessage(message);
130
+ }
131
+ }
132
+ async handleMessage(event) {
133
+ let message;
134
+ if (event.data) {
135
+ const evt = event;
136
+ message = evt.data;
137
+ } else {
138
+ message = event;
139
+ }
140
+ if (!message || !message.from || !message.to || message.to !== this.pageId) return;
141
+ if (this.callback) {
142
+ try {
143
+ await this.callback(message);
144
+ } catch (error) {
145
+ console.error(`Client ${this.pageId} failed to process message:`, error);
146
+ }
147
+ }
148
+ }
149
+ };
150
+ export {
151
+ Client,
152
+ PubSub
153
+ };
package/package.json ADDED
@@ -0,0 +1,21 @@
1
+ {
2
+ "name": "iframe-pubsub",
3
+ "version": "1.0.0",
4
+ "main": "./dist/index.js",
5
+ "module": "./dist/index.mjs",
6
+ "types": "./dist/index.d.ts",
7
+ "private": false,
8
+ "files": [
9
+ "dist"
10
+ ],
11
+ "scripts": {
12
+ "build": "tsup src/index.ts --format cjs,esm --dts",
13
+ "dev": "tsup src/index.ts --format cjs,esm --dts --watch",
14
+ "lint": "eslint src/"
15
+ },
16
+ "devDependencies": {
17
+ "@types/node": "^20.11.20",
18
+ "tsup": "^8.0.2",
19
+ "typescript": "^5.3.3"
20
+ }
21
+ }