penpal 6.2.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.
Files changed (66) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +234 -0
  3. package/dist/penpal.js +773 -0
  4. package/dist/penpal.min.js +1 -0
  5. package/dist/penpal.min.js.map +1 -0
  6. package/es5/child/connectToParent.js +111 -0
  7. package/es5/child/handleSynAckMessageFactory.js +58 -0
  8. package/es5/connectCallReceiver.js +101 -0
  9. package/es5/connectCallSender.js +122 -0
  10. package/es5/createDestructor.js +29 -0
  11. package/es5/createLogger.js +19 -0
  12. package/es5/enums.js +47 -0
  13. package/es5/errorSerialization.js +34 -0
  14. package/es5/generateId.js +14 -0
  15. package/es5/index.js +63 -0
  16. package/es5/indexForBundle.js +21 -0
  17. package/es5/methodSerialization.js +94 -0
  18. package/es5/parent/connectToChild.js +107 -0
  19. package/es5/parent/getOriginFromSrc.js +53 -0
  20. package/es5/parent/handleAckMessageFactory.js +66 -0
  21. package/es5/parent/handleSynMessageFactory.js +29 -0
  22. package/es5/parent/monitorIframeRemoval.js +34 -0
  23. package/es5/parent/validateIframeHasSrcOrSrcDoc.js +18 -0
  24. package/es5/startConnectionTimeout.js +30 -0
  25. package/es5/types.js +1 -0
  26. package/lib/child/connectToParent.d.ts +36 -0
  27. package/lib/child/connectToParent.js +73 -0
  28. package/lib/child/handleSynAckMessageFactory.d.ts +7 -0
  29. package/lib/child/handleSynAckMessageFactory.js +41 -0
  30. package/lib/connectCallReceiver.d.ts +7 -0
  31. package/lib/connectCallReceiver.js +71 -0
  32. package/lib/connectCallSender.d.ts +14 -0
  33. package/lib/connectCallSender.js +93 -0
  34. package/lib/createDestructor.d.ts +13 -0
  35. package/lib/createDestructor.js +18 -0
  36. package/lib/createLogger.d.ts +2 -0
  37. package/lib/createLogger.js +10 -0
  38. package/lib/enums.d.ts +22 -0
  39. package/lib/enums.js +27 -0
  40. package/lib/errorSerialization.d.ts +14 -0
  41. package/lib/errorSerialization.js +17 -0
  42. package/lib/generateId.d.ts +5 -0
  43. package/lib/generateId.js +5 -0
  44. package/lib/index.d.ts +4 -0
  45. package/lib/index.js +3 -0
  46. package/lib/indexForBundle.d.ts +21 -0
  47. package/lib/indexForBundle.js +8 -0
  48. package/lib/methodSerialization.d.ts +27 -0
  49. package/lib/methodSerialization.js +67 -0
  50. package/lib/parent/connectToChild.d.ts +31 -0
  51. package/lib/parent/connectToChild.js +66 -0
  52. package/lib/parent/getOriginFromSrc.d.ts +5 -0
  53. package/lib/parent/getOriginFromSrc.js +42 -0
  54. package/lib/parent/handleAckMessageFactory.d.ts +7 -0
  55. package/lib/parent/handleAckMessageFactory.js +47 -0
  56. package/lib/parent/handleSynMessageFactory.d.ts +6 -0
  57. package/lib/parent/handleSynMessageFactory.js +18 -0
  58. package/lib/parent/monitorIframeRemoval.d.ts +12 -0
  59. package/lib/parent/monitorIframeRemoval.js +22 -0
  60. package/lib/parent/validateIframeHasSrcOrSrcDoc.d.ts +2 -0
  61. package/lib/parent/validateIframeHasSrcOrSrcDoc.js +8 -0
  62. package/lib/startConnectionTimeout.d.ts +6 -0
  63. package/lib/startConnectionTimeout.js +18 -0
  64. package/lib/types.d.ts +114 -0
  65. package/lib/types.js +0 -0
  66. package/package.json +90 -0
