@octostar/platform-api 0.5.17 → 0.5.18
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/dist/lib/ContextAPI.d.ts
CHANGED
|
@@ -1,32 +1,27 @@
|
|
|
1
1
|
import { Context, ContextAPISetParams, ContextListener } from '@octostar/platform-types';
|
|
2
|
-
export type ContextAPIConstructorParams<ContextData extends Record<string, any>> = {
|
|
3
|
-
contextData?: ContextData;
|
|
4
|
-
targetWindow?: Window;
|
|
5
|
-
channelId?: string;
|
|
6
|
-
};
|
|
7
2
|
export declare class ContextAPI<ContextData extends Record<string, any>> implements Context<ContextData> {
|
|
8
|
-
private contextData
|
|
9
|
-
private internalTargetWindow;
|
|
10
|
-
readonly id: string;
|
|
3
|
+
private contextData;
|
|
11
4
|
private listeners;
|
|
12
5
|
private postRobotListener;
|
|
13
|
-
private
|
|
14
|
-
private
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
getContext(): ContextData | undefined;
|
|
6
|
+
private type;
|
|
7
|
+
private channelId;
|
|
8
|
+
private iframeChannelAttr;
|
|
9
|
+
constructor(contextData: ContextData);
|
|
10
|
+
private getTargetWindow;
|
|
11
|
+
private setContextAndNotify;
|
|
12
|
+
private getPostRobotEventName;
|
|
13
|
+
private connect;
|
|
14
|
+
private sendContextUpdate;
|
|
15
|
+
getContext(): ContextData;
|
|
24
16
|
setContext(context: ContextAPISetParams<ContextData>): void;
|
|
25
|
-
notifyListeners(): void;
|
|
26
|
-
syncContextToChannel(type?: 'update-context' | 'get-context'): Promise<void>;
|
|
27
17
|
subscribeToChanges(contextListener: ContextListener<ContextData>): string;
|
|
28
18
|
subscribeToChanges(id: string, contextListener: ContextListener<ContextData>): string;
|
|
29
19
|
unsubscribeFromChanges(id: string): void;
|
|
20
|
+
connectToIframe(): {
|
|
21
|
+
channelId: string;
|
|
22
|
+
onIframeLoad: React.ReactEventHandler<HTMLIFrameElement>;
|
|
23
|
+
};
|
|
24
|
+
connectToParent(): void;
|
|
30
25
|
destroy(): void;
|
|
31
26
|
}
|
|
32
27
|
//# sourceMappingURL=ContextAPI.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ContextAPI.d.ts","sourceRoot":"","sources":["../../src/lib/ContextAPI.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,OAAO,EACP,mBAAmB,EACnB,eAAe,EAChB,MAAM,0BAA0B,CAAC;
|
|
1
|
+
{"version":3,"file":"ContextAPI.d.ts","sourceRoot":"","sources":["../../src/lib/ContextAPI.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,OAAO,EACP,mBAAmB,EACnB,eAAe,EAChB,MAAM,0BAA0B,CAAC;AAMlC,qBAAa,UAAU,CAAC,WAAW,SAAS,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAE,YAAW,OAAO,CAAC,WAAW,CAAC;IAE9F,OAAO,CAAC,WAAW,CAAc;IACjC,OAAO,CAAC,SAAS,CAAoD;IACrE,OAAO,CAAC,iBAAiB,CAAgD;IACzE,OAAO,CAAC,IAAI,CAAsB;IAClC,OAAO,CAAC,SAAS,CAAS;IAC1B,OAAO,CAAC,iBAAiB,CAAkC;gBAE/C,WAAW,EAAE,WAAW;IAOpC,OAAO,CAAC,eAAe;IAOvB,OAAO,CAAC,mBAAmB;IAS3B,OAAO,CAAC,qBAAqB;IAI7B,OAAO,CAAC,OAAO;IAkBf,OAAO,CAAC,iBAAiB;IAYzB,UAAU;IAIV,UAAU,CAAC,OAAO,EAAE,mBAAmB,CAAC,WAAW,CAAC;IAKpD,kBAAkB,CAAC,eAAe,EAAE,eAAe,CAAC,WAAW,CAAC,GAAG,MAAM;IAEzE,kBAAkB,CAChB,EAAE,EAAE,MAAM,EACV,eAAe,EAAE,eAAe,CAAC,WAAW,CAAC,GAC5C,MAAM;IAsBT,sBAAsB,CAAC,EAAE,EAAE,MAAM;IAIjC,eAAe,IAAI;QAAE,SAAS,EAAE,MAAM,CAAC;QAAC,YAAY,EAAE,KAAK,CAAC,iBAAiB,CAAC,iBAAiB,CAAC,CAAA;KAAE;IAalG,eAAe;IAQf,OAAO;CAGR"}
|
package/dist/lib/ContextAPI.js
CHANGED
|
@@ -1,75 +1,69 @@
|
|
|
1
1
|
import { v4 as uuidv4 } from 'uuid';
|
|
2
2
|
import * as postRobot from 'post-robot';
|
|
3
|
+
const CONTEXT_UPDATE_EVENT = 'context-update';
|
|
3
4
|
export class ContextAPI {
|
|
4
|
-
constructor(
|
|
5
|
-
this.contextData = contextData;
|
|
5
|
+
constructor(contextData) {
|
|
6
6
|
this.listeners = {};
|
|
7
|
-
this.
|
|
8
|
-
this.
|
|
9
|
-
|
|
7
|
+
this.iframeChannelAttr = 'data-octostar-iframe-channel';
|
|
8
|
+
this.contextData = contextData;
|
|
9
|
+
const iframeChannelId = window.frameElement?.getAttribute(this.iframeChannelAttr);
|
|
10
|
+
this.channelId = iframeChannelId || uuidv4();
|
|
11
|
+
this.type = iframeChannelId ? 'iframe' : 'parent';
|
|
10
12
|
}
|
|
11
|
-
|
|
12
|
-
|
|
13
|
+
getTargetWindow() {
|
|
14
|
+
if (this.type === 'iframe') {
|
|
15
|
+
return window.top;
|
|
16
|
+
}
|
|
17
|
+
return document.querySelector(`iframe[${this.iframeChannelAttr}='${this.channelId}']`)?.contentWindow || undefined;
|
|
13
18
|
}
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
19
|
+
setContextAndNotify(context) {
|
|
20
|
+
if (typeof context === 'function') {
|
|
21
|
+
this.contextData = context(this.contextData);
|
|
22
|
+
}
|
|
23
|
+
else {
|
|
24
|
+
this.contextData = context;
|
|
25
|
+
}
|
|
26
|
+
Object.values(this.listeners).forEach(listener => listener(this.contextData));
|
|
17
27
|
}
|
|
18
|
-
|
|
19
|
-
return
|
|
28
|
+
getPostRobotEventName(channelId) {
|
|
29
|
+
return `${channelId}-${CONTEXT_UPDATE_EVENT}`;
|
|
20
30
|
}
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
if (
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
this.syncContextToChannel('get-context');
|
|
31
|
+
connect(channelId) {
|
|
32
|
+
const targetWindow = this.getTargetWindow();
|
|
33
|
+
if (!targetWindow) {
|
|
34
|
+
const error = new Error('Target window not found');
|
|
35
|
+
throw error;
|
|
27
36
|
}
|
|
37
|
+
const postRobotEventName = this.getPostRobotEventName(channelId);
|
|
38
|
+
this.postRobotListener = (postRobot.on(postRobotEventName, { window: targetWindow }, (event) => {
|
|
39
|
+
if (event.data.type === 'init') {
|
|
40
|
+
this.setContext((context) => ({ ...context, ...event.data.context }));
|
|
41
|
+
}
|
|
42
|
+
else {
|
|
43
|
+
this.setContextAndNotify((context) => ({ ...context, ...event.data.context }));
|
|
44
|
+
}
|
|
45
|
+
return Promise.resolve();
|
|
46
|
+
}));
|
|
47
|
+
this.sendContextUpdate(true);
|
|
28
48
|
}
|
|
29
|
-
|
|
30
|
-
|
|
49
|
+
sendContextUpdate(isInit = false) {
|
|
50
|
+
const targetWindow = this.getTargetWindow();
|
|
51
|
+
if (!targetWindow) {
|
|
31
52
|
return;
|
|
32
53
|
}
|
|
33
|
-
|
|
34
|
-
this.
|
|
54
|
+
try {
|
|
55
|
+
postRobot.send(targetWindow, this.getPostRobotEventName(this.channelId), { context: this.contextData, ...(isInit && { type: 'init' }) });
|
|
56
|
+
}
|
|
57
|
+
catch (error) {
|
|
58
|
+
// do nothing
|
|
35
59
|
}
|
|
36
|
-
this.postRobotListener = postRobot.on(this.postRobotEventId, event => {
|
|
37
|
-
if (event.data.from !== this.id) {
|
|
38
|
-
this.contextData = { ...this.contextData, ...event.data.contextData };
|
|
39
|
-
this.notifyListeners();
|
|
40
|
-
}
|
|
41
|
-
return Promise.resolve();
|
|
42
|
-
});
|
|
43
|
-
}
|
|
44
|
-
get context() {
|
|
45
|
-
return this.contextData;
|
|
46
|
-
}
|
|
47
|
-
set context(context) {
|
|
48
|
-
this.contextData = context;
|
|
49
|
-
this.notifyListeners();
|
|
50
|
-
this.syncContextToChannel();
|
|
51
60
|
}
|
|
52
61
|
getContext() {
|
|
53
|
-
return this.
|
|
62
|
+
return this.contextData;
|
|
54
63
|
}
|
|
55
64
|
setContext(context) {
|
|
56
|
-
this.context
|
|
57
|
-
|
|
58
|
-
}
|
|
59
|
-
notifyListeners() {
|
|
60
|
-
Object.values(this.listeners).forEach(listener => listener(this.context));
|
|
61
|
-
}
|
|
62
|
-
async syncContextToChannel(type = 'update-context') {
|
|
63
|
-
if (!this.targetWindow || !this.postRobotEventId) {
|
|
64
|
-
return;
|
|
65
|
-
}
|
|
66
|
-
/** Try to exclude functions in the context */
|
|
67
|
-
// const context = classInstanceToObject(this.context);
|
|
68
|
-
await postRobot.send(this.targetWindow, this.postRobotEventId, {
|
|
69
|
-
from: this.id,
|
|
70
|
-
type,
|
|
71
|
-
context: this.context,
|
|
72
|
-
});
|
|
65
|
+
this.setContextAndNotify(context);
|
|
66
|
+
this.sendContextUpdate();
|
|
73
67
|
}
|
|
74
68
|
subscribeToChanges(idOrContextListener, contextListenerOrNothing) {
|
|
75
69
|
const id = typeof idOrContextListener === 'string' ? idOrContextListener : uuidv4();
|
|
@@ -77,7 +71,8 @@ export class ContextAPI {
|
|
|
77
71
|
? idOrContextListener
|
|
78
72
|
: contextListenerOrNothing;
|
|
79
73
|
if (!contextListener) {
|
|
80
|
-
|
|
74
|
+
const error = new Error('Context listener is required');
|
|
75
|
+
throw error;
|
|
81
76
|
}
|
|
82
77
|
this.listeners[id] = contextListener;
|
|
83
78
|
return id;
|
|
@@ -85,6 +80,23 @@ export class ContextAPI {
|
|
|
85
80
|
unsubscribeFromChanges(id) {
|
|
86
81
|
delete this.listeners[id];
|
|
87
82
|
}
|
|
83
|
+
connectToIframe() {
|
|
84
|
+
if (this.type !== 'parent') {
|
|
85
|
+
const error = new Error('ContextAPI is not a parent');
|
|
86
|
+
throw error;
|
|
87
|
+
}
|
|
88
|
+
const onIframeLoad = () => {
|
|
89
|
+
this.connect(this.channelId);
|
|
90
|
+
};
|
|
91
|
+
return { channelId: this.channelId, onIframeLoad };
|
|
92
|
+
}
|
|
93
|
+
connectToParent() {
|
|
94
|
+
if (this.type !== 'iframe') {
|
|
95
|
+
const error = new Error('ContextAPI is not an iframe');
|
|
96
|
+
throw error;
|
|
97
|
+
}
|
|
98
|
+
this.connect(this.channelId);
|
|
99
|
+
}
|
|
88
100
|
destroy() {
|
|
89
101
|
this.postRobotListener?.cancel();
|
|
90
102
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ContextAPI.js","sourceRoot":"","sources":["../../src/lib/ContextAPI.ts"],"names":[],"mappings":"AAKA,OAAO,EAAE,EAAE,IAAI,MAAM,EAAE,MAAM,MAAM,CAAC;AACpC,OAAO,KAAK,SAAS,MAAM,YAAY,CAAC;
|
|
1
|
+
{"version":3,"file":"ContextAPI.js","sourceRoot":"","sources":["../../src/lib/ContextAPI.ts"],"names":[],"mappings":"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"}
|
|
@@ -7081,9 +7081,6 @@ var _uuid = require("uuid");
|
|
|
7081
7081
|
var postRobot = _interopRequireWildcard(require("post-robot"));
|
|
7082
7082
|
function _interopRequireWildcard(e, t) { if ("function" == typeof WeakMap) var r = new WeakMap(), n = new WeakMap(); return (_interopRequireWildcard = function _interopRequireWildcard(e, t) { if (!t && e && e.__esModule) return e; var o, i, f = { __proto__: null, "default": e }; if (null === e || "object" != _typeof(e) && "function" != typeof e) return f; if (o = t ? n : r) { if (o.has(e)) return o.get(e); o.set(e, f); } for (var _t in e) "default" !== _t && {}.hasOwnProperty.call(e, _t) && ((i = (o = Object.defineProperty) && Object.getOwnPropertyDescriptor(e, _t)) && (i.get || i.set) ? o(f, _t, i) : f[_t] = e[_t]); return f; })(e, t); }
|
|
7083
7083
|
function _typeof(o) { "@babel/helpers - typeof"; return _typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (o) { return typeof o; } : function (o) { return o && "function" == typeof Symbol && o.constructor === Symbol && o !== Symbol.prototype ? "symbol" : typeof o; }, _typeof(o); }
|
|
7084
|
-
function _regeneratorRuntime() { "use strict"; /*! regenerator-runtime -- Copyright (c) 2014-present, Facebook, Inc. -- license (MIT): https://github.com/babel/babel/blob/main/packages/babel-helpers/LICENSE */ _regeneratorRuntime = function _regeneratorRuntime() { return r; }; var t, r = {}, e = Object.prototype, n = e.hasOwnProperty, o = "function" == typeof Symbol ? Symbol : {}, i = o.iterator || "@@iterator", a = o.asyncIterator || "@@asyncIterator", u = o.toStringTag || "@@toStringTag"; function c(t, r, e, n) { return Object.defineProperty(t, r, { value: e, enumerable: !n, configurable: !n, writable: !n }); } try { c({}, ""); } catch (t) { c = function c(t, r, e) { return t[r] = e; }; } function h(r, e, n, o) { var i = e && e.prototype instanceof Generator ? e : Generator, a = Object.create(i.prototype); return c(a, "_invoke", function (r, e, n) { var o = 1; return function (i, a) { if (3 === o) throw Error("Generator is already running"); if (4 === o) { if ("throw" === i) throw a; return { value: t, done: !0 }; } for (n.method = i, n.arg = a;;) { var u = n.delegate; if (u) { var c = d(u, n); if (c) { if (c === f) continue; return c; } } if ("next" === n.method) n.sent = n._sent = n.arg;else if ("throw" === n.method) { if (1 === o) throw o = 4, n.arg; n.dispatchException(n.arg); } else "return" === n.method && n.abrupt("return", n.arg); o = 3; var h = s(r, e, n); if ("normal" === h.type) { if (o = n.done ? 4 : 2, h.arg === f) continue; return { value: h.arg, done: n.done }; } "throw" === h.type && (o = 4, n.method = "throw", n.arg = h.arg); } }; }(r, n, new Context(o || [])), !0), a; } function s(t, r, e) { try { return { type: "normal", arg: t.call(r, e) }; } catch (t) { return { type: "throw", arg: t }; } } r.wrap = h; var f = {}; function Generator() {} function GeneratorFunction() {} function GeneratorFunctionPrototype() {} var l = {}; c(l, i, function () { return this; }); var p = Object.getPrototypeOf, y = p && p(p(x([]))); y && y !== e && n.call(y, i) && (l = y); var v = GeneratorFunctionPrototype.prototype = Generator.prototype = Object.create(l); function g(t) { ["next", "throw", "return"].forEach(function (r) { c(t, r, function (t) { return this._invoke(r, t); }); }); } function AsyncIterator(t, r) { function e(o, i, a, u) { var c = s(t[o], t, i); if ("throw" !== c.type) { var h = c.arg, f = h.value; return f && "object" == _typeof(f) && n.call(f, "__await") ? r.resolve(f.__await).then(function (t) { e("next", t, a, u); }, function (t) { e("throw", t, a, u); }) : r.resolve(f).then(function (t) { h.value = t, a(h); }, function (t) { return e("throw", t, a, u); }); } u(c.arg); } var o; c(this, "_invoke", function (t, n) { function i() { return new r(function (r, o) { e(t, n, r, o); }); } return o = o ? o.then(i, i) : i(); }, !0); } function d(r, e) { var n = e.method, o = r.i[n]; if (o === t) return e.delegate = null, "throw" === n && r.i["return"] && (e.method = "return", e.arg = t, d(r, e), "throw" === e.method) || "return" !== n && (e.method = "throw", e.arg = new TypeError("The iterator does not provide a '" + n + "' method")), f; var i = s(o, r.i, e.arg); if ("throw" === i.type) return e.method = "throw", e.arg = i.arg, e.delegate = null, f; var a = i.arg; return a ? a.done ? (e[r.r] = a.value, e.next = r.n, "return" !== e.method && (e.method = "next", e.arg = t), e.delegate = null, f) : a : (e.method = "throw", e.arg = new TypeError("iterator result is not an object"), e.delegate = null, f); } function w(t) { this.tryEntries.push(t); } function m(r) { var e = r[4] || {}; e.type = "normal", e.arg = t, r[4] = e; } function Context(t) { this.tryEntries = [[-1]], t.forEach(w, this), this.reset(!0); } function x(r) { if (null != r) { var e = r[i]; if (e) return e.call(r); if ("function" == typeof r.next) return r; if (!isNaN(r.length)) { var o = -1, a = function e() { for (; ++o < r.length;) if (n.call(r, o)) return e.value = r[o], e.done = !1, e; return e.value = t, e.done = !0, e; }; return a.next = a; } } throw new TypeError(_typeof(r) + " is not iterable"); } return GeneratorFunction.prototype = GeneratorFunctionPrototype, c(v, "constructor", GeneratorFunctionPrototype), c(GeneratorFunctionPrototype, "constructor", GeneratorFunction), GeneratorFunction.displayName = c(GeneratorFunctionPrototype, u, "GeneratorFunction"), r.isGeneratorFunction = function (t) { var r = "function" == typeof t && t.constructor; return !!r && (r === GeneratorFunction || "GeneratorFunction" === (r.displayName || r.name)); }, r.mark = function (t) { return Object.setPrototypeOf ? Object.setPrototypeOf(t, GeneratorFunctionPrototype) : (t.__proto__ = GeneratorFunctionPrototype, c(t, u, "GeneratorFunction")), t.prototype = Object.create(v), t; }, r.awrap = function (t) { return { __await: t }; }, g(AsyncIterator.prototype), c(AsyncIterator.prototype, a, function () { return this; }), r.AsyncIterator = AsyncIterator, r.async = function (t, e, n, o, i) { void 0 === i && (i = Promise); var a = new AsyncIterator(h(t, e, n, o), i); return r.isGeneratorFunction(e) ? a : a.next().then(function (t) { return t.done ? t.value : a.next(); }); }, g(v), c(v, u, "Generator"), c(v, i, function () { return this; }), c(v, "toString", function () { return "[object Generator]"; }), r.keys = function (t) { var r = Object(t), e = []; for (var n in r) e.unshift(n); return function t() { for (; e.length;) if ((n = e.pop()) in r) return t.value = n, t.done = !1, t; return t.done = !0, t; }; }, r.values = x, Context.prototype = { constructor: Context, reset: function reset(r) { if (this.prev = this.next = 0, this.sent = this._sent = t, this.done = !1, this.delegate = null, this.method = "next", this.arg = t, this.tryEntries.forEach(m), !r) for (var e in this) "t" === e.charAt(0) && n.call(this, e) && !isNaN(+e.slice(1)) && (this[e] = t); }, stop: function stop() { this.done = !0; var t = this.tryEntries[0][4]; if ("throw" === t.type) throw t.arg; return this.rval; }, dispatchException: function dispatchException(r) { if (this.done) throw r; var e = this; function n(t) { a.type = "throw", a.arg = r, e.next = t; } for (var o = e.tryEntries.length - 1; o >= 0; --o) { var i = this.tryEntries[o], a = i[4], u = this.prev, c = i[1], h = i[2]; if (-1 === i[0]) return n("end"), !1; if (!c && !h) throw Error("try statement without catch or finally"); if (null != i[0] && i[0] <= u) { if (u < c) return this.method = "next", this.arg = t, n(c), !0; if (u < h) return n(h), !1; } } }, abrupt: function abrupt(t, r) { for (var e = this.tryEntries.length - 1; e >= 0; --e) { var n = this.tryEntries[e]; if (n[0] > -1 && n[0] <= this.prev && this.prev < n[2]) { var o = n; break; } } o && ("break" === t || "continue" === t) && o[0] <= r && r <= o[2] && (o = null); var i = o ? o[4] : {}; return i.type = t, i.arg = r, o ? (this.method = "next", this.next = o[2], f) : this.complete(i); }, complete: function complete(t, r) { if ("throw" === t.type) throw t.arg; return "break" === t.type || "continue" === t.type ? this.next = t.arg : "return" === t.type ? (this.rval = this.arg = t.arg, this.method = "return", this.next = "end") : "normal" === t.type && r && (this.next = r), f; }, finish: function finish(t) { for (var r = this.tryEntries.length - 1; r >= 0; --r) { var e = this.tryEntries[r]; if (e[2] === t) return this.complete(e[4], e[3]), m(e), f; } }, "catch": function _catch(t) { for (var r = this.tryEntries.length - 1; r >= 0; --r) { var e = this.tryEntries[r]; if (e[0] === t) { var n = e[4]; if ("throw" === n.type) { var o = n.arg; m(e); } return o; } } throw Error("illegal catch attempt"); }, delegateYield: function delegateYield(r, e, n) { return this.delegate = { i: x(r), r: e, n: n }, "next" === this.method && (this.arg = t), f; } }, r; }
|
|
7085
|
-
function asyncGeneratorStep(n, t, e, r, o, a, c) { try { var i = n[a](c), u = i.value; } catch (n) { return void e(n); } i.done ? t(u) : Promise.resolve(u).then(r, o); }
|
|
7086
|
-
function _asyncToGenerator(n) { return function () { var t = this, e = arguments; return new Promise(function (r, o) { var a = n.apply(t, e); function _next(n) { asyncGeneratorStep(a, r, o, _next, _throw, "next", n); } function _throw(n) { asyncGeneratorStep(a, r, o, _next, _throw, "throw", n); } _next(void 0); }); }; }
|
|
7087
7084
|
function ownKeys(e, r) { var t = Object.keys(e); if (Object.getOwnPropertySymbols) { var o = Object.getOwnPropertySymbols(e); r && (o = o.filter(function (r) { return Object.getOwnPropertyDescriptor(e, r).enumerable; })), t.push.apply(t, o); } return t; }
|
|
7088
7085
|
function _objectSpread(e) { for (var r = 1; r < arguments.length; r++) { var t = null != arguments[r] ? arguments[r] : {}; r % 2 ? ownKeys(Object(t), !0).forEach(function (r) { _defineProperty(e, r, t[r]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : ownKeys(Object(t)).forEach(function (r) { Object.defineProperty(e, r, Object.getOwnPropertyDescriptor(t, r)); }); } return e; }
|
|
7089
7086
|
function _defineProperty(e, r, t) { return (r = _toPropertyKey(r)) in e ? Object.defineProperty(e, r, { value: t, enumerable: !0, configurable: !0, writable: !0 }) : e[r] = t, e; }
|
|
@@ -7092,126 +7089,108 @@ function _defineProperties(e, r) { for (var t = 0; t < r.length; t++) { var o =
|
|
|
7092
7089
|
function _createClass(e, r, t) { return r && _defineProperties(e.prototype, r), t && _defineProperties(e, t), Object.defineProperty(e, "prototype", { writable: !1 }), e; }
|
|
7093
7090
|
function _toPropertyKey(t) { var i = _toPrimitive(t, "string"); return "symbol" == _typeof(i) ? i : i + ""; }
|
|
7094
7091
|
function _toPrimitive(t, r) { if ("object" != _typeof(t) || !t) return t; var e = t[Symbol.toPrimitive]; if (void 0 !== e) { var i = e.call(t, r || "default"); if ("object" != _typeof(i)) return i; throw new TypeError("@@toPrimitive must return a primitive value."); } return ("string" === r ? String : Number)(t); }
|
|
7092
|
+
var CONTEXT_UPDATE_EVENT = 'context-update';
|
|
7095
7093
|
var ContextAPI = exports.ContextAPI = /*#__PURE__*/function () {
|
|
7096
|
-
function ContextAPI(
|
|
7097
|
-
var
|
|
7098
|
-
contextData = _ref.contextData,
|
|
7099
|
-
channelId = _ref.channelId;
|
|
7094
|
+
function ContextAPI(contextData) {
|
|
7095
|
+
var _window$frameElement;
|
|
7100
7096
|
_classCallCheck(this, ContextAPI);
|
|
7101
|
-
this.contextData = contextData;
|
|
7102
7097
|
this.listeners = {};
|
|
7103
|
-
this.
|
|
7104
|
-
this.
|
|
7105
|
-
|
|
7098
|
+
this.iframeChannelAttr = 'data-octostar-iframe-channel';
|
|
7099
|
+
this.contextData = contextData;
|
|
7100
|
+
var iframeChannelId = (_window$frameElement = window.frameElement) === null || _window$frameElement === void 0 ? void 0 : _window$frameElement.getAttribute(this.iframeChannelAttr);
|
|
7101
|
+
this.channelId = iframeChannelId || (0, _uuid.v4)();
|
|
7102
|
+
this.type = iframeChannelId ? 'iframe' : 'parent';
|
|
7106
7103
|
}
|
|
7107
7104
|
return _createClass(ContextAPI, [{
|
|
7108
|
-
key: "
|
|
7109
|
-
|
|
7110
|
-
|
|
7111
|
-
|
|
7112
|
-
|
|
7113
|
-
this.internalTargetWindow = targetWindow;
|
|
7114
|
-
this.syncContextToChannel('get-context');
|
|
7115
|
-
}
|
|
7116
|
-
}, {
|
|
7117
|
-
key: "channelId",
|
|
7118
|
-
get: function get() {
|
|
7119
|
-
return this.internalChannelId;
|
|
7120
|
-
},
|
|
7121
|
-
set: function set(channelId) {
|
|
7122
|
-
this.internalChannelId = channelId;
|
|
7123
|
-
if (channelId) {
|
|
7124
|
-
this.postRobotEventId = "context-api-update::".concat(channelId);
|
|
7125
|
-
this.listenToPostRobot();
|
|
7126
|
-
this.syncContextToChannel('get-context');
|
|
7105
|
+
key: "getTargetWindow",
|
|
7106
|
+
value: function getTargetWindow() {
|
|
7107
|
+
var _document$querySelect;
|
|
7108
|
+
if (this.type === 'iframe') {
|
|
7109
|
+
return window.top;
|
|
7127
7110
|
}
|
|
7111
|
+
return ((_document$querySelect = document.querySelector("iframe[".concat(this.iframeChannelAttr, "='").concat(this.channelId, "']"))) === null || _document$querySelect === void 0 ? void 0 : _document$querySelect.contentWindow) || undefined;
|
|
7128
7112
|
}
|
|
7129
7113
|
}, {
|
|
7130
|
-
key: "
|
|
7131
|
-
value: function
|
|
7114
|
+
key: "setContextAndNotify",
|
|
7115
|
+
value: function setContextAndNotify(context) {
|
|
7132
7116
|
var _this = this;
|
|
7133
|
-
if (
|
|
7134
|
-
|
|
7117
|
+
if (typeof context === 'function') {
|
|
7118
|
+
this.contextData = context(this.contextData);
|
|
7119
|
+
} else {
|
|
7120
|
+
this.contextData = context;
|
|
7135
7121
|
}
|
|
7136
|
-
|
|
7137
|
-
|
|
7122
|
+
Object.values(this.listeners).forEach(function (listener) {
|
|
7123
|
+
return listener(_this.contextData);
|
|
7124
|
+
});
|
|
7125
|
+
}
|
|
7126
|
+
}, {
|
|
7127
|
+
key: "getPostRobotEventName",
|
|
7128
|
+
value: function getPostRobotEventName(channelId) {
|
|
7129
|
+
return "".concat(channelId, "-").concat(CONTEXT_UPDATE_EVENT);
|
|
7130
|
+
}
|
|
7131
|
+
}, {
|
|
7132
|
+
key: "connect",
|
|
7133
|
+
value: function connect(channelId) {
|
|
7134
|
+
var _this2 = this;
|
|
7135
|
+
var targetWindow = this.getTargetWindow();
|
|
7136
|
+
if (!targetWindow) {
|
|
7137
|
+
var error = new Error('Target window not found');
|
|
7138
|
+
throw error;
|
|
7138
7139
|
}
|
|
7139
|
-
|
|
7140
|
-
|
|
7141
|
-
|
|
7142
|
-
|
|
7140
|
+
var postRobotEventName = this.getPostRobotEventName(channelId);
|
|
7141
|
+
this.postRobotListener = postRobot.on(postRobotEventName, {
|
|
7142
|
+
window: targetWindow
|
|
7143
|
+
}, function (event) {
|
|
7144
|
+
if (event.data.type === 'init') {
|
|
7145
|
+
_this2.setContext(function (context) {
|
|
7146
|
+
return _objectSpread(_objectSpread({}, context), event.data.context);
|
|
7147
|
+
});
|
|
7148
|
+
} else {
|
|
7149
|
+
_this2.setContextAndNotify(function (context) {
|
|
7150
|
+
return _objectSpread(_objectSpread({}, context), event.data.context);
|
|
7151
|
+
});
|
|
7143
7152
|
}
|
|
7144
7153
|
return Promise.resolve();
|
|
7145
7154
|
});
|
|
7155
|
+
this.sendContextUpdate(true);
|
|
7146
7156
|
}
|
|
7147
7157
|
}, {
|
|
7148
|
-
key: "
|
|
7149
|
-
|
|
7150
|
-
|
|
7151
|
-
|
|
7152
|
-
|
|
7153
|
-
|
|
7154
|
-
|
|
7155
|
-
|
|
7158
|
+
key: "sendContextUpdate",
|
|
7159
|
+
value: function sendContextUpdate() {
|
|
7160
|
+
var isInit = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : false;
|
|
7161
|
+
var targetWindow = this.getTargetWindow();
|
|
7162
|
+
if (!targetWindow) {
|
|
7163
|
+
return;
|
|
7164
|
+
}
|
|
7165
|
+
try {
|
|
7166
|
+
postRobot.send(targetWindow, this.getPostRobotEventName(this.channelId), _objectSpread({
|
|
7167
|
+
context: this.contextData
|
|
7168
|
+
}, isInit && {
|
|
7169
|
+
type: 'init'
|
|
7170
|
+
}));
|
|
7171
|
+
} catch (error) {
|
|
7172
|
+
// do nothing
|
|
7173
|
+
}
|
|
7156
7174
|
}
|
|
7157
7175
|
}, {
|
|
7158
7176
|
key: "getContext",
|
|
7159
7177
|
value: function getContext() {
|
|
7160
|
-
return this.
|
|
7178
|
+
return this.contextData;
|
|
7161
7179
|
}
|
|
7162
7180
|
}, {
|
|
7163
7181
|
key: "setContext",
|
|
7164
7182
|
value: function setContext(context) {
|
|
7165
|
-
this.
|
|
7183
|
+
this.setContextAndNotify(context);
|
|
7184
|
+
this.sendContextUpdate();
|
|
7166
7185
|
}
|
|
7167
|
-
}, {
|
|
7168
|
-
key: "notifyListeners",
|
|
7169
|
-
value: function notifyListeners() {
|
|
7170
|
-
var _this2 = this;
|
|
7171
|
-
Object.values(this.listeners).forEach(function (listener) {
|
|
7172
|
-
return listener(_this2.context);
|
|
7173
|
-
});
|
|
7174
|
-
}
|
|
7175
|
-
}, {
|
|
7176
|
-
key: "syncContextToChannel",
|
|
7177
|
-
value: function () {
|
|
7178
|
-
var _syncContextToChannel = _asyncToGenerator(/*#__PURE__*/_regeneratorRuntime().mark(function _callee() {
|
|
7179
|
-
var type,
|
|
7180
|
-
_args = arguments;
|
|
7181
|
-
return _regeneratorRuntime().wrap(function _callee$(_context) {
|
|
7182
|
-
while (1) switch (_context.prev = _context.next) {
|
|
7183
|
-
case 0:
|
|
7184
|
-
type = _args.length > 0 && _args[0] !== undefined ? _args[0] : 'update-context';
|
|
7185
|
-
if (!(!this.targetWindow || !this.postRobotEventId)) {
|
|
7186
|
-
_context.next = 3;
|
|
7187
|
-
break;
|
|
7188
|
-
}
|
|
7189
|
-
return _context.abrupt("return");
|
|
7190
|
-
case 3:
|
|
7191
|
-
_context.next = 5;
|
|
7192
|
-
return postRobot.send(this.targetWindow, this.postRobotEventId, {
|
|
7193
|
-
from: this.id,
|
|
7194
|
-
type: type,
|
|
7195
|
-
context: this.context
|
|
7196
|
-
});
|
|
7197
|
-
case 5:
|
|
7198
|
-
case "end":
|
|
7199
|
-
return _context.stop();
|
|
7200
|
-
}
|
|
7201
|
-
}, _callee, this);
|
|
7202
|
-
}));
|
|
7203
|
-
function syncContextToChannel() {
|
|
7204
|
-
return _syncContextToChannel.apply(this, arguments);
|
|
7205
|
-
}
|
|
7206
|
-
return syncContextToChannel;
|
|
7207
|
-
}()
|
|
7208
7186
|
}, {
|
|
7209
7187
|
key: "subscribeToChanges",
|
|
7210
7188
|
value: function subscribeToChanges(idOrContextListener, contextListenerOrNothing) {
|
|
7211
7189
|
var id = typeof idOrContextListener === 'string' ? idOrContextListener : (0, _uuid.v4)();
|
|
7212
7190
|
var contextListener = typeof idOrContextListener === 'function' ? idOrContextListener : contextListenerOrNothing;
|
|
7213
7191
|
if (!contextListener) {
|
|
7214
|
-
|
|
7192
|
+
var error = new Error('Context listener is required');
|
|
7193
|
+
throw error;
|
|
7215
7194
|
}
|
|
7216
7195
|
this.listeners[id] = contextListener;
|
|
7217
7196
|
return id;
|
|
@@ -7221,6 +7200,31 @@ var ContextAPI = exports.ContextAPI = /*#__PURE__*/function () {
|
|
|
7221
7200
|
value: function unsubscribeFromChanges(id) {
|
|
7222
7201
|
delete this.listeners[id];
|
|
7223
7202
|
}
|
|
7203
|
+
}, {
|
|
7204
|
+
key: "connectToIframe",
|
|
7205
|
+
value: function connectToIframe() {
|
|
7206
|
+
var _this3 = this;
|
|
7207
|
+
if (this.type !== 'parent') {
|
|
7208
|
+
var error = new Error('ContextAPI is not a parent');
|
|
7209
|
+
throw error;
|
|
7210
|
+
}
|
|
7211
|
+
var onIframeLoad = function onIframeLoad() {
|
|
7212
|
+
_this3.connect(_this3.channelId);
|
|
7213
|
+
};
|
|
7214
|
+
return {
|
|
7215
|
+
channelId: this.channelId,
|
|
7216
|
+
onIframeLoad: onIframeLoad
|
|
7217
|
+
};
|
|
7218
|
+
}
|
|
7219
|
+
}, {
|
|
7220
|
+
key: "connectToParent",
|
|
7221
|
+
value: function connectToParent() {
|
|
7222
|
+
if (this.type !== 'iframe') {
|
|
7223
|
+
var error = new Error('ContextAPI is not an iframe');
|
|
7224
|
+
throw error;
|
|
7225
|
+
}
|
|
7226
|
+
this.connect(this.channelId);
|
|
7227
|
+
}
|
|
7224
7228
|
}, {
|
|
7225
7229
|
key: "destroy",
|
|
7226
7230
|
value: function destroy() {
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@octostar/platform-api",
|
|
3
|
-
"version": "0.5.
|
|
3
|
+
"version": "0.5.18",
|
|
4
4
|
"description": "Provides access to the API exposed by Octostar platform to an application run in an iframe",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"octostar",
|
|
@@ -39,10 +39,10 @@
|
|
|
39
39
|
"rimraf": "^5.0.5",
|
|
40
40
|
"tsup": "^8.4.0",
|
|
41
41
|
"typescript": "^5.8.2",
|
|
42
|
-
"@octostar/platform-types": "0.5.
|
|
42
|
+
"@octostar/platform-types": "0.5.22"
|
|
43
43
|
},
|
|
44
44
|
"peerDependencies": {
|
|
45
|
-
"@octostar/platform-types": "^0.5.
|
|
45
|
+
"@octostar/platform-types": "^0.5.22"
|
|
46
46
|
},
|
|
47
47
|
"publishConfig": {
|
|
48
48
|
"access": "public"
|