const i=require("hyperbee"),{SchemaBuilder:e}=require("@holepunchto/keet-core-schemas"),{isFeatureSupported:t}=require("@holepunchto/keet-core-api"),a=require("./lib/internal"),s=require("./lib/plugins"),n=require("./lib/chat"),r=require("./lib/mailbox"),p=require("./lib/private-profile"),o=require("./lib/reactions"),h=require("./lib/invitations"),l=require("./lib/devices"),c=require("./lib/members"),u=require("./lib/config");class w{constructor(i,t,{tx:w,primary:y}={}){this.base=i,this.bee=t,this.core=t.core,this.isApplyView=!!y,this.internal=new a(this),this.plugins=new s(this);const b=new e({view:this,tx:w});this.collections=b.createCollections(),this.indexes=b.createIndexes(),this.dex=b.dex,this.chat=new n(this),this.mailbox=new r(this),this.privateProfile=new p(this),this.reactions=new o(this),this.devices=new l(this),this.invitations=new h(this),this.members=new c(this),this.config=new u(this),this._initialize(),this._primaryView=y,this._applyView=null}_initialize(){this.internal.initialize(),this.plugins.initialize(),this.chat.initialize(),this.mailbox.initialize(),this.privateProfile.initialize(),this.reactions.initialize(),this.devices.initialize(),this.invitations.initialize(),this.members.initialize(),this.config.initialize()}_shouldSkipOperation(i){switch(i.type){case 24:case 34:case 35:case 36:case 37:return!0;default:return!1}}async isFeatureSupported(i){const e=await this.internal.getCodeVersion();return t(e,i)}async isUnsupportedFeature(i){return!await this.isFeatureSupported(i)}async applyOperation(i,e){if(!this.isApplyView)throw new Error("Only the apply view should handle operations");this._shouldSkipOperation(i)||(a.Operations.has(i.type)&&await this.internal.autobaseApply(i,e),l.Operations.has(i.type)&&await this.devices.autobaseApply(i,e),h.Operations.has(i.type)&&await this.invitations.autobaseApply(i,e),c.Operations.has(i.type)&&await this.members.autobaseApply(i,e),u.Operations.has(i.type)&&await this.config.autobaseApply(i,e),n.Operations.has(i.type)&&await this.chat.autobaseApply(i,e),r.Operations.has(i.type)&&await this.mailbox.autobaseApply(i,e),p.Operations.has(i.type)&&await this.privateProfile.autobaseApply(i,e),o.Operations.has(i.type)&&await this.reactions.autobaseApply(i,e),s.Operations.has(i.type)&&await this.plugins.autobaseApply(i,e))}async apply(i){if(this.isApplyView)throw new Error("An apply view cannot be created from an apply view");const e=await this.createApplyView();await e.plugins.load();for(const t of i){const i={key:t.from.key,seq:t.length-1},{timestamp:a,ops:s}=t.value,n={id:i,timestamp:a};for(const i of s)await e.applyOperation(i,n)}await e.commit()}async createApplyView(){if(this._applyView)throw new Error("Can only have one apply view active at a time");const i=await this.dex.writeTransaction({update:!1});return this._applyView=new this.constructor(this.base,i.bee,{tx:i,primary:this}),this._applyView}async commit(){if(!this.isApplyView)throw new Error("Can only commit an apply view");await this.dex.commit(),this._primaryView._applyView=null}close(){return this.bee.close()}}module.exports={KeetView:w,autobaseApply:function(i,e){return e.apply(i)},autobaseOpen:function(e,t){const a=e.get("keet"),s=new i(a,{alwaysDuplicate:!1,extension:!1});return new w(t,s)},autobaseClose:function(i){return i.close()}};