forked from dollarshaveclub/postmate
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathpostmate.min.js
8 lines (8 loc) · 4.17 KB
/
postmate.min.js
1
2
3
4
5
6
7
8
/**
postmate - A powerful, simple, promise-based postMessage library
@version v1.5.0
@link https://github.com/dollarshaveclub/postmate
@author Jacob Kelley <[email protected]>
@license MIT
**/
!function(e,t){"object"==typeof exports&&"undefined"!=typeof module?module.exports=t():"function"==typeof define&&define.amd?define(t):e.Postmate=t()}("undefined"!=typeof self?self:this,function(){"use strict";var l="application/x-postmate-v1+json",r=0,n={handshake:1,"handshake-reply":1,call:1,emit:1,reply:1,request:1},h=function(e,t){return("string"!=typeof t||e.origin===t)&&(!!e.data&&(("object"!=typeof e.data||"postmate"in e.data)&&(e.data.type===l&&!!n[e.data.postmate])))},p=function(){function e(e){var a=this;this.parent=e.parent,this.frame=e.frame,this.child=e.child,this.childOrigin=e.childOrigin,this.events={},this.listener=function(e){if(!h(e,a.childOrigin))return!1;var t=((e||{}).data||{}).value||{},n=t.data,i=t.name;"emit"===e.data.postmate&&i in a.events&&a.events[i].call(a,n)},this.parent.addEventListener("message",this.listener,!1)}var t=e.prototype;return t.get=function(e){var a=this;return new c.Promise(function(n){var i=++r;a.parent.addEventListener("message",function e(t){t.data.uid===i&&"reply"===t.data.postmate&&(a.parent.removeEventListener("message",e,!1),n(t.data.value))},!1),a.child.postMessage({postmate:"request",type:l,property:e,uid:i},a.childOrigin)})},t.call=function(e,t){this.child.postMessage({postmate:"call",type:l,property:e,data:t},this.childOrigin)},t.on=function(e,t){this.events[e]=t},t.destroy=function(){window.removeEventListener("message",this.listener,!1),this.frame.parentNode.removeChild(this.frame)},e}(),o=function(){function e(e){var d=this;this.model=e.model,this.parent=e.parent,this.parentOrigin=e.parentOrigin,this.child=e.child,this.child.addEventListener("message",function(t){if(h(t,d.parentOrigin)){var e,n,i,a=t.data,r=a.property,o=a.uid,s=a.data;if("call"!==t.data.postmate)(e=d.model,n=r,i="function"==typeof e[n]?e[n]():e[n],c.Promise.resolve(i)).then(function(e){return t.source.postMessage({property:r,postmate:"reply",type:l,uid:o,value:e},t.origin)});else r in d.model&&"function"==typeof d.model[r]&&d.model[r].call(d,s)}})}return e.prototype.emit=function(e,t){this.parent.postMessage({postmate:"emit",type:l,value:{name:e,data:t}},this.parentOrigin)},e}(),c=function(){function e(e){var t=e.container,n=void 0===t?void 0!==n?n:document.body:t,i=e.model,a=e.url,r=e.classListArray,o=void 0===r?[]:r;return this.parent=window,this.frame=document.createElement("iframe"),this.frame.classList.add.apply(this.frame.classList,o),n.appendChild(this.frame),this.child=this.frame.contentWindow||this.frame.contentDocument.parentWindow,this.model=i||{},this.sendHandshake(a)}return e.prototype.sendHandshake=function(a){var r,o=this,s=function(e){var t=document.createElement("a");t.href=e;var n=4<t.protocol.length?t.protocol:window.location.protocol,i=t.host.length?"80"===t.port||"443"===t.port?t.hostname:t.host:window.location.host;return t.origin||n+"//"+i}(a),d=0;return new e.Promise(function(n,i){o.parent.addEventListener("message",function e(t){return!!h(t,s)&&("handshake-reply"===t.data.postmate?(clearInterval(r),o.parent.removeEventListener("message",e,!1),o.childOrigin=t.origin,n(new p(o))):i("Failed handshake"))},!1);var e=function(){d++,o.child.postMessage({postmate:"handshake",type:l,model:o.model},s),5===d&&clearInterval(r)},t=function(){e(),r=setInterval(e,500)};o.frame.attachEvent?o.frame.attachEvent("onload",t):o.frame.onload=t,o.frame.src=a})},e}();return c.debug=!1,c.Promise=function(){try{return window?window.Promise:Promise}catch(e){return null}}(),c.Model=function(){function e(e){return this.child=window,this.model=e,this.parent=this.child.parent,this.sendHandshakeReply()}return e.prototype.sendHandshakeReply=function(){var r=this;return new c.Promise(function(i,a){r.child.addEventListener("message",function e(t){if(t.data.postmate){if("handshake"!==t.data.postmate)return a("Handshake Reply Failed");r.child.removeEventListener("message",e,!1),t.source.postMessage({postmate:"handshake-reply",type:l},t.origin),r.parentOrigin=t.origin;var n=t.data.model;return n&&Object.keys(n).forEach(function(e){r.model[e]=n[e]}),i(new o(r))}},!1)})},e}(),c});