@kcuf/messenger 0.0.1 → 0.0.2
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.
- package/README.md +8 -3
- package/dist/cjs/messenger/index.js +16 -12
- package/dist/esm/messenger/index.js +16 -12
- package/dist/esm/messenger/index.js.map +1 -1
- package/dist/esm/types/index.js.map +1 -1
- package/dist/types/messenger/index.d.ts +4 -7
- package/dist/types/types/index.d.ts +2 -2
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -1,8 +1,9 @@
|
|
|
1
1
|
# @kcuf/messenger
|
|
2
2
|
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
3
|
+
* 🧱 优雅且类型安全的 `postMessage`
|
|
4
|
+
* 😎 可以传递 `Error` 对象
|
|
5
|
+
* 🎯 可以转成 `Promise`
|
|
6
|
+
* 🪁 可以跨 Window 发送事件
|
|
6
7
|
|
|
7
8
|
## 兼容性
|
|
8
9
|
|
|
@@ -80,3 +81,7 @@ function useEffectOnMessengerXx(): void {
|
|
|
80
81
|
你还是可以用原生的 `addEventListener('messenger', ...)` 来监听,唯一的区别就是你要自己去判断 `e.data.type` 等。
|
|
81
82
|
|
|
82
83
|
同样的,`@kcuf/messenger#on` 也可以接收裸写的 `postMessage({ type, data })`。只不过,你裸写 `postMessage` 很可能漏掉 `targetOrigin`。
|
|
84
|
+
|
|
85
|
+
### `type` 可否为空字符串?
|
|
86
|
+
|
|
87
|
+
不可。
|
|
@@ -20,9 +20,13 @@ var Messenger = exports.default = /*#__PURE__*/function () {
|
|
|
20
20
|
(0, _defineProperty2.default)(this, "messageReceiverMap", {});
|
|
21
21
|
var thisWindow = (0, _util.getTargetWindow)();
|
|
22
22
|
thisWindow.addEventListener('message', function (e) {
|
|
23
|
-
var _e$data
|
|
24
|
-
|
|
25
|
-
|
|
23
|
+
var _e$data;
|
|
24
|
+
if (!((_e$data = e.data) !== null && _e$data !== void 0 && _e$data.type)) {
|
|
25
|
+
return;
|
|
26
|
+
}
|
|
27
|
+
var _e$data2 = e.data,
|
|
28
|
+
type = _e$data2.type,
|
|
29
|
+
payload = _e$data2.payload;
|
|
26
30
|
var _this$getReceivers = _this.getReceivers(type),
|
|
27
31
|
_this$getReceivers2 = (0, _slicedToArray2.default)(_this$getReceivers, 2),
|
|
28
32
|
receivers = _this$getReceivers2[0],
|
|
@@ -96,9 +100,8 @@ var Messenger = exports.default = /*#__PURE__*/function () {
|
|
|
96
100
|
*/
|
|
97
101
|
}, {
|
|
98
102
|
key: "on",
|
|
99
|
-
value:
|
|
100
|
-
|
|
101
|
-
function on(type, fn) {
|
|
103
|
+
value: function on(type, fn) {
|
|
104
|
+
// eslint-disable-line @typescript-eslint/no-unnecessary-type-parameters
|
|
102
105
|
return this.addReceiver(type, fn);
|
|
103
106
|
}
|
|
104
107
|
|
|
@@ -107,9 +110,8 @@ var Messenger = exports.default = /*#__PURE__*/function () {
|
|
|
107
110
|
*/
|
|
108
111
|
}, {
|
|
109
112
|
key: "once",
|
|
110
|
-
value:
|
|
111
|
-
|
|
112
|
-
function once(type, fn) {
|
|
113
|
+
value: function once(type, fn) {
|
|
114
|
+
// eslint-disable-line @typescript-eslint/no-unnecessary-type-parameters
|
|
113
115
|
return this.addReceiver(type, fn, true);
|
|
114
116
|
}
|
|
115
117
|
|
|
@@ -118,10 +120,9 @@ var Messenger = exports.default = /*#__PURE__*/function () {
|
|
|
118
120
|
*/
|
|
119
121
|
}, {
|
|
120
122
|
key: "onPromise",
|
|
121
|
-
value:
|
|
122
|
-
// eslint-disable-line @typescript-eslint/no-unnecessary-type-parameters
|
|
123
|
-
function onPromise(type, fn) {
|
|
123
|
+
value: function onPromise(type, fn) {
|
|
124
124
|
var _this3 = this;
|
|
125
|
+
// eslint-disable-line @typescript-eslint/no-unnecessary-type-parameters
|
|
125
126
|
return this.on(type, function (payload) {
|
|
126
127
|
if (!(payload !== null && payload !== void 0 && payload._dismiss_)) {
|
|
127
128
|
// 得到的 payload 下有 _dismiss_ 参数才响应,否则 pass
|
|
@@ -159,6 +160,9 @@ var Messenger = exports.default = /*#__PURE__*/function () {
|
|
|
159
160
|
key: "addReceiver",
|
|
160
161
|
value: function addReceiver(type, fn, once) {
|
|
161
162
|
var _this4 = this;
|
|
163
|
+
if (typeof fn !== 'function') {
|
|
164
|
+
throw new Error('Messenger:addReceiver: fn is not a function');
|
|
165
|
+
}
|
|
162
166
|
var receivers = this.messageReceiverMap[type];
|
|
163
167
|
if (!receivers) {
|
|
164
168
|
receivers = [];
|
|
@@ -14,9 +14,13 @@ var Messenger = /*#__PURE__*/function () {
|
|
|
14
14
|
_defineProperty(this, "messageReceiverMap", {});
|
|
15
15
|
var thisWindow = getTargetWindow();
|
|
16
16
|
thisWindow.addEventListener('message', function (e) {
|
|
17
|
-
var _e$data
|
|
18
|
-
|
|
19
|
-
|
|
17
|
+
var _e$data;
|
|
18
|
+
if (!((_e$data = e.data) !== null && _e$data !== void 0 && _e$data.type)) {
|
|
19
|
+
return;
|
|
20
|
+
}
|
|
21
|
+
var _e$data2 = e.data,
|
|
22
|
+
type = _e$data2.type,
|
|
23
|
+
payload = _e$data2.payload;
|
|
20
24
|
var _this$getReceivers = _this.getReceivers(type),
|
|
21
25
|
_this$getReceivers2 = _slicedToArray(_this$getReceivers, 2),
|
|
22
26
|
receivers = _this$getReceivers2[0],
|
|
@@ -90,9 +94,8 @@ var Messenger = /*#__PURE__*/function () {
|
|
|
90
94
|
*/
|
|
91
95
|
}, {
|
|
92
96
|
key: "on",
|
|
93
|
-
value:
|
|
94
|
-
|
|
95
|
-
function on(type, fn) {
|
|
97
|
+
value: function on(type, fn) {
|
|
98
|
+
// eslint-disable-line @typescript-eslint/no-unnecessary-type-parameters
|
|
96
99
|
return this.addReceiver(type, fn);
|
|
97
100
|
}
|
|
98
101
|
|
|
@@ -101,9 +104,8 @@ var Messenger = /*#__PURE__*/function () {
|
|
|
101
104
|
*/
|
|
102
105
|
}, {
|
|
103
106
|
key: "once",
|
|
104
|
-
value:
|
|
105
|
-
|
|
106
|
-
function once(type, fn) {
|
|
107
|
+
value: function once(type, fn) {
|
|
108
|
+
// eslint-disable-line @typescript-eslint/no-unnecessary-type-parameters
|
|
107
109
|
return this.addReceiver(type, fn, true);
|
|
108
110
|
}
|
|
109
111
|
|
|
@@ -112,10 +114,9 @@ var Messenger = /*#__PURE__*/function () {
|
|
|
112
114
|
*/
|
|
113
115
|
}, {
|
|
114
116
|
key: "onPromise",
|
|
115
|
-
value:
|
|
116
|
-
// eslint-disable-line @typescript-eslint/no-unnecessary-type-parameters
|
|
117
|
-
function onPromise(type, fn) {
|
|
117
|
+
value: function onPromise(type, fn) {
|
|
118
118
|
var _this3 = this;
|
|
119
|
+
// eslint-disable-line @typescript-eslint/no-unnecessary-type-parameters
|
|
119
120
|
return this.on(type, function (payload) {
|
|
120
121
|
if (!(payload !== null && payload !== void 0 && payload._dismiss_)) {
|
|
121
122
|
// 得到的 payload 下有 _dismiss_ 参数才响应,否则 pass
|
|
@@ -153,6 +154,9 @@ var Messenger = /*#__PURE__*/function () {
|
|
|
153
154
|
key: "addReceiver",
|
|
154
155
|
value: function addReceiver(type, fn, once) {
|
|
155
156
|
var _this4 = this;
|
|
157
|
+
if (typeof fn !== 'function') {
|
|
158
|
+
throw new Error('Messenger:addReceiver: fn is not a function');
|
|
159
|
+
}
|
|
156
160
|
var receivers = this.messageReceiverMap[type];
|
|
157
161
|
if (!receivers) {
|
|
158
162
|
receivers = [];
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","names":["buildPayloadForPromise","errorToPlain","getTargetWindow","plainToError","Messenger","_this","_classCallCheck","_defineProperty","thisWindow","addEventListener","e","_e$data","data","type","payload","_this$getReceivers","getReceivers","_this$getReceivers2","_slicedToArray","receivers","receiversOnce","forEach","v","fn","removeReceiver","_createClass","key","value","emit","_options$targetOrigin","options","arguments","length","undefined","theWindow","targetWindow","postMessage","targetOrigin","location","origin","emitPromise","_this2","payloadForPromise","Promise","resolve","reject","once","_dismiss_","payloadBack","Error","error","on","addReceiver","onPromise","_this3","then","err","_receiversForType$red","receiversForType","messageReceiverMap","receiversTuple","reduce","result","push","_this4","receiver","index","indexOf","splice","default"],"sources":["../../../src/messenger/index.ts"],"sourcesContent":["import {\n TFnOff,\n IMessageData,\n TMessengerCallback,\n TMessengerReceiverMap,\n IMessengerEmitOptions,\n IMessengerPayloadPromise,\n IMessengerPayloadPromiseBack,\n IMessengerReceiver\n} from '../types';\nimport {\n buildPayloadForPromise,\n errorToPlain,\n getTargetWindow,\n plainToError\n} from '../util';\n\n/**\n * 封装 `postMessage`,全局只有一个监听事件\n */\nexport default class Messenger {\n private messageReceiverMap: TMessengerReceiverMap = {};\n \n constructor() {\n const thisWindow = getTargetWindow();\n \n thisWindow.addEventListener('message', (e: MessageEvent<IMessageData>): void => {\n const {\n data: {\n type,\n payload\n }\n } = e;\n const [receivers, receiversOnce] = this.getReceivers(type);\n \n receivers.forEach(v => v.fn(payload));\n receiversOnce.forEach(v => v.fn(payload));\n \n receiversOnce.forEach(v => this.removeReceiver(type, v));\n });\n }\n \n /**\n * 广播消息,当传入的对象 payload 不是 plain 对象的时候(如 Error、function、DOMElement、JSX 等),这里会报错\n * 「Uncaught DOMException: The object could not be cloned.」或 「DataCloneError: The object could not be cloned.」\n * 这个错误不能吃掉,因为使用者需要同步地知道调用失败了\n */\n emit(type: string): void;\n emit(type: string, payload: undefined, options: IMessengerEmitOptions): void;\n emit<P = unknown>(type: string, payload: P, options?: IMessengerEmitOptions): void; // eslint-disable-line @typescript-eslint/no-unnecessary-type-parameters\n emit(type: string, payload?: unknown, options: IMessengerEmitOptions = {}): void {\n const theWindow = getTargetWindow(options.targetWindow);\n \n theWindow.postMessage({\n type,\n payload\n }, options.targetOrigin ?? theWindow.location.origin);\n }\n \n /**\n * 广播事件,返回 Promise,必须要有 `onPromise` 来承接该事件,否则此 `Promise` 将永远无法结束\n */\n emitPromise<T = void>(type: string): Promise<T>;\n emitPromise<T = void>(type: string, payload: undefined, options: IMessengerEmitOptions): Promise<T>;\n emitPromise<T = void, P = unknown>(type: string, payload: P, options?: IMessengerEmitOptions): Promise<T>; // eslint-disable-line @typescript-eslint/no-unnecessary-type-parameters\n emitPromise<T = void, P = unknown>(type: string, payload?: P, options?: IMessengerEmitOptions): Promise<T> {\n const payloadForPromise = buildPayloadForPromise<P | undefined>(type, payload);\n \n // 触发 `onPromise` 的回调,不要放到 `new Promise` 内部,因为它可能会报错,这个错需要保持是同步的\n this.emit<IMessengerPayloadPromise<P | undefined>>(type, payloadForPromise, options);\n \n return new Promise<T>((resolve, reject) => {\n // `onPromise` 的回调返回的是 `Promise`,它 `resolve` 或 `reject` 都会广播一个以 `_dismiss_` 为类型的 `message`,\n // 这里使用单次订阅是因为这个 `message` 只需要消费一次。\n this.once<IMessengerPayloadPromiseBack<T>>(payloadForPromise._dismiss_, (payloadBack?: IMessengerPayloadPromiseBack<T>): void => {\n if (!payloadBack) { // 一般来说不可能没有 payloadBack,但代码需要严谨\n reject(new Error('Messenger:emitPromise MessengerPayloadPromiseBack is missing.'));\n \n return;\n }\n \n const {\n value,\n error\n } = payloadBack;\n \n if (error) {\n reject(plainToError(error));\n } else {\n resolve(value as T);\n }\n });\n });\n }\n \n /**\n * 注册回调,返回用于注销的方法\n */\n on(type: string, fn: () => void): TFnOff;\n on<P = unknown>(type: string, fn: (payload: P) => void): TFnOff; // eslint-disable-line @typescript-eslint/no-unnecessary-type-parameters\n on(type: string, fn: (payload: unknown) => void): TFnOff {\n return this.addReceiver(type, fn);\n }\n \n /**\n * 注册单次回调,运行一次后将自动注销\n */\n once(type: string, fn: () => void): TFnOff;\n once<P = unknown>(type: string, fn: (payload: P) => void): TFnOff; // eslint-disable-line @typescript-eslint/no-unnecessary-type-parameters\n once<P = unknown>(type: string, fn: (payload: P) => void): TFnOff {\n return this.addReceiver(type, fn, true);\n }\n \n /**\n * 对 emitPromise 对应的 type 进行响应,这里关心的 payload 还是 emitPromise 所传入的 payload\n */\n onPromise<T = void>(type: string, fn: () => T | Promise<T>): TFnOff;\n onPromise<T, P = unknown>(type: string, fn: (payload: P) => T | Promise<T>): TFnOff; // eslint-disable-line @typescript-eslint/no-unnecessary-type-parameters\n onPromise<T, P = unknown>(type: string, fn: (payload: P) => T | Promise<T>): TFnOff {\n return this.on(type, (payload?: IMessengerPayloadPromise<P>) => {\n if (!payload?._dismiss_) { // 得到的 payload 下有 _dismiss_ 参数才响应,否则 pass\n return;\n }\n \n // 这里广播是事件会被 `emitPromise` 方法内部的 once 消化\n Promise.resolve(fn(payload.payload)).then((value: T) => {\n this.emit<IMessengerPayloadPromiseBack<T>>(payload._dismiss_, {\n value\n });\n }, (err: unknown) => {\n this.emit<IMessengerPayloadPromiseBack<T>>(payload._dismiss_, {\n error: errorToPlain(err)\n });\n });\n });\n }\n \n private getReceivers(type: string): [IMessengerReceiver[], IMessengerReceiver[]] {\n const receiversForType = this.messageReceiverMap[type];\n const receiversTuple: [IMessengerReceiver[], IMessengerReceiver[]] = [[], []];\n \n return receiversForType?.reduce((result: [IMessengerReceiver[], IMessengerReceiver[]], v) => {\n if (v.once) {\n result[1].push(v);\n } else {\n result[0].push(v);\n }\n \n return result;\n }, receiversTuple) ?? receiversTuple;\n }\n \n private addReceiver<P>(type: string, fn: TMessengerCallback<P>, once?: boolean): TFnOff {\n let receivers = this.messageReceiverMap[type];\n \n if (!receivers) {\n receivers = [];\n this.messageReceiverMap[type] = receivers;\n }\n \n const receiver: IMessengerReceiver = {\n fn,\n once\n };\n \n receivers.push(receiver);\n \n return () => this.removeReceiver(type, receiver);\n }\n \n private removeReceiver(type: string, receiver: IMessengerReceiver): void {\n const receivers = this.messageReceiverMap[type];\n \n if (!receivers) {\n return;\n }\n \n const index = receivers.indexOf(receiver);\n \n if (index >= 0) {\n receivers.splice(index, 1);\n }\n \n if (!receivers.length) {\n delete this.messageReceiverMap[type]; // eslint-disable-line @typescript-eslint/no-dynamic-delete\n }\n };\n}\n"],"mappings":"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","ignoreList":[]}
|
|
1
|
+
{"version":3,"file":"index.js","names":["buildPayloadForPromise","errorToPlain","getTargetWindow","plainToError","Messenger","_this","_classCallCheck","_defineProperty","thisWindow","addEventListener","e","_e$data","data","type","_e$data2","payload","_this$getReceivers","getReceivers","_this$getReceivers2","_slicedToArray","receivers","receiversOnce","forEach","v","fn","removeReceiver","_createClass","key","value","emit","_options$targetOrigin","options","arguments","length","undefined","theWindow","targetWindow","postMessage","targetOrigin","location","origin","emitPromise","_this2","payloadForPromise","Promise","resolve","reject","once","_dismiss_","payloadBack","Error","error","on","addReceiver","onPromise","_this3","then","err","_receiversForType$red","receiversForType","messageReceiverMap","receiversTuple","reduce","result","push","_this4","receiver","index","indexOf","splice","default"],"sources":["../../../src/messenger/index.ts"],"sourcesContent":["import {\n TMessengerOff,\n IMessageData,\n TMessengerCallback,\n TMessengerReceiverMap,\n IMessengerEmitOptions,\n IMessengerPayloadPromise,\n IMessengerPayloadPromiseBack,\n IMessengerReceiver\n} from '../types';\nimport {\n buildPayloadForPromise,\n errorToPlain,\n getTargetWindow,\n plainToError\n} from '../util';\n\n/**\n * 封装 `postMessage`,全局只有一个监听事件\n */\nexport default class Messenger {\n private messageReceiverMap: TMessengerReceiverMap = {};\n \n constructor() {\n const thisWindow = getTargetWindow();\n \n thisWindow.addEventListener('message', (e: MessageEvent<IMessageData | undefined>): void => {\n if (!e.data?.type) {\n return;\n }\n \n const {\n type,\n payload\n } = e.data;\n const [receivers, receiversOnce] = this.getReceivers(type);\n \n receivers.forEach(v => v.fn(payload));\n receiversOnce.forEach(v => v.fn(payload));\n \n receiversOnce.forEach(v => this.removeReceiver(type, v));\n });\n }\n \n /**\n * 广播消息,当传入的对象 payload 不是 plain 对象的时候(如 Error、function、DOMElement、JSX 等),这里会报错\n * 「Uncaught DOMException: The object could not be cloned.」或 「DataCloneError: The object could not be cloned.」\n * 这个错误不能吃掉,因为使用者需要同步地知道调用失败了\n */\n emit(type: string): void;\n emit(type: string, payload: undefined, options: IMessengerEmitOptions): void;\n emit<P = unknown>(type: string, payload: P, options?: IMessengerEmitOptions): void; // eslint-disable-line @typescript-eslint/no-unnecessary-type-parameters\n emit(type: string, payload?: unknown, options: IMessengerEmitOptions = {}): void {\n const theWindow = getTargetWindow(options.targetWindow);\n \n theWindow.postMessage({\n type,\n payload\n }, options.targetOrigin ?? theWindow.location.origin);\n }\n \n /**\n * 广播事件,返回 Promise,必须要有 `onPromise` 来承接该事件,否则此 `Promise` 将永远无法结束\n */\n emitPromise<T = void>(type: string): Promise<T>;\n emitPromise<T = void>(type: string, payload: undefined, options: IMessengerEmitOptions): Promise<T>;\n emitPromise<T = void, P = unknown>(type: string, payload: P, options?: IMessengerEmitOptions): Promise<T>; // eslint-disable-line @typescript-eslint/no-unnecessary-type-parameters\n emitPromise<T = void, P = unknown>(type: string, payload?: P, options?: IMessengerEmitOptions): Promise<T> {\n const payloadForPromise = buildPayloadForPromise<P | undefined>(type, payload);\n \n // 触发 `onPromise` 的回调,不要放到 `new Promise` 内部,因为它可能会报错,这个错需要保持是同步的\n this.emit<IMessengerPayloadPromise<P | undefined>>(type, payloadForPromise, options);\n \n return new Promise<T>((resolve, reject) => {\n // `onPromise` 的回调返回的是 `Promise`,它 `resolve` 或 `reject` 都会广播一个以 `_dismiss_` 为类型的 `message`,\n // 这里使用单次订阅是因为这个 `message` 只需要消费一次。\n this.once<IMessengerPayloadPromiseBack<T>>(payloadForPromise._dismiss_, (payloadBack?: IMessengerPayloadPromiseBack<T>): void => {\n if (!payloadBack) { // 一般来说不可能没有 payloadBack,但代码需要严谨\n reject(new Error('Messenger:emitPromise MessengerPayloadPromiseBack is missing.'));\n \n return;\n }\n \n const {\n value,\n error\n } = payloadBack;\n \n if (error) {\n reject(plainToError(error));\n } else {\n resolve(value as T);\n }\n });\n });\n }\n \n /**\n * 注册回调,返回用于注销的方法\n */\n on<P = unknown>(type: string, fn: (payload?: P) => void): TMessengerOff { // eslint-disable-line @typescript-eslint/no-unnecessary-type-parameters\n return this.addReceiver(type, fn);\n }\n \n /**\n * 注册单次回调,运行一次后将自动注销\n */\n once<P = unknown>(type: string, fn: (payload?: P) => void): TMessengerOff { // eslint-disable-line @typescript-eslint/no-unnecessary-type-parameters\n return this.addReceiver(type, fn, true);\n }\n \n /**\n * 对 emitPromise 对应的 type 进行响应,这里关心的 payload 还是 emitPromise 所传入的 payload\n */\n onPromise<T, P = unknown>(type: string, fn: (payload?: P) => T | Promise<T>): TMessengerOff { // eslint-disable-line @typescript-eslint/no-unnecessary-type-parameters\n return this.on(type, (payload?: IMessengerPayloadPromise<P>) => {\n if (!payload?._dismiss_) { // 得到的 payload 下有 _dismiss_ 参数才响应,否则 pass\n return;\n }\n \n // 这里广播是事件会被 `emitPromise` 方法内部的 once 消化\n Promise.resolve(fn(payload.payload)).then((value: T) => {\n this.emit<IMessengerPayloadPromiseBack<T>>(payload._dismiss_, {\n value\n });\n }, (err: unknown) => {\n this.emit<IMessengerPayloadPromiseBack<T>>(payload._dismiss_, {\n error: errorToPlain(err)\n });\n });\n });\n }\n \n private getReceivers(type: string): [IMessengerReceiver[], IMessengerReceiver[]] {\n const receiversForType = this.messageReceiverMap[type];\n const receiversTuple: [IMessengerReceiver[], IMessengerReceiver[]] = [[], []];\n \n return receiversForType?.reduce((result: [IMessengerReceiver[], IMessengerReceiver[]], v) => {\n if (v.once) {\n result[1].push(v);\n } else {\n result[0].push(v);\n }\n \n return result;\n }, receiversTuple) ?? receiversTuple;\n }\n \n private addReceiver(type: string, fn: unknown, once?: boolean): TMessengerOff {\n if (typeof fn !== 'function') {\n throw new Error('Messenger:addReceiver: fn is not a function');\n }\n \n let receivers = this.messageReceiverMap[type];\n \n if (!receivers) {\n receivers = [];\n this.messageReceiverMap[type] = receivers;\n }\n \n const receiver: IMessengerReceiver = {\n fn: fn as TMessengerCallback,\n once\n };\n \n receivers.push(receiver);\n \n return () => this.removeReceiver(type, receiver);\n }\n \n private removeReceiver(type: string, receiver: IMessengerReceiver): void {\n const receivers = this.messageReceiverMap[type];\n \n if (!receivers) {\n return;\n }\n \n const index = receivers.indexOf(receiver);\n \n if (index >= 0) {\n receivers.splice(index, 1);\n }\n \n if (!receivers.length) {\n delete this.messageReceiverMap[type]; // eslint-disable-line @typescript-eslint/no-dynamic-delete\n }\n };\n}\n"],"mappings":"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","ignoreList":[]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","names":[],"sources":["../../../src/types/index.ts"],"sourcesContent":["export type TTargetWindow = Window | 'top' | 'parent';\n\nexport interface IMessageData {\n type: string;\n payload: never;\n}\n\nexport interface IMessengerEmitOptions {\n targetWindow?: TTargetWindow;\n targetOrigin?: string;\n}\n\nexport type TMessengerCallback<P = unknown> = (payload
|
|
1
|
+
{"version":3,"file":"index.js","names":[],"sources":["../../../src/types/index.ts"],"sourcesContent":["export type TTargetWindow = Window | 'top' | 'parent';\n\nexport interface IMessageData {\n type: string;\n payload: never;\n}\n\nexport interface IMessengerEmitOptions {\n targetWindow?: TTargetWindow;\n targetOrigin?: string;\n}\n\nexport type TMessengerCallback<P = unknown> = (payload?: P) => void;\n\nexport interface IMessengerReceiver<P = never> {\n fn: TMessengerCallback<P>;\n once?: boolean;\n // priority?: number; // 优先级,越大越优先\n}\n\n/**\n * 为每个 MessageEvent.data 的 `type`,建立一个接收序列\n */\nexport type TMessengerReceiverMap = Record<string, IMessengerReceiver[]>;\n\n/**\n * 以 Promise 的形式广播事件的时候的 payload 包裹\n */\nexport interface IMessengerPayloadPromise<P = void> {\n _dismiss_: string; // onPromise 中会将此包裹打开,如果里边有该值,表明此事件合法,否则不会响应\n payload: P; // 原 payload\n}\n\n/**\n * `emitPromise` 和 `onPromise` 的纽带\n */\nexport interface IMessengerPayloadPromiseBack<T> {\n value?: T;\n error?: Record<string, unknown>; // 可能是 string、对象或 Error\n}\n\nexport type TMessengerOff = () => void;\n"],"mappings":"","ignoreList":[]}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { TMessengerOff, IMessengerEmitOptions } from '../types';
|
|
2
2
|
/**
|
|
3
3
|
* 封装 `postMessage`,全局只有一个监听事件
|
|
4
4
|
*/
|
|
@@ -22,18 +22,15 @@ export default class Messenger {
|
|
|
22
22
|
/**
|
|
23
23
|
* 注册回调,返回用于注销的方法
|
|
24
24
|
*/
|
|
25
|
-
on(type: string, fn: () => void):
|
|
26
|
-
on<P = unknown>(type: string, fn: (payload: P) => void): TFnOff;
|
|
25
|
+
on<P = unknown>(type: string, fn: (payload?: P) => void): TMessengerOff;
|
|
27
26
|
/**
|
|
28
27
|
* 注册单次回调,运行一次后将自动注销
|
|
29
28
|
*/
|
|
30
|
-
once(type: string, fn: () => void):
|
|
31
|
-
once<P = unknown>(type: string, fn: (payload: P) => void): TFnOff;
|
|
29
|
+
once<P = unknown>(type: string, fn: (payload?: P) => void): TMessengerOff;
|
|
32
30
|
/**
|
|
33
31
|
* 对 emitPromise 对应的 type 进行响应,这里关心的 payload 还是 emitPromise 所传入的 payload
|
|
34
32
|
*/
|
|
35
|
-
onPromise<T =
|
|
36
|
-
onPromise<T, P = unknown>(type: string, fn: (payload: P) => T | Promise<T>): TFnOff;
|
|
33
|
+
onPromise<T, P = unknown>(type: string, fn: (payload?: P) => T | Promise<T>): TMessengerOff;
|
|
37
34
|
private getReceivers;
|
|
38
35
|
private addReceiver;
|
|
39
36
|
private removeReceiver;
|
|
@@ -7,7 +7,7 @@ export interface IMessengerEmitOptions {
|
|
|
7
7
|
targetWindow?: TTargetWindow;
|
|
8
8
|
targetOrigin?: string;
|
|
9
9
|
}
|
|
10
|
-
export type TMessengerCallback<P = unknown> = (payload
|
|
10
|
+
export type TMessengerCallback<P = unknown> = (payload?: P) => void;
|
|
11
11
|
export interface IMessengerReceiver<P = never> {
|
|
12
12
|
fn: TMessengerCallback<P>;
|
|
13
13
|
once?: boolean;
|
|
@@ -30,4 +30,4 @@ export interface IMessengerPayloadPromiseBack<T> {
|
|
|
30
30
|
value?: T;
|
|
31
31
|
error?: Record<string, unknown>;
|
|
32
32
|
}
|
|
33
|
-
export type
|
|
33
|
+
export type TMessengerOff = () => void;
|