!function(t,e){"object"==typeof exports&&"undefined"!=typeof module?e(exports,require("brolog"),require("graphql-tag"),require("rxjs"),require("rxjs/operators"),require("@chatie/graphql"),require("state-switch"),require("@angular/core"),require("auth-angular")):"function"==typeof define&&define.amd?define("@chatie/db",["exports","brolog","graphql-tag","rxjs","rxjs/operators","@chatie/graphql","state-switch","@angular/core","auth-angular"],e):e((t.chatie=t.chatie||{},t.chatie.db={}),null,null,t.rxjs,t.rxjs.operators,null,null,t.ng.core,null)}(this,function(t,s,e,o,a,i,r,u,n){"use strict";e=e&&e.hasOwnProperty("default")?e["default"]:e,Symbol.asyncIterator||(Symbol.asyncIterator=Symbol["for"]("Symbol.asyncIterator"));var l=require("../package.json").version||"unknown",c=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(t,e){t.__proto__=e}||function(t,e){for(var n in e)e.hasOwnProperty(n)&&(t[n]=e[n])};function d(t,e){function n(){this.constructor=t}c(t,e),t.prototype=null===e?Object.create(e):(n.prototype=e.prototype,new n)}var p=Object.assign||function(t){for(var e,n=1,o=arguments.length;n<o;n++)for(var r in e=arguments[n])Object.prototype.hasOwnProperty.call(e,r)&&(t[r]=e[r]);return t};function h(e,s,a,u){return new(a||(a=Promise))(function(t,n){function o(t){try{i(u.next(t))}catch(e){n(e)}}function r(t){try{i(u["throw"](t))}catch(e){n(e)}}function i(e){e.done?t(e.value):new a(function(t){t(e.value)}).then(o,r)}i((u=u.apply(e,s||[])).next())})}function f(n,o){var r,i,s,t,a={label:0,sent:function(){if(1&s[0])throw s[1];return s[1]},trys:[],ops:[]};return t={next:e(0),"throw":e(1),"return":e(2)},"function"==typeof Symbol&&(t[Symbol.iterator]=function(){return this}),t;function e(e){return function(t){return function(t){if(r)throw new TypeError("Generator is already executing.");for(;a;)try{if(r=1,i&&(s=i[2&t[0]?"return":t[0]?"throw":"next"])&&!(s=s.call(i,t[1])).done)return s;switch(i=0,s&&(t=[0,s.value]),t[0]){case 0:case 1:s=t;break;case 4:return a.label++,{value:t[1],done:!1};case 5:a.label++,i=t[1],t=[0];continue;case 7:t=a.ops.pop(),a.trys.pop();continue;default:if(!(s=0<(s=a.trys).length&&s[s.length-1])&&(6===t[0]||2===t[0])){a=0;continue}if(3===t[0]&&(!s||t[1]>s[0]&&t[1]<s[3])){a.label=t[1];break}if(6===t[0]&&a.label<s[1]){a.label=s[1],s=t;break}if(s&&a.label<s[2]){a.label=s[2],a.ops.push(t);break}s[2]&&a.ops.pop(),a.trys.pop();continue}t=o.call(n,a)}catch(e){t=[6,e],i=0}finally{r=s=0}if(5&t[0])throw t[1];return{value:t[0]?t[1]:void 0,done:!0}}([e,t])}}}function b(t,e){var n="function"==typeof Symbol&&t[Symbol.iterator];if(!n)return t;var o,r,i=n.call(t),s=[];try{for(;(void 0===e||0<e--)&&!(o=i.next()).done;)s.push(o.value)}catch(a){r={error:a}}finally{try{o&&!o.done&&(n=i["return"])&&n.call(i)}finally{if(r)throw r.error}}return s}function y(t,e){return Object.defineProperty?Object.defineProperty(t,"raw",{value:e}):t.raw=e,t}var m,g,v,w,S,$,D,k,B,H,I,E,U,N=e(m||(m=y(["\n  query CurrentUser{\n    user {\n      email,\n      id,\n      name,\n      login,\n    }\n  }\n"],["\n  query CurrentUser{\n    user {\n      email,\n      id,\n      name,\n      login,\n    }\n  }\n"]))),O=function(){function t(t){void 0===t&&(t={}),this.log=t.log||s.log,this.log.verbose("Db","constructor({token=%s, endpoints=%s})",t.token||"",JSON.stringify(t.endpoints)||""),this.endpoints=t.endpoints||i.ENDPOINTS,this.token=t.token||"",this.currentUser$=new o.BehaviorSubject(undefined),this.currentUser=this.currentUser$.asObservable().pipe(a.distinctUntilChanged()),this.apollo$=new o.BehaviorSubject(undefined),this.apollo=this.apollo$.asObservable().pipe(a.distinctUntilChanged())}return t.prototype.nextApollo=function(r){return void 0===r&&(r=!0),h(this,void 0,void 0,function(){var e,n,o;return f(this,function(t){switch(t.label){case 0:return this.log.verbose("Db","nextApollo(available=%s)",r),[4,this.apollo.pipe(a.first()).toPromise()];case 1:return e=t.sent(),this.log.silly("Db","nextApollo() oldApollo=%s",typeof e),r?[4,i.makeApolloClient(this.token,this.endpoints)]:[3,4];case 2:return n=t.sent(),this.apollo$.next(n),[4,this.getCurrentUser(n)];case 3:return o=t.sent(),this.currentUser$.next(o),[3,5];case 4:this.currentUser$.next(undefined),this.apollo$.next(undefined),t.label=5;case 5:if(!e)return[3,7];if(!e.wsClose)throw new Error("no wsClose!");return[4,e.wsClose()];case 6:t.sent(),t.label=7;case 7:return[2]}})})},t.prototype.setToken=function(t){this.log.verbose("Db","setToken(token=%s)",t),this.token!==t?(this.log.silly("Db","setToken() old token=%s",this.token||'""'),this.token=t):this.log.info("Db","setToken() got the same token as before")},t.prototype.setEndpoints=function(t){this.log.verbose("Db","setEndpoints(endpoints=%s)",JSON.stringify(t));var e=JSON.stringify(this.endpoints),n=JSON.stringify(t);e!==n?(this.log.silly("Db","setEndpoints() endpoints changed from %s to %s",e,n),this.endpoints=t):this.log.info("Db","setEndpoints() got the same endpoints as before")},t.prototype.open=function(){return h(this,void 0,void 0,function(){return f(this,function(t){switch(t.label){case 0:return this.log.verbose("Db","open()"),[4,this.nextApollo()];case 1:return t.sent(),[2]}})})},t.prototype.close=function(){return h(this,void 0,void 0,function(){return f(this,function(t){switch(t.label){case 0:return this.log.verbose("Db","close()"),[4,this.nextApollo(!1)];case 1:return t.sent(),[2]}})})},t.prototype.getCurrentUser=function(n){return h(this,void 0,void 0,function(){var e;return f(this,function(t){switch(t.label){case 0:if(this.log.verbose("Db","currentUser()"),!n)throw this.log.error("Db","currentUser() no apollo defined!"),new Error("no current user in Db");return[4,n.query({query:N}).then(function(t){return t.data.user})];case 1:if(!(e=t.sent()))throw new Error("cant get current user!");return s.log.silly("Db","currentUser(id=%s, email=%s, name=%s)",e.id,e.email,e.name),[2,e]}})})},t}(),F="CREATED",q="DELETED",x="UPDATED",T="CREATED",A="DELETED",P="UPDATED",j=function(){function t(t,e){var n=this;this.db=t,this.settings=e,this.log=t.log,this.log.verbose("Store","constructor()"),this.itemList$=new o.BehaviorSubject([]),this.itemList=this.itemList$.asObservable().pipe(a.distinctUntilChanged()),this.state=new r.StateSwitch("Store",this.log),this.db.apollo.subscribe(function(t){return n.refresh(t)})}return t.prototype.open=function(){return h(this,void 0,void 0,function(){var e;return f(this,function(t){if(this.log.verbose("Store","open()"),!this.settings)throw new Error("Store.open() need `this.settings` to be set first!");if(!this.apollo)throw new Error("Store.open() apollo not available!");return this.state.on("pending"),e=this.apollo.watchQuery({query:this.settings.gqlQueryAll}),this.initSubscribeToMore(e),this.itemListSubscription=this.initSubscription(e),[2]})})},t.prototype.refresh=function(e){return h(this,void 0,void 0,function(){return f(this,function(t){switch(t.label){case 0:return this.log.verbose("Store","refresh(%s)",e&&e.constructor.name),this.apollo?[4,this.close()]:[3,2];case 1:t.sent(),t.label=2;case 2:return(this.apollo=e)?[4,this.open()]:[3,4];case 3:t.sent(),t.label=4;case 4:return[2]}})})},t.prototype.close=function(){return h(this,void 0,void 0,function(){return f(this,function(t){return this.log.verbose("Store","close()"),this.state.off("pending"),this.itemListSubscription&&this.itemListSubscription.unsubscribe(),this.state.off(!0),[2]})})},t.prototype.initSubscribeToMore=function(t){var u=this;this.log.verbose("Store","initSubscribeToMore(itemQuery)"),t.subscribeToMore({document:this.settings.gqlSubscribe,updateQuery:function(t,e){var n=e.subscriptionData.data,o=u.settings.dataKey;if(!(n&&o in n))return t;var r=n[o];u.log.silly("Store","init() subscribeToMore() updateQuery() prev=%s",JSON.stringify(t)),u.log.silly("Store","init() subscribeToMore() updateQuery() data=%s",JSON.stringify(n));var i=r.node,s=r.previousValues,a=p({},t);return a[o]=u.mutationReducer(a[o],{type:r.mutation,node:i||s}),a},onError:function(t){u.log.warn("Store","initSubscribeToMore() onError() %s",JSON.stringify(t))}})},t.prototype.initSubscription=function(t){var n=this;return this.log.verbose("Store","initSubscription(itemQuery)"),t.subscribe(function(t){var e=t.data;n.log.silly("Store","initSubscription() itemQuery.subscribe() data[dataKey].length=%d",e[n.settings.dataKey].length),n.itemList$.next(function(){for(var t=[],e=0;e<arguments.length;e++)t=t.concat(b(arguments[e]));return t}(e[n.settings.dataKey])),n.state.on(!0)})},t.prototype.mutationReducer=function(t,e){switch(void 0===t&&(t=[]),this.log.verbose("Store","mutationReducer(state.length=%d, action.type=%s)",t.length,e.type),e.type){case T:t.push(e.node);break;case P:for(var n=t.length;n--;)if(t[n].id===e.node.id){t[n]=e.node;break}break;case A:for(n=t.length;n--;)if(t[n].id===e.node.id){t.splice(n,1);break}break;default:throw new Error("unknown action.type:"+e.type)}return t},t.prototype.mutationUpdateFnFactory=function(a,u){var l=this;return this.log.verbose("Store","mutationUpdateFnFactory(mutationType=%s, mutationDataKey=%s)",a,u),function(t,e){var n=e.data;if(l.log.verbose("Store","mutationUpdateFnFactory(mutationType=%s, mutationDataKey=%s) (proxy, {data})",a,u),n){var o=null;try{o=t.readQuery({query:l.settings.gqlQueryAll})}catch(s){l.log.verbose("Store","mutationUpdateFnFactory(mutationType=%s, mutationDataKey=%s) (proxy, {data}), %s",a,u,"call proxy.readQuery() got exceptoin. it mostly like there is no query had been executed before.")}if(o){var r=n[u],i=p({},o);i[l.settings.dataKey]=l.mutationReducer(i[l.settings.dataKey],{type:a,node:r}),t.writeQuery({query:l.settings.gqlQueryAll,data:i})}else l.log.verbose("Store","mutationUpdateFnFactory(mutationType=%s, mutationDataKey=%s) (proxy, {data})proxy.readQuery() return empty???",a,u)}else l.log.verbose("Store","mutationUpdateFnFactory() (proxy, {data}) data empty???")}},t.prototype.read=function(o){return h(this,void 0,void 0,function(){var e,n;return f(this,function(t){switch(t.label){case 0:return this.log.verbose("Store","read(id=%s)",o),[4,this.state.ready()];case 1:return t.sent(),[4,this.itemList.pipe(a.first()).toPromise()];case 2:if(e=t.sent(),1!==(n=e.filter(function(t){return t.id===o})).length)throw new Error("Store.read(id="+o+") not found!");return[2,n[0]]}})})},t}(),C=e(g||(g=y(["\n  fragment Botie on Botie {\n    id,\n    token,\n    name,\n    note,\n    status,\n    owner {\n      email,\n      id,\n      name,\n    }\n  }\n"],["\n  fragment Botie on Botie {\n    id,\n    token,\n    name,\n    note,\n    status,\n    owner {\n      email,\n      id,\n      name,\n    }\n  }\n"]))),K=e(v||(v=y(["\n  query AllBoties {\n    allBoties {\n      ...Botie\n    }\n  }\n\n  ","\n"],["\n  query AllBoties {\n    allBoties {\n      ...Botie\n    }\n  }\n\n  ","\n"])),C),Q=e(w||(w=y(["\n  subscription SubscribeBotie{\n    Botie {\n      mutation,\n      node {\n        ...Botie,\n      },\n      previousValues {\n        id,\n      },\n    }\n  }\n\n  ","\n"],["\n  subscription SubscribeBotie{\n    Botie {\n      mutation,\n      node {\n        ...Botie,\n      },\n      previousValues {\n        id,\n      },\n    }\n  }\n\n  ","\n"])),C),M=e(S||(S=y(["\n  mutation DeleteBotie($id: ID!) {\n    deleteBotie(id: $id) {\n      id,\n    }\n  }\n"],["\n  mutation DeleteBotie($id: ID!) {\n    deleteBotie(id: $id) {\n      id,\n    }\n  }\n"]))),_=e($||($=y(["\n  mutation CreateBotie(\n    $token:     String!\n    $name:    String!,\n    $ownerId: ID!,\n  ) {\n    createBotie(\n      token:      $token,\n      name:     $name,\n      ownerId:  $ownerId,\n    ) {\n      ...Botie,\n    }\n  }\n\n  ","\n"],["\n  mutation CreateBotie(\n    $token:     String!\n    $name:    String!,\n    $ownerId: ID!,\n  ) {\n    createBotie(\n      token:      $token,\n      name:     $name,\n      ownerId:  $ownerId,\n    ) {\n      ...Botie,\n    }\n  }\n\n  ","\n"])),C),L=e(D||(D=y(["\n  mutation UpdateBotie(\n    $id: ID!,\n    $name: String,\n    $note: String,\n  ) {\n    updateBotie(\n      id:   $id,\n      name: $name,\n      note: $note,\n    ) {\n      ...Botie,\n    }\n  }\n\n  ","\n"],["\n  mutation UpdateBotie(\n    $id: ID!,\n    $name: String,\n    $note: String,\n  ) {\n    updateBotie(\n      id:   $id,\n      name: $name,\n      note: $note,\n    ) {\n      ...Botie,\n    }\n  }\n\n  ","\n"])),C),R=function(n){function t(t){var e=n.call(this,t,{gqlQueryAll:K,gqlSubscribe:Q,dataKey:"allBoties"})||this;return e.db=t,s.log.verbose("BotieStore","constructor()"),e}return d(t,n),t.prototype.create=function(i){return h(this,void 0,void 0,function(){var e,n,o,r;return f(this,function(t){switch(t.label){case 0:return s.log.verbose("BotieStore","create(newBotie{name:%s})",i.name),[4,this.state.ready()];case 1:return t.sent(),(e=i.ownerId)?[3,3]:[4,this.db.currentUser.pipe(a.first()).toPromise()];case 2:if(!(n=t.sent()))throw new Error("no currentUser");e=n.id,t.label=3;case 3:if(!e)throw new Error("no ownerId");return o={token:i.token,name:i.name,ownerId:e},[4,this.apollo.mutate({mutation:_,variables:o,update:this.mutationUpdateFnFactory(F,"createBotie")}).then(function(t){return t.data&&t.data.createBotie})];case 4:if(!(r=t.sent()))throw new Error("BotieStore.create() fail!");return[2,r]}})})},t.prototype["delete"]=function(o){return h(this,void 0,void 0,function(){var e,n;return f(this,function(t){switch(t.label){case 0:return s.log.verbose("BotieStore","delete(id=%s)",o),[4,this.state.ready()];case 1:return t.sent(),e={id:o},[4,this.apollo.mutate({mutation:M,variables:e,update:this.mutationUpdateFnFactory(q,"deleteBotie")}).then(function(t){return t.data&&t.data.deleteBotie})];case 2:if(!(n=t.sent()))throw new Error("BotieStore.delete(id="+o+") failed!");return[2,n]}})})},t.prototype.update=function(r,i){return h(this,void 0,void 0,function(){var e,n,o;return f(this,function(t){switch(t.label){case 0:return s.log.verbose("BotieStore","update(id=%s)",r),[4,this.state.ready()];case 1:return t.sent(),[4,this.read(r)];case 2:return e=t.sent(),n={id:r,name:i.name||e.name,note:i.note||e.note},[4,this.apollo.mutate({mutation:L,variables:n,update:this.mutationUpdateFnFactory(x,"updateBotie")}).then(function(t){return t.data&&t.data.updateBotie})];case 3:if(!(o=t.sent()))throw new Error("BotieStore.update() failed!");return[2,o]}})})},t.decorators=[{type:u.Injectable}],t.ctorParameters=function(){return[{type:O}]},t}(j),J=function(){function t(t){this.log=t,this.log.verbose("GiftieStore","constructor()")}return t.decorators=[{type:u.Injectable}],t.ctorParameters=function(){return[{type:s.Brolog}]},t}(),G=e(k||(k=y(["\n  fragment Hostie on Hostie {\n    id,\n    token,\n    name,\n    note,\n\n    status,\n    platform,\n\n    owner {\n      email,\n      id,\n      name,\n    }\n  }\n"],["\n  fragment Hostie on Hostie {\n    id,\n    token,\n    name,\n    note,\n\n    status,\n    platform,\n\n    owner {\n      email,\n      id,\n      name,\n    }\n  }\n"]))),V=e(B||(B=y(["\n  query AllHosties {\n    allHosties {\n      ...Hostie\n    }\n  }\n\n  ","\n"],["\n  query AllHosties {\n    allHosties {\n      ...Hostie\n    }\n  }\n\n  ","\n"])),G),W=e(H||(H=y(["\n  subscription SubscribeHostie{\n    Hostie {\n      mutation,\n      node {\n        ...Hostie,\n      },\n      previousValues {\n        id,\n        token,\n      },\n    }\n  }\n\n  ","\n"],["\n  subscription SubscribeHostie{\n    Hostie {\n      mutation,\n      node {\n        ...Hostie,\n      },\n      previousValues {\n        id,\n        token,\n      },\n    }\n  }\n\n  ","\n"])),G),X=e(I||(I=y(["\n  mutation DeleteHostie($id: ID!) {\n    deleteHostie(id: $id) {\n      id,\n    }\n  }\n"],["\n  mutation DeleteHostie($id: ID!) {\n    deleteHostie(id: $id) {\n      id,\n    }\n  }\n"]))),z=e(E||(E=y(["\n  mutation CreateHostie(\n    $token:   String!\n    $name:    String!,\n    $ownerId: ID!,\n  ) {\n    createHostie(\n      token:    $token,\n      name:     $name,\n      ownerId:  $ownerId,\n    ) {\n      ...Hostie,\n    }\n  }\n\n  ","\n"],["\n  mutation CreateHostie(\n    $token:   String!\n    $name:    String!,\n    $ownerId: ID!,\n  ) {\n    createHostie(\n      token:    $token,\n      name:     $name,\n      ownerId:  $ownerId,\n    ) {\n      ...Hostie,\n    }\n  }\n\n  ","\n"])),G),Y=e(U||(U=y(["\n  mutation UpdateHostie(\n    $id: ID!,\n    $name: String,\n    $note: String,\n  ) {\n    updateHostie(\n      id:   $id,\n      name: $name,\n      note: $note,\n    ) {\n      ...Hostie,\n    }\n  }\n\n  ","\n"],["\n  mutation UpdateHostie(\n    $id: ID!,\n    $name: String,\n    $note: String,\n  ) {\n    updateHostie(\n      id:   $id,\n      name: $name,\n      note: $note,\n    ) {\n      ...Hostie,\n    }\n  }\n\n  ","\n"])),G),Z=function(n){function t(t){var e=n.call(this,t,{gqlQueryAll:V,gqlSubscribe:W,dataKey:"allHosties"})||this;return e.db=t,e.log.verbose("HostieStore","constructor()"),e}return d(t,n),t.prototype.create=function(s){return h(this,void 0,void 0,function(){var e,n,o,r,i;return f(this,function(t){switch(t.label){case 0:return this.log.verbose("HostieStore","create(newHostie=%s)",JSON.stringify(s)),[4,this.state.ready()];case 1:return t.sent(),s.ownerId?[3,3]:[4,this.db.currentUser.pipe(a.first()).toPromise()];case 2:if(!(e=t.sent()))throw new Error("no currentUser");s.ownerId=e.id,t.label=3;case 3:return n={token:s.token,name:s.name,ownerId:s.ownerId},o=z,r=this.mutationUpdateFnFactory(T,"createHostie"),this.log.silly("HostieStore","create() apollo.mutate()"),[4,this.apollo.mutate({mutation:o,variables:n,update:r}).then(function(t){return t.data&&t.data.createHostie})];case 4:if(i=t.sent(),this.log.silly("HostieStore","create() apollo.mutate() done"),!i)throw new Error("HostieStore.create() fail!");return this.log.silly("HostieStore","create()=%s",JSON.stringify(i)),[2,i]}})})},t.prototype["delete"]=function(i){return h(this,void 0,void 0,function(){var e,n,o,r;return f(this,function(t){switch(t.label){case 0:return this.log.verbose("HostieStore","delete(id=%s)",i),[4,this.state.ready()];case 1:return t.sent(),e={id:i},n=X,o=this.mutationUpdateFnFactory(A,"deleteHostie"),[4,this.apollo.mutate({mutation:n,variables:e,update:o}).then(function(t){return t.data&&t.data.deleteHostie})];case 2:if(!(r=t.sent()))throw new Error("HostieStore.delete(id="+i+") failed!");return[2,r]}})})},t.prototype.update=function(s,a){return h(this,void 0,void 0,function(){var e,n,o,r,i;return f(this,function(t){switch(t.label){case 0:return this.log.verbose("HostieStore","update(id=%s)",s),[4,this.state.ready()];case 1:return t.sent(),[4,this.read(s)];case 2:return e=t.sent(),n={id:s,name:a.name||e.name,note:a.note||e.note},o=Y,r=this.mutationUpdateFnFactory(P,"updateHostie"),[4,this.apollo.mutate({mutation:o,variables:n,update:r}).then(function(t){return t.data&&t.data.updateHostie})];case 3:if(!(i=t.sent()))throw new Error("HostieStore.update() failed!");return[2,i]}})})},t.decorators=[{type:u.Injectable}],t.ctorParameters=function(){return[{type:O}]},t}(j),tt=require("jwt-decode");function et(t,n){n.verbose("DbModule","dbFactory()");var o=new O({log:n});return t.idToken.subscribe(function(t){if(n.verbose("DbModule","dbFactory() auth.idToken.subscript(token=%s)",t),t){var e=tt(t)["https://graph.cool/token"];n.silly("DbModule","auth.idToken.subscript() graphCoolToken=%s)",e),e?(o.setToken(e),o.open()):o.close()}else o.close()}),o}var nt=function(){function t(){}return t.forRoot=function(){return{ngModule:t,providers:[{provide:O,useFactory:et,deps:[n.Auth,s.Brolog]},R,J,Z]}},t.decorators=[{type:u.NgModule,args:[{id:"@chatie/db"}]}],t}();t.log=s.log,t.VERSION=l,t.Db=O,t.DbModule=nt,t.Status={OFF:"OFF",ON:"ON",PENDING_OFF:"PENDING_OFF",PENDING_ON:"PENDING_ON"},t.Platform={DARWIN:"DARWIN",DOCKER:"DOCKER",LINUX:"LINUX",UNKNOWN:"UNKNOWN",WIN32:"WIN32"},t.BotieStore=R,t.GiftieStore=J,t.HostieStore=Z,t.ɵa=et,t.ɵb=j,Object.defineProperty(t,"__esModule",{value:!0})});
//# sourceMappingURL=chatie-db.umd.min.js.map