@@ -0,0 +1 @@
1
+ var Penpal=function(){"use strict";var e;(function(e){e["Call"]="call";e["Reply"]="reply";e["Syn"]="syn";e["SynAck"]="synAck";e["Ack"]="ack"})(e||(e={}));var n;(function(e){e["Fulfilled"]="fulfilled";e["Rejected"]="rejected"})(n||(n={}));var t;(function(e){e["ConnectionDestroyed"]="ConnectionDestroyed";e["ConnectionTimeout"]="ConnectionTimeout";e["NoIframeSrc"]="NoIframeSrc"})(t||(t={}));var o;(function(e){e["DataCloneError"]="DataCloneError"})(o||(o={}));var r;(function(e){e["Message"]="message"})(r||(r={}));var c=(e,n)=>{const t=[];let o=false;return{destroy(r){if(!o){o=true;n("".concat(e,": Destroying connection"));t.forEach(e=>{e(r)})}},onDestroy(e){o?e():t.push(e)}}};var s=e=>(...n)=>{if(e){console.log("[Penpal]",...n)}};const i={"http:":"80","https:":"443"};const a=/^(https?:)?\/\/([^/:]+)?(:(\d+))?/;const d=["file:","data:"];var l=e=>{if(e&&d.find(n=>e.startsWith(n))){return"null"}const n=document.location;const t=a.exec(e);let o;let r;let c;if(t){o=t[1]?t[1]:n.protocol;r=t[2];c=t[4]}else{o=n.protocol;r=n.hostname;c=n.port}const s=c&&c!==i[o]?":".concat(c):"";return"".concat(o,"//").concat(r).concat(s)};const u=({name:e,message:n,stack:t})=>({name:e,message:n,stack:t});const f=e=>{const n=new Error;Object.keys(e).forEach(t=>n[t]=e[t]);return n};var g=(t,c,s)=>{const{localName:i,local:a,remote:d,originForSending:l,originForReceiving:f}=t;let g=false;const m=t=>{if(t.source!==d||t.data.penpal!==e.Call){return}if(f!=="*"&&t.origin!==f){s("".concat(i," received message from origin ").concat(t.origin," which did not match expected origin ").concat(f));return}const r=t.data;const{methodName:a,args:m,id:p}=r;s("".concat(i,": Received ").concat(a,"() call"));const h=t=>r=>{s("".concat(i,": Sending ").concat(a,"() reply"));if(g){s("".concat(i,": Unable to send ").concat(a,"() reply due to destroyed connection"));return}const c={penpal:e.Reply,id:p,resolution:t,returnValue:r};if(t===n.Rejected&&r instanceof Error){c.returnValue=u(r);c.returnValueIsError=true}try{d.postMessage(c,l)}catch(t){if(t.name===o.DataCloneError){const o={penpal:e.Reply,id:p,resolution:n.Rejected,returnValue:u(t),returnValueIsError:true};d.postMessage(o,l)}throw t}};new Promise(e=>e(c[a].apply(c,m))).then(h(n.Fulfilled),h(n.Rejected))};a.addEventListener(r.Message,m);return()=>{g=true;a.removeEventListener(r.Message,m)}};let m=0;var p=()=>++m;const h=".";const v=e=>e?e.split(h):[];const y=e=>e.join(h);const w=(e,n)=>{const t=v(n||"");t.push(e);return y(t)};const C=(e,n,t)=>{const o=v(n);o.reduce((e,n,r)=>{if(typeof e[n]==="undefined"){e[n]={}}if(r===o.length-1){e[n]=t}return e[n]},e);return e};const E=(e,n)=>{const t={};Object.keys(e).forEach(o=>{const r=e[o];const c=w(o,n);if(typeof r==="object"){Object.assign(t,E(r,c))}if(typeof r==="function"){t[c]=r}});return t};const k=e=>{const n={};for(const t in e){C(n,t,e[t])}return n};var R=(o,c,s,i,a)=>{const{localName:d,local:l,remote:u,originForSending:g,originForReceiving:m}=c;let h=false;a("".concat(d,": Connecting call sender"));const v=o=>(...c)=>{a("".concat(d,": Sending ").concat(o,"() call"));let s;try{if(u.closed){s=true}}catch(e){s=true}if(s){i()}if(h){const e=new Error("Unable to send ".concat(o,"() call due ")+"to destroyed connection");e.code=t.ConnectionDestroyed;throw e}return new Promise((t,s)=>{const i=p();const h=c=>{if(c.source!==u||c.data.penpal!==e.Reply||c.data.id!==i){return}if(m!=="*"&&c.origin!==m){a("".concat(d," received message from origin ").concat(c.origin," which did not match expected origin ").concat(m));return}const g=c.data;a("".concat(d,": Received ").concat(o,"() reply"));l.removeEventListener(r.Message,h);let p=g.returnValue;if(g.returnValueIsError){p=f(p)}(g.resolution===n.Fulfilled?t:s)(p)};l.addEventListener(r.Message,h);const v={penpal:e.Call,id:i,methodName:o,args:c};u.postMessage(v,g)})};const y=s.reduce((e,n)=>{e[n]=v(n);return e},{});Object.assign(o,k(y));return()=>{h=true}};var S=(e,n,t,o,r)=>{const{destroy:c,onDestroy:s}=o;let i;let a;const d={};return o=>{if(n!=="*"&&o.origin!==n){r("Parent: Handshake - Received ACK message from origin ".concat(o.origin," which did not match expected origin ").concat(n));return}r("Parent: Handshake - Received ACK");const l={localName:"Parent",local:window,remote:o.source,originForSending:t,originForReceiving:n};if(i){i()}i=g(l,e,r);s(i);if(a){a.forEach(e=>{delete d[e]})}a=o.data.methodNames;const u=R(d,l,a,c,r);s(u);return d}};var N=(n,t,o,r)=>c=>{if(o!=="*"&&c.origin!==o){n("Parent: Handshake - Received SYN message from origin ".concat(c.origin," which did not match expected origin ").concat(o));return}n("Parent: Handshake - Received SYN, responding with SYN-ACK");const s={penpal:e.SynAck,methodNames:Object.keys(t)};c.source.postMessage(s,r)};const M=6e4;var A=(e,n)=>{const{destroy:t,onDestroy:o}=n;const r=setInterval(()=>{if(!e.isConnected){clearInterval(r);t()}},M);o(()=>{clearInterval(r)})};var P=(e,n)=>{let o;if(e!==undefined){o=window.setTimeout(()=>{const o=new Error("Connection timed out after ".concat(e,"ms"));o.code=t.ConnectionTimeout;n(o)},e)}return()=>{clearTimeout(o)}};var j=e=>{if(!e.src&&!e.srcdoc){const e=new Error("Iframe must have src or srcdoc property defined.");e.code=t.NoIframeSrc;throw e}};var D=n=>{let{iframe:t,methods:o={},childOrigin:i,timeout:a,debug:d=false}=n;const u=s(d);const f=c("Parent",u);const{onDestroy:g,destroy:m}=f;if(!i){j(t);i=l(t.src)}const p=i==="null"?"*":i;const h=E(o);const v=N(u,h,i,p);const y=S(h,i,p,f,u);const w=new Promise((n,o)=>{const c=P(a,m);const s=o=>{if(o.source!==t.contentWindow||!o.data){return}if(o.data.penpal===e.Syn){v(o);return}if(o.data.penpal===e.Ack){const e=y(o);if(e){c();n(e)}return}};window.addEventListener(r.Message,s);u("Parent: Awaiting handshake");A(t,f);g(e=>{window.removeEventListener(r.Message,s);if(e){o(e)}})});return{promise:w,destroy(){m()}}};var b=(n,t,o,r)=>{const{destroy:c,onDestroy:s}=o;return o=>{let i=n instanceof RegExp?n.test(o.origin):n==="*"||n===o.origin;if(!i){r("Child: Handshake - Received SYN-ACK from origin ".concat(o.origin," which did not match expected origin ").concat(n));return}r("Child: Handshake - Received SYN-ACK, responding with ACK");const a=o.origin==="null"?"*":o.origin;const d={penpal:e.Ack,methodNames:Object.keys(t)};window.parent.postMessage(d,a);const l={localName:"Child",local:window,remote:window.parent,originForSending:a,originForReceiving:o.origin};const u=g(l,t,r);s(u);const f={};const m=R(f,l,o.data.methodNames,c,r);s(m);return f}};const F=()=>{try{clearTimeout()}catch(e){return false}return true};var I=(n={})=>{const{parentOrigin:t="*",methods:o={},timeout:i,debug:a=false}=n;const d=s(a);const l=c("Child",d);const{destroy:u,onDestroy:f}=l;const g=E(o);const m=b(t,g,l,d);const p=()=>{d("Child: Handshake - Sending SYN");const n={penpal:e.Syn};const o=t instanceof RegExp?"*":t;window.parent.postMessage(n,o)};const h=new Promise((n,t)=>{const o=P(i,u);const c=t=>{if(!F()){return}if(t.source!==parent||!t.data){return}if(t.data.penpal===e.SynAck){const e=m(t);if(e){window.removeEventListener(r.Message,c);o();n(e)}}};window.addEventListener(r.Message,c);p();f(e=>{window.removeEventListener(r.Message,c);if(e){t(e)}})});return{promise:h,destroy(){u()}}};var L={connectToChild:D,connectToParent:I,ErrorCode:t};return L}();
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["dist/penpal.js"],"names":["Penpal","MessageType","Resolution","ErrorCode","NativeErrorName","NativeEventType","createDestructor","localName","log","callbacks","destroyed","[object Object]","error","concat","forEach","callback","push","createLogger","debug","args","console","DEFAULT_PORT_BY_PROTOCOL","http:","https:","URL_REGEX","opaqueOriginSchemes","getOriginFromSrc","src","find","scheme","startsWith","location","document","regexResult","exec","protocol","hostname","port","portSuffix","serializeError","name","message","stack","deserializeError","obj","deserializedError","Error","Object","keys","key","connectCallReceiver","info","serializedMethods","local","remote","originForSending","originForReceiving","handleMessageEvent","event","source","data","penpal","Call","origin","callMessage","methodName","id","createPromiseHandler","resolution","returnValue","Reply","Rejected","returnValueIsError","postMessage","err","DataCloneError","errorReplyMessage","Promise","resolve","apply","then","Fulfilled","addEventListener","Message","removeEventListener","generateId","KEY_PATH_DELIMITER","keyPathToSegments","keyPath","split","segmentsToKeyPath","segments","join","createKeyPath","prefix","setAtKeyPath","subject","value","reduce","prevSubject","idx","length","serializeMethods","methods","flattenedMethods","assign","deserializeMethods","connectCallSender","callSender","methodKeyPaths","destroyConnection","createMethodProxy","iframeRemoved","closed","e","code","ConnectionDestroyed","reject","replyMessage","api","handleAckMessageFactory","childOrigin","destructor","destroy","onDestroy","destroyCallReceiver","receiverMethodNames","window","receiverMethodName","methodNames","destroyCallSender","handleSynMessageFactory","synAckMessage","SynAck","CHECK_IFRAME_IN_DOC_INTERVAL","monitorIframeRemoval","iframe","checkIframeInDocIntervalId","setInterval","isConnected","clearInterval","startConnectionTimeout","timeout","timeoutId","undefined","setTimeout","ConnectionTimeout","clearTimeout","validateIframeHasSrcOrSrcDoc","srcdoc","NoIframeSrc","connectToChild","options","handleSynMessage","handleAckMessage","promise","stopConnectionTimeout","handleMessage","contentWindow","Syn","Ack","handleSynAckMessageFactory","parentOrigin","originQualifies","RegExp","test","ackMessage","parent","areGlobalsAccessible","connectToParent","handleSynAckMessage","sendSynMessage","synMessage","parentOriginForSyn","indexForBundle"],"mappings":"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"}
@@ -0,0 +1,111 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.default = void 0;
7
+
8
+ var _createDestructor = _interopRequireDefault(require("../createDestructor"));
9
+
10
+ var _createLogger = _interopRequireDefault(require("../createLogger"));
11
+
12
+ var _enums = require("../enums");
13
+
14
+ var _handleSynAckMessageFactory = _interopRequireDefault(require("./handleSynAckMessageFactory"));
15
+
16
+ var _methodSerialization = require("../methodSerialization");
17
+
18
+ var _startConnectionTimeout = _interopRequireDefault(require("../startConnectionTimeout"));
19
+
20
+ function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
21
+
22
+ const areGlobalsAccessible = () => {
23
+ try {
24
+ clearTimeout();
25
+ } catch (e) {
26
+ return false;
27
+ }
28
+
29
+ return true;
30
+ };
31
+
32
+ /**
33
+ * Attempts to establish communication with the parent window.
34
+ */
35
+ var _default = (options = {}) => {
36
+ const {
37
+ parentOrigin = '*',
38
+ methods = {},
39
+ timeout,
40
+ debug = false
41
+ } = options;
42
+ const log = (0, _createLogger.default)(debug);
43
+ const destructor = (0, _createDestructor.default)('Child', log);
44
+ const {
45
+ destroy,
46
+ onDestroy
47
+ } = destructor;
48
+ const serializedMethods = (0, _methodSerialization.serializeMethods)(methods);
49
+ const handleSynAckMessage = (0, _handleSynAckMessageFactory.default)(parentOrigin, serializedMethods, destructor, log);
50
+
51
+ const sendSynMessage = () => {
52
+ log('Child: Handshake - Sending SYN');
53
+ const synMessage = {
54
+ penpal: _enums.MessageType.Syn
55
+ };
56
+ const parentOriginForSyn = parentOrigin instanceof RegExp ? '*' : parentOrigin;
57
+ window.parent.postMessage(synMessage, parentOriginForSyn);
58
+ };
59
+
60
+ const promise = new Promise((resolve, reject) => {
61
+ const stopConnectionTimeout = (0, _startConnectionTimeout.default)(timeout, destroy);
62
+
63
+ const handleMessage = event => {
64
+ // Under niche scenarios, we get into this function after
65
+ // the iframe has been removed from the DOM. In Edge, this
66
+ // results in "Object expected" errors being thrown when we
67
+ // try to access properties on window (global properties).
68
+ // For this reason, we try to access a global up front (clearTimeout)
69
+ // and if it fails we can assume the iframe has been removed
70
+ // and we ignore the message event.
71
+ if (!areGlobalsAccessible()) {
72
+ return;
73
+ }
74
+
75
+ if (event.source !== parent || !event.data) {
76
+ return;
77
+ }
78
+
79
+ if (event.data.penpal === _enums.MessageType.SynAck) {
80
+ const callSender = handleSynAckMessage(event);
81
+
82
+ if (callSender) {
83
+ window.removeEventListener(_enums.NativeEventType.Message, handleMessage);
84
+ stopConnectionTimeout();
85
+ resolve(callSender);
86
+ }
87
+ }
88
+ };
89
+
90
+ window.addEventListener(_enums.NativeEventType.Message, handleMessage);
91
+ sendSynMessage();
92
+ onDestroy(error => {
93
+ window.removeEventListener(_enums.NativeEventType.Message, handleMessage);
94
+
95
+ if (error) {
96
+ reject(error);
97
+ }
98
+ });
99
+ });
100
+ return {
101
+ promise,
102
+
103
+ destroy() {
104
+ // Don't allow consumer to pass an error into destroy.
105
+ destroy();
106
+ }
107
+
108
+ };
109
+ };
110
+
111
+ exports.default = _default;
@@ -0,0 +1,58 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.default = void 0;
7
+
8
+ var _enums = require("../enums");
9
+
10
+ var _connectCallReceiver = _interopRequireDefault(require("../connectCallReceiver"));
11
+
12
+ var _connectCallSender = _interopRequireDefault(require("../connectCallSender"));
13
+
14
+ function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
15
+
16
+ /**
17
+ * Handles a SYN-ACK handshake message.
18
+ */
19
+ var _default = (parentOrigin, serializedMethods, destructor, log) => {
20
+ const {
21
+ destroy,
22
+ onDestroy
23
+ } = destructor;
24
+ return event => {
25
+ let originQualifies = parentOrigin instanceof RegExp ? parentOrigin.test(event.origin) : parentOrigin === '*' || parentOrigin === event.origin;
26
+
27
+ if (!originQualifies) {
28
+ log("Child: Handshake - Received SYN-ACK from origin ".concat(event.origin, " which did not match expected origin ").concat(parentOrigin));
29
+ return;
30
+ }
31
+
32
+ log('Child: Handshake - Received SYN-ACK, responding with ACK'); // If event.origin is "null", the remote protocol is file: or data: and we
33
+ // must post messages with "*" as targetOrigin when sending messages.
34
+ // https://developer.mozilla.org/en-US/docs/Web/API/Window/postMessage#Using_window.postMessage_in_extensions
35
+
36
+ const originForSending = event.origin === 'null' ? '*' : event.origin;
37
+ const ackMessage = {
38
+ penpal: _enums.MessageType.Ack,
39
+ methodNames: Object.keys(serializedMethods)
40
+ };
41
+ window.parent.postMessage(ackMessage, originForSending);
42
+ const info = {
43
+ localName: 'Child',
44
+ local: window,
45
+ remote: window.parent,
46
+ originForSending,
47
+ originForReceiving: event.origin
48
+ };
49
+ const destroyCallReceiver = (0, _connectCallReceiver.default)(info, serializedMethods, log);
50
+ onDestroy(destroyCallReceiver);
51
+ const callSender = {};
52
+ const destroyCallSender = (0, _connectCallSender.default)(callSender, info, event.data.methodNames, destroy, log);
53
+ onDestroy(destroyCallSender);
54
+ return callSender;
55
+ };
56
+ };
57
+
58
+ exports.default = _default;
@@ -0,0 +1,101 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.default = void 0;
7
+
8
+ var _errorSerialization = require("./errorSerialization");
9
+
10
+ var _enums = require("./enums");
11
+
12
+ /**
13
+ * Listens for "call" messages coming from the remote, executes the corresponding method, and
14
+ * responds with the return value.
15
+ */
16
+ var _default = (info, serializedMethods, log) => {
17
+ const {
18
+ localName,
19
+ local,
20
+ remote,
21
+ originForSending,
22
+ originForReceiving
23
+ } = info;
24
+ let destroyed = false;
25
+
26
+ const handleMessageEvent = event => {
27
+ if (event.source !== remote || event.data.penpal !== _enums.MessageType.Call) {
28
+ return;
29
+ }
30
+
31
+ if (originForReceiving !== '*' && event.origin !== originForReceiving) {
32
+ log("".concat(localName, " received message from origin ").concat(event.origin, " which did not match expected origin ").concat(originForReceiving));
33
+ return;
34
+ }
35
+
36
+ const callMessage = event.data;
37
+ const {
38
+ methodName,
39
+ args,
40
+ id
41
+ } = callMessage;
42
+ log("".concat(localName, ": Received ").concat(methodName, "() call"));
43
+
44
+ const createPromiseHandler = resolution => {
45
+ return returnValue => {
46
+ log("".concat(localName, ": Sending ").concat(methodName, "() reply"));
47
+
48
+ if (destroyed) {
49
+ // It's possible to throw an error here, but it would need to be thrown asynchronously
50
+ // and would only be catchable using window.onerror. This is because the consumer
51
+ // is merely returning a value from their method and not calling any function
52
+ // that they could wrap in a try-catch. Even if the consumer were to catch the error,
53
+ // the value of doing so is questionable. Instead, we'll just log a message.
54
+ log("".concat(localName, ": Unable to send ").concat(methodName, "() reply due to destroyed connection"));
55
+ return;
56
+ }
57
+
58
+ const message = {
59
+ penpal: _enums.MessageType.Reply,
60
+ id,
61
+ resolution,
62
+ returnValue
63
+ };
64
+
65
+ if (resolution === _enums.Resolution.Rejected && returnValue instanceof Error) {
66
+ message.returnValue = (0, _errorSerialization.serializeError)(returnValue);
67
+ message.returnValueIsError = true;
68
+ }
69
+
70
+ try {
71
+ remote.postMessage(message, originForSending);
72
+ } catch (err) {
73
+ // If a consumer attempts to send an object that's not cloneable (e.g., window),
74
+ // we want to ensure the receiver's promise gets rejected.
75
+ if (err.name === _enums.NativeErrorName.DataCloneError) {
76
+ const errorReplyMessage = {
77
+ penpal: _enums.MessageType.Reply,
78
+ id,
79
+ resolution: _enums.Resolution.Rejected,
80
+ returnValue: (0, _errorSerialization.serializeError)(err),
81
+ returnValueIsError: true
82
+ };
83
+ remote.postMessage(errorReplyMessage, originForSending);
84
+ }
85
+
86
+ throw err;
87
+ }
88
+ };
89
+ };
90
+
91
+ new Promise(resolve => resolve(serializedMethods[methodName].apply(serializedMethods, args))).then(createPromiseHandler(_enums.Resolution.Fulfilled), createPromiseHandler(_enums.Resolution.Rejected));
92
+ };
93
+
94
+ local.addEventListener(_enums.NativeEventType.Message, handleMessageEvent);
95
+ return () => {
96
+ destroyed = true;
97
+ local.removeEventListener(_enums.NativeEventType.Message, handleMessageEvent);
98
+ };
99
+ };
100
+
101
+ exports.default = _default;
@@ -0,0 +1,122 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.default = void 0;
7
+
8
+ var _generateId = _interopRequireDefault(require("./generateId"));
9
+
10
+ var _errorSerialization = require("./errorSerialization");
11
+
12
+ var _methodSerialization = require("./methodSerialization");
13
+
14
+ var _enums = require("./enums");
15
+
16
+ function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
17
+
18
+ /**
19
+ * Augments an object with methods that match those defined by the remote. When these methods are
20
+ * called, a "call" message will be sent to the remote, the remote's corresponding method will be
21
+ * executed, and the method's return value will be returned via a message.
22
+ * @param {Object} callSender Sender object that should be augmented with methods.
23
+ * @param {Object} info Information about the local and remote windows.
24
+ * @param {Array} methodKeyPaths Key paths of methods available to be called on the remote.
25
+ * @param {Promise} destructionPromise A promise resolved when destroy() is called on the penpal
26
+ * connection.
27
+ * @returns {Object} The call sender object with methods that may be called.
28
+ */
29
+ var _default = (callSender, info, methodKeyPaths, destroyConnection, log) => {
30
+ const {
31
+ localName,
32
+ local,
33
+ remote,
34
+ originForSending,
35
+ originForReceiving
36
+ } = info;
37
+ let destroyed = false;
38
+ log("".concat(localName, ": Connecting call sender"));
39
+
40
+ const createMethodProxy = methodName => {
41
+ return (...args) => {
42
+ log("".concat(localName, ": Sending ").concat(methodName, "() call")); // This handles the case where the iframe has been removed from the DOM
43
+ // (and therefore its window closed), the consumer has not yet
44
+ // called destroy(), and the user calls a method exposed by
45
+ // the remote. We detect the iframe has been removed and force
46
+ // a destroy() immediately so that the consumer sees the error saying
47
+ // the connection has been destroyed. We wrap this check in a try catch
48
+ // because Edge throws an "Object expected" error when accessing
49
+ // contentWindow.closed on a contentWindow from an iframe that's been
50
+ // removed from the DOM.
51
+
52
+ let iframeRemoved;
53
+
54
+ try {
55
+ if (remote.closed) {
56
+ iframeRemoved = true;
57
+ }
58
+ } catch (e) {
59
+ iframeRemoved = true;
60
+ }
61
+
62
+ if (iframeRemoved) {
63
+ destroyConnection();
64
+ }
65
+
66
+ if (destroyed) {
67
+ const error = new Error("Unable to send ".concat(methodName, "() call due ") + "to destroyed connection");
68
+ error.code = _enums.ErrorCode.ConnectionDestroyed;
69
+ throw error;
70
+ }
71
+
72
+ return new Promise((resolve, reject) => {
73
+ const id = (0, _generateId.default)();
74
+
75
+ const handleMessageEvent = event => {
76
+ if (event.source !== remote || event.data.penpal !== _enums.MessageType.Reply || event.data.id !== id) {
77
+ return;
78
+ }
79
+
80
+ if (originForReceiving !== '*' && event.origin !== originForReceiving) {
81
+ log("".concat(localName, " received message from origin ").concat(event.origin, " which did not match expected origin ").concat(originForReceiving));
82
+ return;
83
+ }
84
+
85
+ const replyMessage = event.data;
86
+ log("".concat(localName, ": Received ").concat(methodName, "() reply"));
87
+ local.removeEventListener(_enums.NativeEventType.Message, handleMessageEvent);
88
+ let returnValue = replyMessage.returnValue;
89
+
90
+ if (replyMessage.returnValueIsError) {
91
+ returnValue = (0, _errorSerialization.deserializeError)(returnValue);
92
+ }
93
+
94
+ (replyMessage.resolution === _enums.Resolution.Fulfilled ? resolve : reject)(returnValue);
95
+ };
96
+
97
+ local.addEventListener(_enums.NativeEventType.Message, handleMessageEvent);
98
+ const callMessage = {
99
+ penpal: _enums.MessageType.Call,
100
+ id,
101
+ methodName,
102
+ args
103
+ };
104
+ remote.postMessage(callMessage, originForSending);
105
+ });
106
+ };
107
+ }; // Wrap each method in a proxy which sends it to the corresponding receiver.
108
+
109
+
110
+ const flattenedMethods = methodKeyPaths.reduce((api, name) => {
111
+ api[name] = createMethodProxy(name);
112
+ return api;
113
+ }, {}); // Unpack the structure of the provided methods object onto the CallSender, exposing
114
+ // the methods in the same shape they were provided.
115
+
116
+ Object.assign(callSender, (0, _methodSerialization.deserializeMethods)(flattenedMethods));
117
+ return () => {
118
+ destroyed = true;
119
+ };
120
+ };
121
+
122
+ exports.default = _default;
@@ -0,0 +1,29 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.default = void 0;
7
+
8
+ var _default = (localName, log) => {
9
+ const callbacks = [];
10
+ let destroyed = false;
11
+ return {
12
+ destroy(error) {
13
+ if (!destroyed) {
14
+ destroyed = true;
15
+ log("".concat(localName, ": Destroying connection"));
16
+ callbacks.forEach(callback => {
17
+ callback(error);
18
+ });
19
+ }
20
+ },
21
+
22
+ onDestroy(callback) {
23
+ destroyed ? callback() : callbacks.push(callback);
24
+ }
25
+
26
+ };
27
+ };
28
+
29
+ exports.default = _default;
@@ -0,0 +1,19 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.default = void 0;
7
+
8
+ var _default = debug => {
9
+ /**
10
+ * Logs a message if debug is enabled.
11
+ */
12
+ return (...args) => {
13
+ if (debug) {
14
+ console.log('[Penpal]', ...args); // eslint-disable-line no-console
15
+ }
16
+ };
17
+ };
18
+
19
+ exports.default = _default;
package/es5/enums.js ADDED
@@ -0,0 +1,47 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.NativeEventType = exports.NativeErrorName = exports.ErrorCode = exports.Resolution = exports.MessageType = void 0;
7
+ let MessageType;
8
+ exports.MessageType = MessageType;
9
+
10
+ (function (MessageType) {
11
+ MessageType["Call"] = "call";
12
+ MessageType["Reply"] = "reply";
13
+ MessageType["Syn"] = "syn";
14
+ MessageType["SynAck"] = "synAck";
15
+ MessageType["Ack"] = "ack";
16
+ })(MessageType || (exports.MessageType = MessageType = {}));
17
+
18
+ let Resolution;
19
+ exports.Resolution = Resolution;
20
+
21
+ (function (Resolution) {
22
+ Resolution["Fulfilled"] = "fulfilled";
23
+ Resolution["Rejected"] = "rejected";
24
+ })(Resolution || (exports.Resolution = Resolution = {}));
25
+
26
+ let ErrorCode;
27
+ exports.ErrorCode = ErrorCode;
28
+
29
+ (function (ErrorCode) {
30
+ ErrorCode["ConnectionDestroyed"] = "ConnectionDestroyed";
31
+ ErrorCode["ConnectionTimeout"] = "ConnectionTimeout";
32
+ ErrorCode["NoIframeSrc"] = "NoIframeSrc";
33
+ })(ErrorCode || (exports.ErrorCode = ErrorCode = {}));
34
+
35
+ let NativeErrorName;
36
+ exports.NativeErrorName = NativeErrorName;
37
+
38
+ (function (NativeErrorName) {
39
+ NativeErrorName["DataCloneError"] = "DataCloneError";
40
+ })(NativeErrorName || (exports.NativeErrorName = NativeErrorName = {}));
41
+
42
+ let NativeEventType;
43
+ exports.NativeEventType = NativeEventType;
44
+
45
+ (function (NativeEventType) {
46
+ NativeEventType["Message"] = "message";
47
+ })(NativeEventType || (exports.NativeEventType = NativeEventType = {}));
@@ -0,0 +1,34 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.deserializeError = exports.serializeError = void 0;
7
+
8
+ /**
9
+ * Converts an error object into a plain object.
10
+ */
11
+ const serializeError = ({
12
+ name,
13
+ message,
14
+ stack
15
+ }) => ({
16
+ name,
17
+ message,
18
+ stack
19
+ });
20
+ /**
21
+ * Converts a plain object into an error object.
22
+ */
23
+
24
+
25
+ exports.serializeError = serializeError;
26
+
27
+ const deserializeError = obj => {
28
+ const deserializedError = new Error(); // @ts-ignore
29
+
30
+ Object.keys(obj).forEach(key => deserializedError[key] = obj[key]);
31
+ return deserializedError;
32
+ };
33
+
34
+ exports.deserializeError = deserializeError;
@@ -0,0 +1,14 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.default = void 0;
7
+ let id = 0;
8
+ /**
9
+ * @return {number} A unique ID (not universally unique)
10
+ */
11
+
12
+ var _default = () => ++id;
13
+
14
+ exports.default = _default;
package/es5/index.js ADDED
@@ -0,0 +1,63 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ Object.defineProperty(exports, "connectToChild", {
7
+ enumerable: true,
8
+ get: function () {
9
+ return _connectToChild.default;
10
+ }
11
+ });
12
+ Object.defineProperty(exports, "connectToParent", {
13
+ enumerable: true,
14
+ get: function () {
15
+ return _connectToParent.default;
16
+ }
17
+ });
18
+ Object.defineProperty(exports, "ErrorCode", {
19
+ enumerable: true,
20
+ get: function () {
21
+ return _enums.ErrorCode;
22
+ }
23
+ });
24
+ Object.defineProperty(exports, "Connection", {
25
+ enumerable: true,
26
+ get: function () {
27
+ return _types.Connection;
28
+ }
29
+ });
30
+ Object.defineProperty(exports, "AsyncMethodReturns", {
31
+ enumerable: true,
32
+ get: function () {
33
+ return _types.AsyncMethodReturns;
34
+ }
35
+ });
36
+ Object.defineProperty(exports, "CallSender", {
37
+ enumerable: true,
38
+ get: function () {
39
+ return _types.CallSender;
40
+ }
41
+ });
42
+ Object.defineProperty(exports, "Methods", {
43
+ enumerable: true,
44
+ get: function () {
45
+ return _types.Methods;
46
+ }
47
+ });
48
+ Object.defineProperty(exports, "PenpalError", {
49
+ enumerable: true,
50
+ get: function () {
51
+ return _types.PenpalError;
52
+ }
53
+ });
54
+
55
+ var _connectToChild = _interopRequireDefault(require("./parent/connectToChild"));
56
+
57
+ var _connectToParent = _interopRequireDefault(require("./child/connectToParent"));
58
+
59
+ var _enums = require("./enums");
60
+
61
+ var _types = require("./types");
62
+
63
+ function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
@@ -0,0 +1,21 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.default = void 0;
7
+
8
+ var _connectToChild = _interopRequireDefault(require("./parent/connectToChild"));
9
+
10
+ var _connectToParent = _interopRequireDefault(require("./child/connectToParent"));
11
+
12
+ var _enums = require("./enums");
13
+
14
+ function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
15
+
16
+ var _default = {
17
+ connectToChild: _connectToChild.default,
18
+ connectToParent: _connectToParent.default,
19
+ ErrorCode: _enums.ErrorCode
20
+ };
21
+ exports.default = _default;