{"version":3,"sources":["https://lively-kernel.org/lively4/composed-offset/src/client/morphic/events.js"],"names":["cop","Events","disconnectBeforeEvent","cb","beforeEventCallbacks","delete","registerBeforeEvent","Set","add","logBeforeEvent","obj","type","evt","forEach","eaCb","disconnectAfterEvent","afterEventCallbacks","registerAfterEvent","logAfterEvent","installHooks","installHooksPlain","window","__Events_callbackbMap","WeakMap","cbMap","__originalRemoveEventListener","HTMLElement","prototype","removeEventListener","__originalAddEventListener","addEventListener","rest","wrappedCB","get","apply","func","args","EventHooks","__isLogging","e","console","error","result","set"],"mappings":";;;;;;AAAYA,S;;;;;;;;;;;AAAAA,8C;;;;;;;;;AAEZ;;;AAGe,YAAMC,MAAN,CAAa;;AAE1B;;AAEA,eAAOC,qBAAP,CAA6BC,EAA7B,EAAiC;AAC/B,cAAI,CAAC,KAAKC,oBAAV,EAAgC;AAChC,eAAKA,oBAAL,CAA0BC,MAA1B,CAAiCF,EAAjC;AACD;;AAED,eAAOG,mBAAP,CAA2BH,EAA3B,EAA+B;AAC7B,cAAI,CAAC,KAAKC,oBAAV,EAAgC;AAC9B,iBAAKA,oBAAL,GAA4B,IAAIG,GAAJ,EAA5B;AACD;AACD,eAAKH,oBAAL,CAA0BI,GAA1B,CAA8BL,EAA9B;AACD;;AAED;AACA,eAAOM,cAAP,CAAsBC,GAAtB,EAA2BC,IAA3B,EAAiCC,GAAjC,EAAsCT,EAAtC,EAA0C;;AAExC,cAAI,KAAKC,oBAAT,EAA+B;AAC7B,iBAAKA,oBAAL,CAA0BS,OAA1B,CAAkCC,QAAQ;AACxCA,mBAAKJ,GAAL,EAAUC,IAAV,EAAgBC,GAAhB,EAAqBT,EAArB;AACD,aAFD;AAGD;AAEF;;AAED;AACA,eAAOY,oBAAP,CAA4BZ,EAA5B,EAAgC;AAC9B,cAAI,CAAC,KAAKa,mBAAV,EAA+B;AAC/B,eAAKA,mBAAL,CAAyBX,MAAzB,CAAgCF,EAAhC;AACD;;AAED,eAAOc,kBAAP,CAA0Bd,EAA1B,EAA8B;AAC5B,cAAI,CAAC,KAAKa,mBAAV,EAA+B;AAC7B,iBAAKA,mBAAL,GAA2B,IAAIT,GAAJ,EAA3B;AACD;AACD,eAAKS,mBAAL,CAAyBR,GAAzB,CAA6BL,EAA7B;AACD;;AAED,eAAOe,aAAP,CAAqBR,GAArB,EAA0BC,IAA1B,EAAgCC,GAAhC,EAAqCT,EAArC,EAAyC;AACvC,cAAI,KAAKa,mBAAT,EAA8B;AAC5B,iBAAKA,mBAAL,CAAyBH,OAAzB,CAAiCC,QAAQ;AACvCA,mBAAKJ,GAAL,EAAUC,IAAV,EAAgBC,GAAhB,EAAqBT,EAArB;AACD,aAFD;AAGD;AACF;;AAED,eAAOgB,YAAP,GAAsB;AACpB;AACA,eAAKC,iBAAL;AACD;AACH;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEE,eAAOA,iBAAP,GAA2B;;AAEzB,cAAI,CAACC,OAAOC,qBAAZ,EAAmC;AACjCD,mBAAOC,qBAAP,GAA+B,IAAIC,OAAJ,EAA/B;AACD;AACD,cAAIC,QAAQH,OAAOC,qBAAnB;;AAGA,cAAI,CAACD,OAAOI,6BAAZ,EAA2C;AACzCJ,mBAAOI,6BAAP,GAAuCC,YAAYC,SAAZ,CAAsBC,mBAA7D;AACD;AACD,cAAI,CAACP,OAAOQ,0BAAZ,EAAwC;AACtCR,mBAAOQ,0BAAP,GAAoCH,YAAYC,SAAZ,CAAsBG,gBAA1D;AACD;;AAEDJ,sBAAYC,SAAZ,CAAsBC,mBAAtB,GAA4C,UAASjB,IAAT,EAAeR,EAAf,EAAmB,GAAG4B,IAAtB,EAA4B;AACtE,gBAAIC,YAAYR,MAAMS,GAAN,CAAU9B,EAAV,CAAc;AAAd,aAAhB,CACA,OAAOkB,OAAOI,6BAAP,CAAqCS,KAArC,CAA2C,IAA3C,EAAiD,CAACvB,IAAD,EAAOqB,SAAP,EAAkB,GAAGD,IAArB,CAAjD,CAAP;AACD,WAHD;;AAKAL,sBAAYC,SAAZ,CAAsBG,gBAAtB,GAAyC,UAASnB,IAAT,EAAeR,EAAf,EAAmB,GAAG4B,IAAtB,EAA4B;AACjE;AACA,gBAAII,OAAOX,MAAMS,GAAN,CAAU9B,EAAV,KAAkB,UAAS,GAAGiC,IAAZ,EAAkB;;AAE7C;AACA,kBAAI;AACF,oBAAI,CAACC,WAAWC,WAAhB,EAA6B;AAC3B,sBAAI;AACFD,+BAAWC,WAAX,GAAyB,IAAzB;AACAD,+BAAW5B,cAAX,CAA0B,IAA1B,EAAgCE,IAAhC,EAAsCyB,KAAK,CAAL,CAAtC,EAA+CjC,EAA/C;AACD,mBAHD,SAGU;AACRkC,+BAAWC,WAAX,GAAyB,KAAzB;AACD;AACF;AACF,eATD,CASE,OAAMC,CAAN,EAAS;AACTC,wBAAQC,KAAR,CAAcF,CAAd;AACD;AACD,kBAAIG,SAASvC,GAAG+B,KAAH,CAAS,IAAT,EAAeE,IAAf,CAAb;AACA,kBAAI;AACF,oBAAI,CAACC,WAAWC,WAAhB,EAA6B;AAC3B,sBAAI;AACFD,+BAAWC,WAAX,GAAyB,IAAzB;AACAD,+BAAWnB,aAAX,CAAyB,IAAzB,EAA+BP,IAA/B,EAAqCyB,KAAK,CAAL,CAArC,EAA8CjC,EAA9C;AACD,mBAHD,SAGU;AACRkC,+BAAWC,WAAX,GAAyB,KAAzB;AACD;AACF;AACF,eATD,CASE,OAAMC,CAAN,EAAS;AACTC,wBAAQC,KAAR,CAAcF,CAAd;AACD;AACD,qBAAOG,MAAP;AACD,aA7BD;AA8BAlB,kBAAMmB,GAAN,CAAUxC,EAAV,EAAcgC,IAAd;AACA,mBAAOd,OAAOQ,0BAAP,CAAkCK,KAAlC,CAAwC,IAAxC,EAA8C,CAACvB,IAAD,EAAOwB,IAAP,EAAa,GAAGJ,IAAhB,CAA9C,CAAP;AACH,WAlCD;AAmCD;AA/IyB;;yBAAP9B,M;;;;;;;;6BAAAA,uC;;;;;;;;AAkJrBoB,aAAOgB,UAAP,GAAoBpC,MAApB","file":"events.js","sourcesContent":["import * as cop  from 'src/client/ContextJS/src/contextjs.js'\n\n// var beforeEvent = new WeakMap()\n\n\nexport default class Events {\n  \n  /* before */\n    \n  static disconnectBeforeEvent(cb) {\n    if (!this.beforeEventCallbacks) return\n    this.beforeEventCallbacks.delete(cb)\n  }\n  \n  static registerBeforeEvent(cb) {\n    if (!this.beforeEventCallbacks) {\n      this.beforeEventCallbacks = new Set()\n    }  \n    this.beforeEventCallbacks.add(cb)\n  }\n  \n  // before and after are easier to use, but not so powerful without the additional Map\n  static logBeforeEvent(obj, type, evt, cb) {\n    \n    if (this.beforeEventCallbacks) {\n      this.beforeEventCallbacks.forEach(eaCb => {\n        eaCb(obj, type, evt, cb)\n      })\n    }\n    \n  }\n  \n  /* after */\n  static disconnectAfterEvent(cb) {\n    if (!this.afterEventCallbacks) return\n    this.afterEventCallbacks.delete(cb)\n  }\n  \n  static registerAfterEvent(cb) {\n    if (!this.afterEventCallbacks) {\n      this.afterEventCallbacks = new Set()\n    }  \n    this.afterEventCallbacks.add(cb)\n  }\n\n  static logAfterEvent(obj, type, evt, cb) {\n    if (this.afterEventCallbacks) {\n      this.afterEventCallbacks.forEach(eaCb => {\n        eaCb(obj, type, evt, cb)\n      })\n    }\n  }\n\n  static installHooks() {\n    // this.installHooksContextJS()\n    this.installHooksPlain()\n  }\n//   // Alternative Implementation using Contetjs \n//   static installHooksContextJS() {\n  \n//     if (!window.__Events_callbackbMap) {\n//       window.__Events_callbackbMap = new WeakMap()\n//     }\n//     var cbMap = window.__Events_callbackbMap\n\n//     var layer = cop.layer(window, \"EventHookLayer\")\n//     layer.refineClass(HTMLElement, {\n    \n//     removeEventListener(type, cb, ...rest) {\n//       var wrappedCB = cbMap.get(cb) // we have to keep the illusion\n//       return cop.proceed(type, wrappedCB || cb, ...rest)\n//     },\n    \n//     addEventListener(type, cb, ...rest) {\n//         // we cannot just wrapp a callback cb, because callbacks are also used in removeEventListener...\n//         var func = cbMap.get(cb) || (function(...args) {\n//           cop.withoutLayers([layer], () => {\n//             EventHooks.logBeforeEvent(this, type, args[0], cb)\n//           })\n//           var result = cb.apply(this, args)\n//           cop.withoutLayers([layer], () => {\n//             EventHooks.logAfterEvent(this, type, args[0], cb)\n//           })\n//           return result\n//         })\n//         cbMap.set(cb, func)\n//         return cop.proceed(type, func, ...rest);\n//       }\n//     })\n    \n//     layer.beGlobal()\n//   }\n\n  static installHooksPlain() {\n  \n    if (!window.__Events_callbackbMap) {\n      window.__Events_callbackbMap = new WeakMap()\n    }\n    var cbMap = window.__Events_callbackbMap\n\n    \n    if (!window.__originalRemoveEventListener) {\n      window.__originalRemoveEventListener = HTMLElement.prototype.removeEventListener\n    }\n    if (!window.__originalAddEventListener) {\n      window.__originalAddEventListener = HTMLElement.prototype.addEventListener\n    }\n \n    HTMLElement.prototype.removeEventListener = function(type, cb, ...rest) {\n      var wrappedCB = cbMap.get(cb) // we have to keep the illusion\n      return window.__originalRemoveEventListener.apply(this, [type, wrappedCB, ...rest])\n    }\n    \n    HTMLElement.prototype.addEventListener = function(type, cb, ...rest) {\n        // we cannot just wrapp a callback cb, because callbacks are also used in removeEventListener...\n        var func = cbMap.get(cb) || (function(...args) {\n          \n          // this becomes dangerous... without COP, we need a global flag\n          try {\n            if (!EventHooks.__isLogging) {\n              try {\n                EventHooks.__isLogging = true\n                EventHooks.logBeforeEvent(this, type, args[0], cb)\n              } finally {\n                EventHooks.__isLogging = false\n              }\n            }            \n          } catch(e) {\n            console.error(e)\n          }\n          var result = cb.apply(this, args)\n          try {\n            if (!EventHooks.__isLogging) {\n              try {\n                EventHooks.__isLogging = true\n                EventHooks.logAfterEvent(this, type, args[0], cb)\n              } finally {\n                EventHooks.__isLogging = false\n              }\n            }            \n          } catch(e) {\n            console.error(e)\n          }\n          return result\n        })\n        cbMap.set(cb, func)\n        return window.__originalAddEventListener.apply(this, [type, func, ...rest])\n    }\n  }\n}\n\nwindow.EventHooks = Events\n\n\n\n"]}