UNPKG

92.7 kBPlain TextView Raw
1{"code":"function defineName$__(cls,name){\n\tObject.defineProperty(cls,\"name\",{value:name,configurable:true});\n};;\nfunction decorate$__(decorators,target,key,desc){\n\tvar c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;\n\tif (typeof Reflect === \"object\" && typeof Reflect.decorate === \"function\") r = Reflect.decorate(decorators, target, key, desc);\n\telse for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;\n\treturn c > 3 && r && Object.defineProperty(target, key, r), r;\n};;\nfunction extend$__(target,ext){\n\t// @ts-ignore\n\tconst descriptors = Object.getOwnPropertyDescriptors(ext);\n\tdelete descriptors.constructor;\n\tif(target.extend__ instanceof Function){\n\t\ttarget.extend__(descriptors,ext);\n\t} else {\n\t\t// @ts-ignore\n\t\tObject.defineProperties(target,descriptors);\n\t}\n\treturn target;\n};;\nfunction iter$__(a){ let v; return a ? ((v=a.toIterable) ? v.call(a) : a) : a; };;\nfunction inheritClass$__(cls){\n\tObject.getPrototypeOf(cls.prototype).constructor?.inherited?.(cls);\n};\nimport {αthenable as imba_αthenable, use_hooks as imba_use_hooks, hooks as imba_hooks, αbound as imba_αbound, αlazy as imba_αlazy} from 'imba';\n(imba_use_hooks());\nconst $__hooks__$ = Symbol.for('#__hooks__'), $__initor__$ = Symbol.for('#__initor__'), $__inited__$ = Symbol.for('#__inited__'), $__init__$ = Symbol.for('#__init__'), $__patch__$ = Symbol.for('#__patch__'), $handle$ = Symbol.for('#handle'), $downloading$ = Symbol.for('#downloading'), $context$ = Symbol.for('#context'), $inited$ = Symbol.for('#inited'), $analyze$ = Symbol.for('#analyze');\nvar $1 = Symbol(), $2 = Symbol(), $3 = Symbol();\n\n/*body*/\nimport {Component} from './component';\nimport {ValidationError} from './protocol';\nimport {now,WeakCache,MemoMap} from './utils';\nimport {Server as WebServer} from './server';\n\nimport nodeΞfetch from 'node-fetch';\nimport {AsyncLocalStorage} from 'async_hooks';\nimport {Publication} from './publication';\n\nimport nfs from 'fs';\nimport * as nfsp from 'fs/promises';\nimport np from 'path';\nimport pgjs from 'postgres';\n\nconst SharedPromises = {};\nlet asl = null;\n\nfunction augmentError(e){\n\t\n\tlet msg = e.message;\n\tlet m = msg.match(/^(\\w+Error)(\\:(\\w+))? (.+)/);\n\t\n\tif (m && m[1] == 'ValidationError') {\n\t\t\n\t\tlet json = {[m[3]]: m[4]};\n\t\te = new ValidationError(JSON.stringify(json));\n\t\te.stack = \"\";\n\t} else if (msg.includes(\"violates foreign key constraint\")) {\n\t\t\n\t\te = new OPForeignKeyError;\n\t};\n\t\n\treturn e;\n};\n\nclass OPBlobHandle {\n\t\n\t\n\tconstructor(blob){\n\t\t\n\t\tthis.src = blob.path;\n\t\tthis.blob = blob;\n\t\tthis.stat = nfs.statSync(this.src,{throwIfNoEntry: false});\n\t\t!this[$__initor__$] && this[$__hooks__$].inited(this);\n\t}\n\t\n\tasync setup(){\n\t\t\n\t\tthis.offset = 0;\n\t\tthis.file = await nfsp.open(this.src,'a+');\n\t\tthis.stat = await this.file.stat();\n\t\tthis.writestream = this.file.createWriteStream();\n\t\treturn true;\n\t}\n\t\n\tget byteLength(){\n\t\t\n\t\treturn this.offset;\n\t}\n\t\n\t/**\n\t@returns { Promise<BinaryChunk> }\n\t*/\n\tasync read(offset,length){\n\t\tvar self = this;\n\t\t\n\t\tawait this;\n\t\t\n\t\treturn new Promise(function(resolve) {\n\t\t\t\n\t\t\tif (length == null) {\n\t\t\t\t\n\t\t\t\tlength = self.byteLength - offset;\n\t\t\t};\n\t\t\t\n\t\t\tif ((offset + length) > self.byteLength) {\n\t\t\t\t\n\t\t\t\tnull;\n\t\t\t};\n\t\t\t\n\t\t\tlet buf = Buffer.alloc(length);\n\t\t\treturn self.file.read(buf,0,length,offset).then(function(out) {\n\t\t\t\t\n\t\t\t\tlet arr = new Uint8Array(out.buffer);\n\t\t\t\tlet res = new BinaryChunk(offset,arr);\n\t\t\t\treturn resolve(res);\n\t\t\t});\n\t\t});\n\t}\n\t\n\tasync patch(offset,data){\n\t\t\n\t\tawait this;\n\t\tawait this.file.sync();\n\t\tawait this.file.write(data,0,data.byteLength,offset);\n\t\treturn this;\n\t}\n\t\n\tasync append(data){\n\t\t\n\t\tawait this;\n\t\tawait this.file.sync();\n\t\tlet len = data.byteLength || data.length;\n\t\tlet res = await this.writestream.write(data);\n\t\t// let res = await file.write(data,0,len,offset)\n\t\tthis.offset += len;\n\t\treturn this;\n\t}\n\t\n\tteardown(){\n\t\t\n\t\tif (this.blob[$handle$] == this) { return this.blob[$handle$] = null };\n\t}\n\tstatic {\n\t\tthis.prototype[$__hooks__$] = imba_hooks;\n\t\tdefineName$__(this,'OPBlobHandle');decorate$__([imba_αthenable.bind([])],this.prototype,'setup',null);\n\t}\n}; globalThis.OPBlobHandle = OPBlobHandle;\n\nclass ΩOPBlob {\n\t\n\t\n\tget path(){\n\t\t\n\t\treturn (\"\" + (OP.LFS_DIR) + `/` + this.id);\n\t}\n\t\n\tget handle(){\n\t\t\n\t\treturn this[$handle$] ||= new OPBlobHandle(this);\n\t}\n\t\n\tget existsΦ(){\n\t\t\n\t\treturn nfs.existsSync(this.path);\n\t}\n\t\n\tget byteLength(){\n\t\t\n\t}\n\t\n\tloadFromUrl(url){\n\t\tvar self = this;\n\t\t\n\t\treturn this[$downloading$] ||= new Promise(async function(resolve) {\n\t\t\t\n\t\t\tconst response = (await nodeΞfetch(url)).body;\n\t\t\tlet stream = response.pipe(nfs.createWriteStream(self.path));\n\t\t\treturn stream.on('finish',function() {\n\t\t\t\t\n\t\t\t\t\n\t\t\t\tself[$downloading$] = null;\n\t\t\t\treturn resolve(true);\n\t\t\t});\n\t\t});\n\t}\n\t\n\tasync append(chunk,at = null){\n\t\t\n\t\treturn await this.handle.append(chunk);\n\t}\n\t\n\t/**\n\t@returns { Promise<BinaryChunk> }\n\t*/\n\tread(start = 0,length = null){\n\t\t\n\t\treturn this.handle.read(start,length);\n\t}\n\t\n\tpatch(){\n\t\t\n\t\treturn this;\n\t}\n\tstatic {\n\t\tdefineName$__(this,'OPBlob');}\n};\nextend$__(OPBlob.prototype,ΩOPBlob.prototype);\n;\n\n/*\nTODO Add automated way to update positions\nUPDATE _entity\nSET pos = subquery.row_number * 100000\nFROM (\n SELECT ROW_NUMBER() OVER (ORDER BY pos) AS row_number, id\n FROM _entity\n) AS subquery\nWHERE _entity.id = subquery.id;\n*/\n\n\n// should follow api from node FileHandle\n// should only have a single reference to a file on server\n// to allow cases where file is accessed at the same time as it is patched etc?\nclass LargeFileRef {\n\t\n\tconstructor(path,id){\n\t\t\n\t\tthis.path = path;\n\t\tthis.id = id;\n\t}\n\t\n\tread(buf){\n\t\t\n\t\treturn true;\n\t}\n\t\n\tget existsΦ(){\n\t\t\n\t\treturn nfs.existsSync(this.path);\n\t}\n\t\n\tget size(){\n\t\t\n\t\treturn nfs.statSync(this.path)?.size || 0;\n\t}\n\t\n\treadFile(options = {}){\n\t\t\n\t\treturn nfsp.readFile(this.path);\n\t}\n\t\n\tcreateReadStream(o = {}){\n\t\t\n\t\tconsole.log('createReadStream',this.path,o);\n\t\treturn nfs.createReadStream(this.path,o);\n\t}\n\t\n\t// Mostly here to make transitioning from old system easier\n\tloadFromUrl(url){\n\t\tvar self = this;\n\t\t\n\t\tlet key = (\"\" + this.path + `.download`);\n\t\t\n\t\treturn SharedPromises[key] ||= new Promise(async function(resolve) {\n\t\t\t\n\t\t\tconst response = (await nodeΞfetch(url)).body;\n\t\t\tlet stream = response.pipe(nfs.createWriteStream(self.path));\n\t\t\treturn stream.on('finish',function() {\n\t\t\t\tvar $4;\n\t\t\t\t\n\t\t\t\tconsole.log('done streaming');\n\t\t\t\t((($4 = SharedPromises[key]),delete SharedPromises[key], $4));\n\t\t\t\treturn resolve(true);\n\t\t\t});\n\t\t});\n\t}\n\tstatic {\n\t\tdefineName$__(this,'LargeFileRef');}\n};\n\nclass FileSystem {\n\t\n\t\n\tconstructor(path){\n\t\t\n\t\tthis.path = path || process.env.OP_LFS_DIR;\n\t}\n\t\n\tconfigure(options){\n\t\t\n\t\treturn this;\n\t}\n\t\n\tget baseURI(){\n\t\t\n\t\treturn (\"file://\" + this.path);\n\t}\n\t\n\tresolve(id){\n\t\t\n\t\treturn np.resolve(this.path,id);\n\t}\n\t\n\topen(id){\n\t\t\n\t\treturn new LargeFileRef(this.resolve(id),id);\n\t}\n\t\n\tcreateReadStream(id){\n\t\t\n\t\treturn nfs.createReadStream(this.resolve(id));\n\t}\n\t\n\treadFile(id){\n\t\t\n\t\treturn nfsp.readFile(this.resolve(id));\n\t}\n\tstatic {\n\t\tdefineName$__(this,'FileSystem');}\n};\n\nclass WAL extends Component {\n\t[$__patch__$]($$ = {},fields = true){\n\t\tvar $5;\n\t\tsuper[$__patch__$] && super[$__patch__$]($$,fields);\n\t\t($5 = $$.silent) !== undefined && (this.silent = $5);\n\t\t\n\t}\n\t[$__init__$]($$ = null,deep = true,fields = true){\n\t\tvar $6;\n\t\tdeep && super[$__init__$] && super[$__init__$](...arguments);\n\t\tthis.silent = ($$ && ($6 = $$.silent) !== undefined) ? ($6) : false;\n\t\t\n\t}\n\tconstructor(){\n\t\t\n\t\tsuper(...arguments);\n\t\tsuper[$__init__$] || this[$__init__$]();\n\t\t/**@type {number}*/ this.since;\n\t\t/**@type {any}*/ this.wal;\n\t\tthis.history = [];\n\t\tthis.init();\n\t\tthis[$__initor__$]===$1 && (this[$__hooks__$]&&this[$__hooks__$].inited(this),this[$__inited__$] && this[$__inited__$]());\n\t}\n\t\n\tinit(){\n\t\tvar self = this;\n\t\t\n\t\t// wait for OP itself - so that you can configure it?\n\t\treturn new Promise(function(resolve) {\n\t\t\t\n\t\t\tself.wal = pgjs(self.owner.pguri,{\n\t\t\t\tpublications: 'alltables',\n\t\t\t\tfetch_types: false\n\t\t\t});\n\t\t\t\n\t\t\t// wait for migration?!\n\t\t\treturn self.wal.subscribe('*',self.onevent.bind(self)).then(function(o) {\n\t\t\t\t\n\t\t\t\tself.unsubscribe = o.unsubscribe;\n\t\t\t\tself.since = OP.now;\n\t\t\t\treturn resolve(true);\n\t\t\t});\n\t\t});\n\t}\n\t\n\tteardown(){\n\t\t\n\t\tthis.stop();\n\t\tif (this.unsubscribe) { this.unsubscribe() };\n\t\treturn this.unsubscribe = null;\n\t}\n\t\n\tstop(){\n\t\t\n\t\tthis.stopped = true;\n\t\treturn this;\n\t}\n\t\n\tasync start(){\n\t\t\n\t\treturn await this;\n\t}\n\t\n\tflush(){\n\t\t\n\t\tlet rest = this.history.slice(0);\n\t\tthis.history = [];\n\t\treturn rest;\n\t}\n\t\n\tasync waitfor(id){\n\t\tvar self = this;\n\t\t\n\t\tawait this;\n\t\treturn new Promise(function(resolve) {\n\t\t\t\n\t\t\tconst cb = function(arg) { return resolve(arg || true); };\n\t\t\tlet timeout = setTimeout(function() {\n\t\t\t\t\n\t\t\t\tself.un((\"wal:\" + id),cb);\n\t\t\t\treturn resolve(false);\n\t\t\t},50);\n\t\t\treturn self.once((\"wal:\" + id),cb);\n\t\t});\n\t}\n\t\n\tonevent(row,details){\n\t\t\n\t\tthis.history.push(row);\n\t\t\n\t\tlet tbl = details.relation.table;\n\t\tlet cmd = details.command;\n\t\t\n\t\tlet type = OP.mapping[tbl];\n\t\tlet id = row.id;\n\t\t\n\t\t// if job was inserted\n\t\tif ((type?.prototype instanceof OPJob) && cmd == 'insert') {\n\t\t\t\n\t\t\tfor (let worker of iter$__(OP.workers)){\n\t\t\t\t\n\t\t\t\tif (worker.idleΦ) {\n\t\t\t\t\t\n\t\t\t\t\tworker.check();break;\n\t\t\t\t};\n\t\t\t};\n\t\t};\n\t\t\n\t\t// internal op ids for tracking foreign keys that were _previously_ set\n\t\tif (!(id)) { return };\n\t\tif (this.silent) { return };\n\t\t\n\t\t// TODO should not really only look in the walcache,\n\t\t// but rather in the shared cache for all objects\n\t\tlet prev = OP.$cloud[id];\n\t\tlet rich = OP.$rich[id];\n\t\t\n\t\t// already been processed by op\n\t\tif (prev && prev._rev == row._rev) {\n\t\t\t\n\t\t\t// change event should still happen, or?\n\t\t\treturn;\n\t\t};\n\t\t\n\t\tlet sanitized = {};\n\t\t\n\t\tfor (let $7 = 0, $8 = Object.keys(row), $9 = $8.length, k, v; $7 < $9; $7++){\n\t\t\tk = $8[$7];v = row[k];\n\t\t\tif (v != null) { sanitized[k] = v };\n\t\t};\n\t\t\n\t\tOP.$patch(sanitized);// this is where emit should happen?!\n\t\t\n\t\t// Only emit change if it did not exist before this\n\t\tif (!(rich)) { OP.emit('change',id) };\n\t\tthis.emit((\"wal:\" + id));\n\t\tthis.emit((\"wal:\" + id + \":\" + cmd));\n\t\treturn;\n\t}\n\tstatic {\n\t\tthis.prototype[$__initor__$] = $1;this.prototype[$__hooks__$] = imba_hooks;\n\t\tdefineName$__(this,'WAL');decorate$__([imba_αthenable.bind([])],this.prototype,'init',null);\n\t\tinheritClass$__(this);}\n};\n\nexport class JobWorker {\n\t\n\tconstructor(){\n\t\t\n\t\tOP.workers.add(this);\n\t\t\n\t\tthis.model = OPWorker.create(\n\t\t\t{pid: globalThis.process.pid}\n\t\t);\n\t\tthis.active = false;\n\t\tthis.job = null;\n\t\t\n\t\t// supported jobs\n\t\tlet types = OPJob.types.filter(function(_0) { return _0.prototype.implementedΦ; });\n\t\tthis.prefixes = types.map(function(_0) { return _0.id; });\n\t\tthis.regex = (`^(` + this.prefixes.join('0|') + `0)`);\n\t\tif (!(this.prefixes.length)) {\n\t\t\t\n\t\t\tconsole.warn(`execute handlers not implemented for any jobs here`);\n\t\t};\n\t}\n\t\n\tasync test(){\n\t\tlet res;\n\t\t\n\t\ttry {\n\t\t\tres = await OP.sql`select * from ${OPJob} where id ~ ${this.regex}`;\n\t\t} catch (e) {\n\t\t\t\n\t\t\tres = console.log(`errorr!!`,e);\n\t\t};\n\t\treturn console.log('found!',res);\n\t}\n\t\n\tstart(){\n\t\t\n\t\tif (!(this.active)) { return this.check() };\n\t}\n\t\n\tasync run(id){\n\t\t\n\t\tthis.active = true;\n\t\tconst job = this.job = await OP.get(id);\n\t\ttry {\n\t\t\t\n\t\t\tconsole.warn(`will run job`,id);\n\t\t\treturn await job.invoke();\n\t\t} catch (e) {\n\t\t\t\n\t\t\treturn console.warn(`failed running job`,e);\n\t\t} finally {\n\t\t\t\n\t\t\tconsole.log(`did finish job?`);\n\t\t\tthis.job = null;\n\t\t\tthis.active = false;\n\t\t\tthis.release();\n\t\t};\n\t}\n\t\n\tget idleΦ(){\n\t\t\n\t\treturn !(this.active);\n\t}\n\t\n\trelease(){\n\t\t\n\t\treturn true;\n\t}\n\t\n\tteardown(){\n\t\t\n\t\treturn OP.workers.delete(this);\n\t}\n\t\n\tasync check(){\n\t\tvar self = this;\n\t\t\n\t\tif (this.active) { return };\n\t\tlet taken;\n\t\ttry {\n\t\t\t[taken] = await OP.sql`select op.claim_job(${this.model.id},${this.regex}) as id`;\n\t\t} catch (error) {\n\t\t\t\n\t\t\tconsole.warn(\"WARNING\",error.message);\n\t\t};\n\t\t// what if there was already a job?\n\t\t// should rather listen to notifications I guess\n\t\treturn (taken && taken.id) ? this.run(taken.id) : setTimeout(function() { return self.check(); },1000);\n\t}\n\tstatic {\n\t\tdefineName$__(this,'JobWorker');}\n};\n\nclass Query {\n\t\n\t/**\n\t@param {OPObject} table\n\t@param {MemoMap} queue\n\t*/\n\tconstructor(table,queue,query = {$or: true}){\n\t\tvar self = this;\n\t\t\n\t\tthis.queue = queue;\n\t\tthis.table = table;\n\t\tthis.params = query;\n\t\t\n\t\tthis.results = [];\n\t\tthis.resolver = null;\n\t\tthis.promise = new Promise(function(resolve) { return self.resolver = resolve; });\n\t\t!this[$__initor__$] && this[$__hooks__$].inited(this);\n\t}\n\t\n\tasync run(){\n\t\tvar self = this;\n\t\t\n\t\tthis.freeze();\n\t\tlet qry = OP.db.queryΞtoΞsql(this.table,this.params);\n\t\tlet q = OP.sql`select * from ${this.table} where ${qry}`;\n\t\tlet hydrator = OP.db.hydrator;\n\t\t\n\t\tif (false) {};\n\t\t\n\t\tawait q.forEach(function(row) {\n\t\t\t\n\t\t\treturn self.results.push(hydrator(row));\n\t\t});\n\t\tthis.resolver(this);\n\t\treturn true;\n\t}\n\t\n\t// no more items allowed to be added to this batch\n\tfreeze(){\n\t\t\n\t\tif (this.queue) { this.queue.delete(this.table) };\n\t\tthis.queue = null;\n\t\treturn this;\n\t}\n\t\n\tadd(pars){\n\t\t\n\t\tfor (let $10 = 0, $11 = Object.keys(pars), $12 = $11.length, k, v; $10 < $12; $10++){\n\t\t\tk = $11[$10];v = pars[k];\n\t\t\tlet curr = this.params[k];\n\t\t\tif (curr == undefined) {\n\t\t\t\t\n\t\t\t\tthis.params[k] = v;\n\t\t\t} else if (curr instanceof Array) {\n\t\t\t\t\n\t\t\t\tcurr.push(v);\n\t\t\t\tif (curr.length > 150) { this.freeze() };\n\t\t\t\t// maybe if there are more than n arguments we can stop the batch\n\t\t\t} else {\n\t\t\t\t\n\t\t\t\tthis.params[k] = [curr,v];\n\t\t\t};\n\t\t};\n\t\t\n\t\treturn this;\n\t}\n\tstatic {\n\t\tthis.prototype[$__hooks__$] = imba_hooks;\n\t\tdefineName$__(this,'Query');decorate$__([imba_αthenable.bind([])],this.prototype,'run',null);\n\t}\n};\n\nclass DB extends Component {\n\t[$__patch__$]($$ = {},fields = true){\n\t\tvar $13;\n\t\tsuper[$__patch__$] && super[$__patch__$]($$,fields);\n\t\t($13 = $$.batches) !== undefined && (this.batches = $13);\n\t\t\n\t}\n\tconstructor(){\n\t\tsuper(...arguments);\n\t\tsuper[$__init__$] || this[$__init__$]();this[$__initor__$]===$2 && (this[$__hooks__$]&&this[$__hooks__$].inited(this),this[$__inited__$] && this[$__inited__$]());\n\t}\n\t[$__init__$]($$ = null,deep = true,fields = true){\n\t\tvar $14;\n\t\tdeep && super[$__init__$] && super[$__init__$](...arguments);\n\t\tthis.batches = ($$ && ($14 = $$.batches) !== undefined) ? ($14) : (new MemoMap(function(_0,_1) {\n\t\t\t\n\t\t\treturn new Query(_0,_1);\n\t\t}));\n\t\t\n\t}\n\trow(raw){\n\t\t\n\t\tlet out = {};\n\t\tfor (let $15 = 0, $16 = Object.keys(raw), $17 = $16.length, k, v; $15 < $17; $15++){\n\t\t\tk = $16[$15];v = raw[k];\n\t\t\tif (v !== null) { out[k] = v };\n\t\t};\n\t\treturn out;\n\t}\n\t\n\tasync flush(){\n\t\t\n\t\tlet promises = [];\n\t\tfor (let [k,batch] of iter$__(this.batches)){\n\t\t\t\n\t\t\tpromises.push(batch);\n\t\t};\n\t\treturn await Promise.all(promises);\n\t}\n\t\n\t// Returns rich OPObject for a raw datarow from db\n\t/**\n\t@returns { OPObject }\n\t*/\n\thydrator(raw){\n\t\t\n\t\t// TODO first check if we have the rich version at correct ref\n\t\tlet id = raw.id;\n\t\tlet cloud = OP.$cloud[id];\n\t\tif (cloud && cloud._rev == raw._rev) {\n\t\t\t\n\t\t\treturn OP.$rich[id] || OP.get(id);\n\t\t};\n\t\t\n\t\treturn OP.$patch(this.row(raw));\n\t}\n\t\n\tbegin(cb){\n\t\t\n\t\treturn this.owner.pg.begin(cb);\n\t}\n\t\n\tasync val(first,...rest){\n\t\t\n\t\tlet res = await this.owner.sql(first,...rest);\n\t\tif (res = res[0]) {\n\t\t\t\n\t\t\tlet keys = Object.keys(res);\n\t\t\treturn (keys.length > 1) ? res : res[keys[0]];\n\t\t};\n\t}\n\t\n\tasync upsert(id,values){\n\t\t\n\t\tlet typ = OP.getType(String(id));\n\t\tlet raw = await this.val`select id from ${typ} where id = ${id} limit 1`;\n\t\treturn raw ? this.update(id,values) : this.insert(id,values);\n\t}\n\t\n\tinsert(id,values = {}){\n\t\tvar $18, $19;\n\t\t\n\t\tlet typ = OP.getType(String(id));\n\t\tlet vals = Object.assign({id: id},values);\n\t\t\n\t\t// if typ.prototype isa OPPov\n\t\t// vals._for = id.split('.')[0]\n\t\t// vals._pov = id.split('.')[1]\n\t\t((($18 = vals._rev),delete vals._rev, $18));\n\t\t((($19 = vals._),delete vals._, $19));\n\t\t\n\t\tif (typ.povΦ) { // FIXME what if this is -4?\n\t\t\t\n\t\t\treturn this.one`insert into ${typ} ${vals} on conflict (id) do update set ${vals} returning *`;\n\t\t};\n\t\t\n\t\treturn this.one`insert into ${typ} ${vals} returning *`;\n\t}\n\t\n\tasync one(arg,...rest){\n\t\t\n\t\tlet q = OP.sql(arg,...rest);\n\t\ttry {\n\t\t\t\n\t\t\tlet ts = now();\n\t\t\tlet [row] = await q;\n\t\t\tif (row) { return this.row(row) };\n\t\t} catch (e) {\n\t\t\t\n\t\t\te = augmentError(e);\n\t\t\tthrow e;\n\t\t};\n\t}\n\t\n\tqueryΞtoΞsql(type,o){\n\t\tvar self = this;\n\t\t\n\t\tlet parts = [];\n\t\tlet shape = type.columns;\n\t\tlet pg = OP.pg;\n\t\t\n\t\tif (o instanceof Array) {\n\t\t\t\n\t\t\tlet conds = o.map(function(_0) { return self.queryΞtoΞsql(type,_0); });\n\t\t\treturn conds.reduce(function(acc,x) { return pg`(${acc} OR ${x})`; });\n\t\t};\n\t\t\n\t\tfor (let $20 = 0, $21 = Object.keys(o), $22 = $21.length, k, v; $20 < $22; $20++){\n\t\t\tk = $21[$20];v = o[k];\n\t\t\tif (k[0] == '$') { continue; };\n\t\t\t\n\t\t\tlet [name,op] = k.split('Ξ');\n\t\t\tlet f = shape[name];\n\t\t\tlet c;\n\t\t\t\n\t\t\tif (v instanceof Array) {\n\t\t\t\t\n\t\t\t\tv = v.map(function(_0) { return _0?.id || _0; });\n\t\t\t};\n\t\t\t\n\t\t\tif (v instanceof OPObject) {\n\t\t\t\t\n\t\t\t\tv = v.id;\n\t\t\t};\n\t\t\t\n\t\t\tif (f) {\n\t\t\t\t\n\t\t\t\tif (f.$sqlcond) {\n\t\t\t\t\t\n\t\t\t\t\tc = f.$sqlcond(v,op);\n\t\t\t\t};\n\t\t\t\t\n\t\t\t\tif (!(c)) {\n\t\t\t\t\t\n\t\t\t\t\tc = (op == 'gt') ? (\n\t\t\t\t\t\t\n\t\t\t\t\t\tpg`${pg(name)} > ${v}`\n\t\t\t\t\t) : ((op == 'gte') ? (\n\t\t\t\t\t\t\n\t\t\t\t\t\tpg`${pg(name)} >= ${v}`\n\t\t\t\t\t) : ((op == 'lt') ? (\n\t\t\t\t\t\t\n\t\t\t\t\t\tpg`${pg(name)} < ${v}`\n\t\t\t\t\t) : ((op == 'lte') ? (\n\t\t\t\t\t\t\n\t\t\t\t\t\tpg`${pg(name)} <= ${v}`\n\t\t\t\t\t) : ((op == 'has') ? (\n\t\t\t\t\t\t\n\t\t\t\t\t\t(v instanceof Array) ? (\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\tpg`${pg(name)} ?| ${v}`\n\t\t\t\t\t\t) : (\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\tpg`${pg(name)} ? ${v}`\n\t\t\t\t\t\t)\n\t\t\t\t\t) : ((v instanceof Array) ? (\n\t\t\t\t\t\t\n\t\t\t\t\t\tpg`${pg(name)} = ANY (${v})`\n\t\t\t\t\t) : (\n\t\t\t\t\t\t\n\t\t\t\t\t\tpg`${pg(name)} = ${v}`\n\t\t\t\t\t))))));\n\t\t\t\t};\n\t\t\t\t\n\t\t\t\tparts.push(c,o.$or ? (pg`or`) : (pg`and`));\n\t\t\t};\n\t\t};\n\t\t\n\t\treturn parts.slice(0,-1);\n\t}\n\t\n\tpreload(tbl,query){\n\t\t\n\t\treturn this.batches.get(tbl).add(query);\n\t}\n\t\n\tupdate(id,values){\n\t\tvar $23;\n\t\t\n\t\tlet typ = OP.getType(String(id));\n\t\tlet vals = Object.assign({},values);\n\t\tlet sql = OP.pg;\n\t\t((($23 = vals._rev),delete vals._rev, $23));\n\t\tlet upd = [];\n\t\tlet special = false;\n\t\t\n\t\tfor (let $24 = 0, $25 = Object.keys(vals), $26 = $25.length, k, v; $24 < $26; $24++){\n\t\t\tk = $25[$24];v = vals[k];\n\t\t\tif (k == '_') { continue; };\n\t\t\t\n\t\t\tlet v0 = v;\n\t\t\tlet col = sql(k);\n\t\t\tlet parts = k.split(/\\[([^\\]]+)\\]|\\./g);\n\t\t\t\n\t\t\tif (parts.length > 1) {\n\t\t\t\t\n\t\t\t\tcol = (`\"` + parts.shift() + `\"`);\n\t\t\t\tcol += parts.map(function(_0) { return _0 ? ((`['` + _0 + `']`)) : ''; }).join('');\n\t\t\t\tcol = sql.unsafe(col);\n\t\t\t\tspecial = true;\n\t\t\t};\n\t\t\t\n\t\t\tif (v) {\n\t\t\t\t\n\t\t\t\tif (v.$incr) {\n\t\t\t\t\t\n\t\t\t\t\tv = sql`COALESCE(${col},0) + ${v.$incr}`;\n\t\t\t\t} else if (v.$decr) {\n\t\t\t\t\t\n\t\t\t\t\tv = sql`COALESCE(${col},0) - ${v.$decr}`;\n\t\t\t\t} else if (v.$push) {\n\t\t\t\t\t\n\t\t\t\t\tv = sql`COALESCE(${col},jsonb_build_array()) || ${v.$push}::jsonb`;\n\t\t\t\t} else if (v.$delete) {\n\t\t\t\t\t\n\t\t\t\t\tv = sql`${col} - ${String(v.$delete)}`;\n\t\t\t\t};\n\t\t\t};\n\t\t\t\n\t\t\tif (v != v0) { special = true };\n\t\t\t\n\t\t\tif (upd.size) { upd.push(sql`,`) };\n\t\t\tupd.push(sql`${col} = ${v}`);\n\t\t};\n\t\t\n\t\tif (upd.length === 0) {\n\t\t\t\n\t\t\treturn;\n\t\t};\n\t\t\n\t\tif (typ.povΦ && !(special) && (!(OP.$cloud[id]) || OP.$cloud[id]._rev < 0)) { // FIXME what if this is -4?\n\t\t\t\n\t\t\tvals.id = id;\n\t\t\treturn this.owner.one`insert into ${sql(typ.pgname)} ${vals} on conflict (id) do update set ${upd} returning *`;\n\t\t};\n\t\t\n\t\t// Go through keys to convert the nested properties to jsonb\n\t\t// what about the sql type\n\t\t\n\t\treturn this.owner.one`update ${sql(typ.pgname)} set ${upd} where id = ${id} returning *`;\n\t}\n\tstatic {\n\t\tthis.prototype[$__initor__$] = $2;this.prototype[$__hooks__$] = imba_hooks;\n\t\tdefineName$__(this,'DB');decorate$__([imba_αbound.bind([])],this.prototype,'hydrator',null);\n\t\tinheritClass$__(this);}\n};\n\nexport default class ServerAdapter extends OPAdapter {\n\t\n\t\n\tconstructor(){\n\t\t\n\t\tsuper(...arguments);\n\t\tthis.db = new DB(this);\n\t\t\n\t\tthis[$context$] = {\n\t\t\tstore: this.store\n\t\t};\n\t\tthis.publications = [];\n\t\tthis.preloads = new WeakCache(function() { return {}; });\n\t\tthis.workers = new Set;\n\t\tthis.servers = new Set;\n\t\t\n\t\tprocess.on('SIGINT',this.kill);\n\t\tthis[$__initor__$]===$3 && (this[$__hooks__$]&&this[$__hooks__$].inited(this),this[$__inited__$] && this[$__inited__$]());\n\t}\n\t\n\tasync kill(){\n\t\tvar $27;\n\t\t\n\t\tprocess.off('SIGINT',this.kill);\n\t\t\n\t\ttry {\n\t\t\t\n\t\t\tif (this.walΦ) { this.wal.teardown() };\n\t\t\t$27 = [];\n\t\t\tfor (let server of iter$__(this.servers)){\n\t\t\t\t\n\t\t\t\t$27.push(await server.kill());\n\t\t\t};\n\t\t\treturn $27;\n\t\t} catch (e) {\n\t\t\t\n\t\t\treturn true;\n\t\t} finally {\n\t\t\t\n\t\t\tprocess.exit(0);\n\t\t};\n\t}\n\t\n\tpub(cond,setup){\n\t\t\n\t\tif (setup) {\n\t\t\t\n\t\t\tlet pub = new Publication(this,{id: cond,cb: setup});\n\t\t\tthis.publications.push(pub);\n\t\t\treturn pub;\n\t\t} else {\n\t\t\t\n\t\t\tfor (let $28 = 0, $29 = iter$__(this.publications), $30 = $29.length; $28 < $30; $28++) {\n\t\t\t\tlet pub = $29[$28];\n\t\t\t\tif (pub.match(cond)) { return pub };\n\t\t\t};\n\t\t};\n\t\t\n\t\treturn null;\n\t}\n\t\n\t// def sub item\n\tsub(item){\n\t\t\n\t\tlet typ = OP.getType(item);\n\t\tlet match;\n\t\tfor (let $31 = 0, $32 = iter$__(this.publications), $33 = $32.length; $31 < $33; $31++) {\n\t\t\tlet pub = $32[$31];\n\t\t\tif (pub.match(item)) { match = pub;break; };\n\t\t};\n\t\t\n\t\treturn new OPSubscription(match,item);\n\t}\n\t\n\tasync finalize(){\n\t\t\n\t\tthis.fs = new FileSystem();\n\t\tthis.sql = this.sql.bind(this);\n\t\tawait this.init({});\n\t\treturn null;\n\t}\n\t\n\tasync $call(action,target,params,caller = null){\n\t\t\n\t\tlet fn = action.callback;\n\t\t\n\t\tif (caller) {\n\t\t\t\n\t\t\treturn await this.withΞcontext(caller,async function() {\n\t\t\t\t\n\t\t\t\treturn await fn.apply(target,params);\n\t\t\t});\n\t\t} else {\n\t\t\t\n\t\t\treturn await fn.apply(target,params);\n\t\t};\n\t}\n\t\n\tget map(){\n\t\t\n\t\treturn this.context.map;\n\t}\n\t\n\tbroadcast(event){\n\t\tvar $34;\n\t\t\n\t\t$34 = [];\n\t\tfor (let server of iter$__(this.servers)){\n\t\t\t\n\t\t\t$34.push(server.uws.publish('all',event,true));\n\t\t};\n\t\treturn $34;\n\t}\n\t\n\tasync createServer(o = {}){\n\t\t\n\t\tawait this;\n\t\treturn new WebServer(this,o);\n\t}\n\t\n\tasync createWorker(o = {}){\n\t\t\n\t\tawait this;\n\t\t// when connecting to first worker\n\t\tif (this.workers.size == 0) {\n\t\t\t\n\t\t\tthis.wal.init();\n\t\t};\n\t\t\n\t\tlet worker = new JobWorker(this,o);\n\t\tworker.start();// autostarting worker?\n\t\treturn worker;\n\t}\n\t\n\tlog(...params){\n\t\t\n\t\treturn this;\n\t}\n\t\n\t/**\n\t\n\t\tRun async callback with the ctx as the pov\n\t\t\n\t*/\n\twithΞcontext(item,cb){\n\t\t\n\t\tasl ||= new AsyncLocalStorage;\n\t\t\n\t\tlet curr = this.context;\n\t\tlet inherited = Object.create(curr);\n\t\tlet ctx = {};\n\t\t\n\t\tif (item instanceof OP.Client) {\n\t\t\t\n\t\t\tctx.client = item;\n\t\t\titem = item.session;\n\t\t};\n\t\t\n\t\tif (item instanceof OP.Session) {\n\t\t\t\n\t\t\tctx.session = ctx.agent = item;\n\t\t\titem = item.user;\n\t\t};\n\t\t\n\t\tif (item instanceof OP.User) {\n\t\t\t\n\t\t\tctx.user = ctx.agent = item;\n\t\t\titem = null;\n\t\t};\n\t\t\n\t\tif (item && Object.isPlain(item)) {\n\t\t\t\n\t\t\tObject.assign(ctx,item);\n\t\t};\n\t\t\n\t\tObject.assign(inherited,ctx);\n\t\t\n\t\treturn asl.run(inherited,cb);\n\t}\n\t\n\t/**\n\t\n\t\tRun async callback with the ctx as the pov\n\t\t\n\t*/\n\tisolate(ctx,cb){\n\t\t\n\t\tthrow \"isolate not supported atm\";\n\t}\n\t\n\tget context(){\n\t\t\n\t\treturn asl?.getStore?.() || this[$context$];\n\t}\n\t\n\tget agent(){\n\t\t\n\t\treturn this.context.agent;\n\t}\n\t\n\tset agent(val){\n\t\t\n\t\tthis.context.agent = val;\n\t}\n\t\n\t// The current point-of-view for OP. Usually an\n\t// OP.User | OP.Server | OP.Client\n\tget pov(){\n\t\t\n\t\tconsole.warn(\"OP.pov deprecated, use OP.agent instead\");\n\t\treturn this.context.pov;\n\t}\n\t\n\tset pov(val){\n\t\t\n\t\tconsole.warn(\"OP.pov deprecated, use OP.agent instead\");\n\t\tthis.context.pov = val;\n\t}\n\t\n\tget session(){\n\t\t\n\t\treturn this.context.session;\n\t}\n\t\n\tget user(){\n\t\t\n\t\treturn this.context.user;\n\t}\n\t\n\tget LFS_DIR(){\n\t\t\n\t\treturn this.options.lfs || process.env.OP_LFS_DIR;\n\t}\n\t\n\t// Clean up mess with init and configure confusion\n\tasync init(o = {}){\n\t\t\n\t\tif ((this[$inited$] != true) ? ((this[$inited$] = true,true)) : false) {\n\t\t\t\n\t\t\tthis.configure(o);\n\t\t\tif (o.wipe) {\n\t\t\t\t\n\t\t\t\tawait this.wipe(o.wipe);\n\t\t\t};\n\t\t\t\n\t\t\tawait this.migrate();// now?\n\t\t\tawait this.analyze();\n\t\t\tif (o.wal) { return this.wal.init() };\n\t\t};\n\t}\n\t\n\tconfigure(options = {}){\n\t\t\n\t\tlet pguri = options?.pg?.uri || process.env.OP_PG_URI;\n\t\t\n\t\tif (!(pguri)) {\n\t\t\t\n\t\t\tthrow \"pg not configured\";\n\t\t};\n\t\t\n\t\tlet querycount = 0;\n\t\tlet pgopts = options?.pg || {};\n\t\t\n\t\tpgopts.debugz = function(conn,sql,params,t) {\n\t\t\t\n\t\t\treturn null;\n\t\t};\n\t\t\n\t\t// pgopts.prepare = no\n\t\t\n\t\tif (pguri) {\n\t\t\t\n\t\t\tpgopts.types ??= {\n\t\t\t\tbigint: pgjs.BigInt\n\t\t\t};\n\t\t\t\n\t\t\tif (this.pg) { throw \"Postgres already configured in adapter\" };\n\t\t\t\n\t\t\tthis.pg = pgjs(this.pguri = pguri,pgopts);\n\t\t};\n\t\tif (options.fs) {\n\t\t\t\n\t\t\tthis.fs.configure(options.fs);\n\t\t};\n\t\t\n\t\tObject.assign(this.options,options);\n\t\treturn this;\n\t}\n\t\n\t// returns true if wal has been instantiated\n\tget walΦ(){\n\t\t\n\t\treturn this.hasOwnProperty('wal');\n\t}\n\t\n\tget wal(){\n\t\t\n\t\treturn new WAL(this);\n\t}\n\t\n\tpreload(arg,...rest){\n\t\tvar self = this;\n\t\t\n\t\tlet meta = this.preloads.get(arg);\n\t\tlet t0 = Date.now();\n\t\tlet key = String(rest);\n\t\t\n\t\treturn meta[key] ||= new Promise(async function(resolve) {\n\t\t\t\n\t\t\tlet res = self.sql(arg,...rest);\n\t\t\tlet ctx = self.store;\n\t\t\tawait res.forEach(function(row) {\n\t\t\t\t\n\t\t\t\tif (!(row.id)) { return };\n\t\t\t\tlet raw = {};\n\t\t\t\tfor (let $35 = 0, $36 = Object.keys(row), $37 = $36.length, k, v; $35 < $37; $35++){\n\t\t\t\t\tk = $36[$35];v = row[k];\n\t\t\t\t\tif (v == null) { continue; };\n\t\t\t\t\traw[k] = v;\n\t\t\t\t};\n\t\t\t\treturn self.$patch(raw,self,ctx);\n\t\t\t});\n\t\t\treturn resolve(true);\n\t\t});\n\t}\n\t\n\tasync findΞone(type,query){\n\t\t\n\t\tlet parts = [];\n\t\t\n\t\tfor (let $38 = 0, $39 = Object.keys(query), $40 = $39.length, k, v; $38 < $40; $38++){\n\t\t\tk = $39[$38];v = query[k];\n\t\t\tparts.push(this.pg`${this.pg(k)} = ${v}`,this.pg`and`);\n\t\t};\n\t\t\n\t\tlet [raw] = await this.sql`select id from ${type} where ${parts.slice(0,-1)} limit 1`;\n\t\t\n\t\treturn raw ? type.get(raw.id) : null;\n\t}\n\t\n\trichΞquery(type,o){\n\t\t\n\t\treturn OP.db.queryΞtoΞsql(type,o);\n\t}\n\t\n\tasync findΞmany(type,...o){\n\t\tvar $41, $42;\n\t\t\n\t\t\n\t\tlet types = type.types;\n\t\t\n\t\t// for now only working with one query\n\t\tlet q = o[0];\n\t\tlet batchΦ = q.$batch;\n\t\t\n\t\t// special query\n\t\tif (q.$parent) {\n\t\t\t\n\t\t\tlet fields = OPFieldRegistry.$parent.filter(function(_0) {\n\t\t\t\t\n\t\t\t\treturn q.$parent instanceof _0.reftype;\n\t\t\t});\n\t\t\t\n\t\t\tlet map = new MemoMap(function() { return {}; });\n\t\t\t\n\t\t\tfor (let type of iter$__(types)){\n\t\t\t\t\n\t\t\t\tfor (let field of iter$__(fields)){\n\t\t\t\t\t\n\t\t\t\t\t// TODO Should find the closest view where it is actually defined\n\t\t\t\t\tif (type.$fields[field.name] == field) {\n\t\t\t\t\t\t\n\t\t\t\t\t\tlet qry = map.get(type.table);\n\t\t\t\t\t\tqry[field.name] = q.$parent;\n\t\t\t\t\t};\n\t\t\t\t};\n\t\t\t};\n\t\t\t\n\t\t\tif (batchΦ) {\n\t\t\t\t\n\t\t\t\t$41 = [];\n\t\t\t\tfor (let [table,o] of iter$__(map)){\n\t\t\t\t\t\n\t\t\t\t\t$41.push(OP.db.preload(table,o));\n\t\t\t\t};\n\t\t\t\tlet promises2 = $41;\n\t\t\t\treturn Promise.all(promises2);\n\t\t\t};\n\t\t\t\n\t\t\tlet results = [];\n\t\t\t$42 = [];\n\t\t\tfor (let [table,o] of iter$__(map)){\n\t\t\t\t\n\t\t\t\tlet q = this.sql`select * from ${table} where ${this.richΞquery(table,o)}`;\n\t\t\t\t$42.push(q.forEach(function(row) { return results.push(OP.db.hydrator(row)); }));\n\t\t\t};\n\t\t\tlet promises = $42;\n\t\t\t\n\t\t\tawait Promise.all(promises);\n\t\t\treturn results;\n\t\t};\n\t\t\n\t\tlet parts = this.richΞquery(type,q);\n\t\tlet res = await this.sql`select * from ${type} where ${parts}`;\n\t\tlet promises = res.map(function(row) { return OP.db.hydrator(row); });\n\t\t// await type.get(row.id)\n\t\treturn await Promise.all(promises);\n\t}\n\t\n\t// make callable\n\twrap(arg,...rest){\n\t\t\n\t\tif (arg?.prototype instanceof OPObject) {\n\t\t\t\n\t\t\treturn arg.pg;\n\t\t};\n\t}\n\t\n\tasync single(sql){\n\t\t\n\t\ttry {\n\t\t\t\n\t\t\tlet res = await sql;\n\t\t\t// if res - sanitize the row as well?\n\t\t\treturn res[0];\n\t\t} catch (e) {\n\t\t\t\n\t\t\t// throw / log if debugging\n\t\t\tif (this.debug) {\n\t\t\t\t\n\t\t\t\tconsole.log('sql error',e.message);\n\t\t\t};\n\t\t\treturn e;\n\t\t};\n\t}\n\t\n\tasync one(arg,...rest){\n\t\tvar $45;\n\t\t\n\t\tlet q = this.sql(arg,...rest);\n\t\ttry {\n\t\t\t\n\t\t\tlet ts = now();\n\t\t\tlet [row] = await q;\n\t\t\tif (row) {\n\t\t\t\t\n\t\t\t\tfor (let $43 = 0, $44 = Object.keys(row), $46 = $44.length, k, v; $43 < $46; $43++){\n\t\t\t\t\tk = $44[$43];v = row[k];\n\t\t\t\t\tif (v === null) { ((($45 = row[k]),delete row[k], $45)) };\n\t\t\t\t\tif (typeof v == 'string' && (/9none$/).test(v)) { row[k] = null };\n\t\t\t\t};\n\t\t\t\treturn row;\n\t\t\t};\n\t\t} catch (e) {\n\t\t\t\n\t\t\te = augmentError(e);\n\t\t\tthrow e;\n\t\t};\n\t}\n\t\n\tasync restore(item){\n\t\tlet res;\n\t\t\n\t\tlet type = this.root.getType(item);\n\t\ttry {\n\t\t\tres = await this.sql`update ${type} set _del = (-op.now()) where id = ${item} returning *`;\n\t\t} catch (e) {\n\t\t\tres = [e];\n\t\t};\n\t\treturn res;\n\t}\n\t\n\tasync wipe(dbname){\n\t\t\n\t\tif (!(dbname === this.pg.options.database)) {\n\t\t\t\n\t\t\tconsole.error((\"Failed to wipe: specified dbname '\" + dbname + \"' does not match '\" + (this.pg.options.database) + \"'\"));\n\t\t\tprocess.exit();\n\t\t};\n\t\tawait this.pg.unsafe(`SET client_min_messages TO WARNING;`);\n\t\tawait this.pg.unsafe(`DROP SCHEMA if exists public CASCADE;`);\n\t\tawait this.pg.unsafe(`DROP SCHEMA if exists op CASCADE;`);\n\t\treturn await this.pg.unsafe(`CREATE SCHEMA public;`);\n\t}\n\t\n\tanalyze(){\n\t\tvar self = this;\n\t\t\n\t\t// find all tables from pg and map the oid of each table to each model.\n\t\treturn this[$analyze$] ??= new Promise(async function(resolve) {\n\t\t\t\n\t\t\t// or do it multiple times?\n\t\t\tlet res = await self.pg`\\n\t\t\t\tselect cl.* from pg_catalog.pg_class cl\\n\t\t\t\t\tleft join pg_catalog.pg_namespace ns on cl.relnamespace = ns.oid\\n\t\t\t\t\twhere nspname = 'public' and relkind in ('r','v')\\n\t\t\t\t\torder by cl.oid\\n\t\t\t\t`;\n\t\t\t\n\t\t\tlet map = self.mapping;\n\t\t\tfor (let $47 = 0, $48 = iter$__(res), $49 = $48.length, type; $47 < $49; $47++) {\n\t\t\t\tlet row = $48[$47];\n\t\t\t\tlet name = row.relname.slice(1).replace('_pov','');\n\t\t\t\tlet povΦ = row.relname.slice(1) != name;\n\t\t\t\t\n\t\t\t\tif (type = map[name]) {\n\t\t\t\t\t\n\t\t\t\t\tif (povΦ) {\n\t\t\t\t\t\t\n\t\t\t\t\t\ttype.Pov.pg_class = type.Pov.prototype.pg_class = row;\n\t\t\t\t\t\ttype.Pov.pgname = type.Pov.prototype.pgname = row.relname;\n\t\t\t\t\t\tmap[row.oid] = map[row.relname] = type.Pov;\n\t\t\t\t\t} else {\n\t\t\t\t\t\t\n\t\t\t\t\t\ttype.pg_class = type.prototype.pg_class = row;\n\t\t\t\t\t\ttype.pgname = type.prototype.pgname = row.relname;\n\t\t\t\t\t\tmap[row.oid] = map[row.relname] = type;// map the oid type as well\n\t\t\t\t\t};\n\t\t\t\t\t\n\t\t\t\t\t// look for pov table?\n\t\t\t\t};\n\t\t\t};\n\t\t\t\n\t\t\t// Analyzed!\n\t\t\treturn resolve(true);\n\t\t});\n\t}\n\t\n\tsql(first,...rest){\n\t\tvar $53, $54, $55, $56, $57;\n\t\t\n\t\t\n\t\tif (!(this.pg)) {\n\t\t\t\n\t\t\tthrow 'Need to configure postgres in Base.server.configure(pg: {...})';\n\t\t};\n\t\t\n\t\tlet meta;\n\t\t\n\t\tif (first instanceof Array) {\n\t\t\t\n\t\t\tmeta = {};\n\t\t\t\n\t\t\tfor (let i = 0, $50 = iter$__(first), $51 = $50.length, m1, m; i < $51; i++) {\n\t\t\t\tlet str = $50[i];\n\t\t\t\t\n\t\t\t\t// first[i] = ' ' + str\n\t\t\t\tif (m1 = str.match(/select\\s([\\_\\w\\.\\*\\,\\s\\n]+)?from/i)) {\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\ttrue;\n\t\t\t\t};\n\t\t\t\t\n\t\t\t\tif (m = str.match(/\\sfrom\\s([\\_\\w\\.]+)?/i)) {\n\t\t\t\t\t\n\t\t\t\t\tif (m[1]) {\n\t\t\t\t\t\t\n\t\t\t\t\t\tmeta.model = this.mapping[m[1]] || this.mapping[m[1].slice(1)];\n\t\t\t\t\t} else {\n\t\t\t\t\t\t\n\t\t\t\t\t\tmeta.model = rest[i];\n\t\t\t\t\t};\n\t\t\t\t};\n\t\t\t};\n\t\t};\n\t\t\n\t\tfor (let i = 0, $52 = iter$__(rest), $58 = $52.length; i < $58; i++) {\n\t\t\tlet param = $52[i];\n\t\t\tif ((param instanceof OPObject) || (param instanceof OPPov)) {\n\t\t\t\t\n\t\t\t\trest[i] = param.id;\n\t\t\t} else if (param?.pg_class) {\n\t\t\t\t\n\t\t\t\trest[i] = this.pg(param.pg_class.relname);\n\t\t\t} else if (param instanceof OPField) {\n\t\t\t\t\n\t\t\t\trest[i] = this.pg(param.name);\n\t\t\t} else if (param?.prototype instanceof OPObject) {\n\t\t\t\t\n\t\t\t\trest[i] = this.pg(param.pgname);\n\t\t\t} else if (param instanceof OPShape) {\n\t\t\t\t\n\t\t\t\trest[i] = this.pg(param.$names);\n\t\t\t\tconsole.log('use columns',param.$names);\n\t\t\t} else if (param?.reltype) {\n\t\t\t\t\n\t\t\t\trest[i] = this.pg(param.relname);\n\t\t\t} else if (param instanceof OPSerialization) {\n\t\t\t\t\n\t\t\t\tlet obj = Object.assign({},param);\n\t\t\t\t// we shall never include _mod, _rev etc in server?\n\t\t\t\t((($53 = obj._),delete obj._, $53));\n\t\t\t\t((($54 = obj._mod),delete obj._mod, $54));\n\t\t\t\t((($55 = obj._rev),delete obj._rev, $55));\n\t\t\t\t((($56 = obj._role),delete obj._role, $56));\n\t\t\t\t((($57 = obj._exp),delete obj._exp, $57));\n\t\t\t\t\n\t\t\t\trest[i] = this.pg(obj);\n\t\t\t\t\n\t\t\t\t// potentially replace models with ids as well\n\t\t\t} else if (typeof param == 'object' && param != null) {\n\t\t\t\t\n\t\t\t\tif ((param?.constructor == Object)) {\n\t\t\t\t\t\n\t\t\t\t\t// TODO move over to using transaction-local variables for this\n\t\t\t\t\tlet obj = Object.assign({},param);\n\t\t\t\t\t// obj._agent = agent if agent\n\t\t\t\t\trest[i] = this.pg(obj);\n\t\t\t\t};\n\t\t\t};\n\t\t};\n\t\t\n\t\tlet out = this.pg(first,...rest);\n\t\t\n\t\tif (meta) {\n\t\t\t\n\t\t\tObject.defineProperty(out,'op',{enumerable: false,value: meta});\n\t\t};\n\t\treturn out;\n\t}\n\t\n\tfetch(...items){\n\t\tvar $59;\n\t\t\n\t\t$59 = [];\n\t\tfor (let $60 = 0, $61 = iter$__(items), $62 = $61.length; $60 < $62; $60++) {\n\t\t\tlet item = $61[$60];\n\t\t\tlet type = this.root.getType(item);\n\t\t\t$59.push(this.single(this.sql`select * from ${type} where id = ${item.id || item}`));\n\t\t};\n\t\tlet res = $59;\n\t\t\n\t\tif (items.length == 1) {\n\t\t\t\n\t\t\treturn res[0];\n\t\t};\n\t\t\n\t\treturn Promise.all(res);\n\t}\n\t\n\tresolve(id){\n\t\t\n\t\tlet type = this.root.getType(id);\n\t\tlet res = this.single(this.sql`select * from ${type} where id = ${id.id || id}`);\n\t\treturn res;\n\t}\n\tstatic {\n\t\tthis.prototype[$__initor__$] = $3;this.prototype[$__hooks__$] = imba_hooks;\n\t\tdefineName$__(this,'ServerAdapter');decorate$__([imba_αbound.bind([])],this.prototype,'kill',null);\n\t\tdecorate$__([imba_αlazy.bind([])],this.prototype,'wal',null);\n\t\tinheritClass$__(this);}\n}; globalThis.ServerAdapter = ServerAdapter;\n","map":{"version":3,"file":"adapter.node.js","sourceRoot":"","sources":["/Users/abdellah/workspace/scrimba/op/src/adapter.node.imba"],"sourcesContent":["import { Component } from './component'\nimport { ValidationError } from './protocol'\nimport { now, WeakCache, MemoMap } from './utils'\nimport { Server as WebServer } from './server'\n\nimport node-fetch from 'node-fetch'\nimport { AsyncLocalStorage } from 'async_hooks'\nimport { Publication } from './publication'\n\nimport nfs from 'fs'\nimport * as nfsp from 'fs/promises'\nimport np from 'path'\nimport pgjs from 'postgres'\n\nconst SharedPromises = {}\nlet asl = null\n\ndef augmentError e\n\tlet msg = e.message\n\tlet m = msg.match(/^(\\w+Error)(\\:(\\w+))? (.+)/)\n\n\tif m and m[1] == 'ValidationError'\n\t\tlet json = {[m[3]]: m[4]}\n\t\te = new ValidationError(JSON.stringify(json))\n\t\te.stack = \"\"\n\n\telif msg.includes \"violates foreign key constraint\"\n\t\te = new OPForeignKeyError\n\n\treturn e\n\nglobal class OPBlobHandle\n\n\tdef constructor blob\n\t\tsrc = blob.path\n\t\tblob = blob\n\t\tstat = nfs.statSync(src,{throwIfNoEntry: false})\n\n\t@thenable def setup\n\t\toffset = 0\n\t\tfile = await nfsp.open(src,'a+')\n\t\tstat = await file.stat()\n\t\twritestream = file.createWriteStream()\n\t\tyes\n\n\tget byteLength\n\t\toffset\n\n\tdef read\\Promise<BinaryChunk> offset, length\n\t\tawait self\n\n\t\tnew Promise do(resolve)\n\t\t\tif length == null\n\t\t\t\tlength = byteLength - offset\n\n\t\t\tif (offset + length) > byteLength\n\t\t\t\tnull\n\n\t\t\tlet buf = Buffer.alloc(length)\n\t\t\tfile.read(buf,0,length,offset).then do(out)\n\t\t\t\tlet arr = new Uint8Array(out.buffer)\n\t\t\t\tlet res = new BinaryChunk(offset,arr)\n\t\t\t\tresolve(res)\n\n\tdef patch offset, data\n\t\tawait self\n\t\tawait file.sync()\n\t\tawait file.write(data,0,data.byteLength,offset)\n\t\treturn self\n\n\tdef append data\n\t\tawait self\n\t\tawait file.sync()\n\t\tlet len = data.byteLength or data.length\n\t\tlet res = await writestream.write(data)\n\t\t# let res = await file.write(data,0,len,offset)\n\t\toffset += len\n\t\treturn self\n\n\tdef teardown\n\t\tblob.#handle = null if blob.#handle == self\n\nextend class OPBlob\n\n\tget path\n\t\t`{OP.LFS_DIR}/{id}`\n\n\tget handle\n\t\t#handle ||= new OPBlobHandle(self)\n\n\tget exists?\n\t\tnfs.existsSync(path)\n\n\tget byteLength\n\n\tdef loadFromUrl url\n\t\t#downloading ||= new Promise do(resolve)\n\t\t\tconst response = (await node-fetch(url)).body\n\t\t\tlet stream = response.pipe(nfs.createWriteStream(path))\n\t\t\tstream.on('finish') do\n\n\t\t\t\t#downloading = null\n\t\t\t\tresolve(yes)\n\n\tdef append chunk, at = null\n\t\tawait handle.append(chunk)\n\n\tdef read\\Promise<BinaryChunk> start = 0, length = null\n\t\thandle.read(start,length)\n\n\tdef patch\n\t\tself\n\n###\nTODO Add automated way to update positions\nUPDATE _entity\nSET pos = subquery.row_number * 100000\nFROM (\n SELECT ROW_NUMBER() OVER (ORDER BY pos) AS row_number, id\n FROM _entity\n) AS subquery\nWHERE _entity.id = subquery.id;\n###\n\n# should follow api from node FileHandle\n# should only have a single reference to a file on server\n# to allow cases where file is accessed at the same time as it is patched etc?\nclass LargeFileRef\n\tdef constructor path,id\n\t\tpath = path\n\t\tid = id\n\n\tdef read buf\n\t\tyes\n\n\tget exists?\n\t\tnfs.existsSync(path)\n\n\tget size\n\t\tnfs.statSync(path)..size or 0\n\n\tdef readFile options = {}\n\t\treturn nfsp.readFile(path)\n\n\tdef createReadStream o = {}\n\t\tconsole.log 'createReadStream',path,o\n\t\tnfs.createReadStream(path,o)\n\n\t# Mostly here to make transitioning from old system easier\n\tdef loadFromUrl url\n\t\tlet key = `{path}.download`\n\n\t\tSharedPromises[key] ||= new Promise do(resolve)\n\t\t\tconst response = (await node-fetch(url)).body\n\t\t\tlet stream = response.pipe(nfs.createWriteStream(path))\n\t\t\tstream.on('finish') do\n\t\t\t\tconsole.log 'done streaming'\n\t\t\t\tdelete SharedPromises[key]\n\t\t\t\tresolve(yes)\n\nclass FileSystem\n\n\tdef constructor path\n\t\tself.path = path or process.env.OP_LFS_DIR\n\n\tdef configure options\n\t\tself\n\n\tget baseURI\n\t\t\"file://{path}\"\n\n\tdef resolve id\n\t\tnp.resolve(path,id)\n\n\tdef open id\n\t\tnew LargeFileRef(resolve(id),id)\n\n\tdef createReadStream id\n\t\tnfs.createReadStream( resolve(id) )\n\n\tdef readFile id\n\t\tnfsp.readFile( resolve(id) )\n\nclass WAL < Component\n\tsilent = no\n\n\tdef constructor\n\t\tsuper\n\t\tsince\\number\n\t\twal\\any\n\t\thistory = []\n\t\tinit!\n\n\t@thenable def init\n\t\t# wait for OP itself - so that you can configure it?\n\t\tnew Promise do(resolve)\n\t\t\twal = pgjs(owner.pguri,{\n\t\t\t\tpublications: 'alltables'\n\t\t\t\tfetch_types: no\n\t\t\t})\n\n\t\t\t# wait for migration?!\n\t\t\twal.subscribe('*',onevent.bind(self)).then do(o)\n\t\t\t\tself.unsubscribe = o.unsubscribe\n\t\t\t\tsince = OP.now\n\t\t\t\tresolve(yes)\n\n\tdef teardown\n\t\tstop!\n\t\tunsubscribe! if unsubscribe\n\t\tunsubscribe = null\n\n\tdef stop\n\t\tstopped = yes\n\t\tself\n\n\tdef start\n\t\tawait self\n\n\tdef flush\n\t\tlet rest = history.slice(0)\n\t\thistory = []\n\t\treturn rest\n\n\tdef waitfor id\n\t\tawait self\n\t\tnew Promise do(resolve)\n\t\t\tconst cb = do(arg) resolve(arg or yes)\n\t\t\tlet timeout = setTimeout(&,50ms) do\n\t\t\t\tun \"wal:{id}\", cb\n\t\t\t\tresolve no\n\t\t\tonce \"wal:{id}\", cb\n\n\tdef onevent row,details\n\t\thistory.push(row)\n\n\t\tlet tbl = details.relation.table\n\t\tlet cmd = details.command\n\n\t\tlet type = OP.mapping[tbl]\n\t\tlet id = row.id\n\n\t\t# if job was inserted\n\t\tif type..prototype isa OPJob and cmd == 'insert'\n\t\t\tfor worker of OP.workers\n\t\t\t\t\tif worker.idle?\n\t\t\t\t\t\tbreak worker.check!\n\n\t\t# internal op ids for tracking foreign keys that were _previously_ set\n\t\treturn unless id\n\t\treturn if silent\n\n\t\t# TODO should not really only look in the walcache,\n\t\t# but rather in the shared cache for all objects\n\t\tlet prev = OP.$cloud[id]\n\t\tlet rich = OP.$rich[id]\n\n\t\t# already been processed by op\n\t\tif prev and prev._rev == row._rev\n\t\t\t# change event should still happen, or?\n\t\t\treturn\n\n\t\tlet sanitized = {}\n\n\t\tfor own k,v of row\n\t\t\tsanitized[k] = v unless v == null\n\n\t\tOP.$patch(sanitized) # this is where emit should happen?!\n\n\t\t# Only emit change if it did not exist before this\n\t\tOP.emit('change',id) if !rich\n\t\temit(\"wal:{id}\")\n\t\temit(\"wal:{id}:{cmd}\")\n\t\treturn\n\nexport class JobWorker\n\tdef constructor\n\t\tOP.workers.add(self)\n\n\t\tmodel = OPWorker.create(\n\t\t\tpid: global.process.pid\n\t\t)\n\t\tactive = no\n\t\tjob = null\n\n\t\t# supported jobs\n\t\tlet types = OPJob.types.filter do $1.prototype.implemented?\n\t\tprefixes = types.map(do $1.id)\n\t\tregex = `^({prefixes.join('0|')}0)`\n\t\tunless prefixes.length\n\t\t\tconsole.warn `execute handlers not implemented for any jobs here`\n\n\tdef test\n\t\tlet res = try await OP.sql`select * from {OPJob} where id ~ {regex}` catch e\n\t\t\tconsole.log `errorr!!`,e\n\t\tconsole.log 'found!',res\n\n\tdef start\n\t\tcheck! unless active\n\n\tdef run id\n\t\tactive = yes\n\t\tconst job = self.job = await OP.get(id)\n\t\ttry\n\t\t\tconsole.warn `will run job`,id\n\t\t\tawait job.invoke!\n\t\tcatch e\n\t\t\tconsole.warn `failed running job`,e\n\t\tfinally\n\t\t\tconsole.log `did finish job?`\n\t\t\tself.job = null\n\t\t\tactive = no\n\t\t\trelease!\n\n\tget idle?\n\t\t!active\n\n\tdef release\n\t\tyes\n\n\tdef teardown\n\t\tOP.workers.delete(self)\n\n\tdef check\n\t\treturn if active\n\t\tlet taken\n\t\ttry [taken] = await OP.sql`select op.claim_job({model.id},{regex}) as id` catch error\n\t\t\tconsole.warn \"WARNING\", error.message\n\t\t# what if there was already a job?\n\t\t# should rather listen to notifications I guess\n\t\ttaken and taken.id ? run(taken.id) : setTimeout(&,1000) do check!\n\nclass Query\n\tdef constructor table\\OPObject,queue\\MemoMap,query = {$or: yes}\n\t\tqueue = queue\n\t\ttable = table\n\t\tparams = query\n\n\t\tresults = []\n\t\tresolver = null\n\t\tpromise = new Promise do(resolve) resolver = resolve\n\n\t@thenable def run\n\t\tfreeze!\n\t\tlet qry = OP.db.query-to-sql(table,params)\n\t\tlet q = OP.sql`select * from {table} where {qry}`\n\t\tlet hydrator = OP.db.hydrator\n\n\t\tif false\n\t\t\tlet explained = await OP.sql`explain select * from {table} where {qry}`\n\n\t\tawait q.forEach do(row)\n\t\t\tresults.push(hydrator(row))\n\t\tresolver(self)\n\t\treturn yes\n\n\t# no more items allowed to be added to this batch\n\tdef freeze\n\t\tqueue.delete(table) if queue\n\t\tqueue = null\n\t\tself\n\n\tdef add pars\n\t\tfor own k,v of pars\n\t\t\tlet curr = params[k]\n\t\t\tif curr == undefined\n\t\t\t\tparams[k] = v\n\t\t\telif curr isa Array\n\t\t\t\tcurr.push(v)\n\t\t\t\tfreeze! if curr.length > 150\n\t\t\t\t# maybe if there are more than n arguments we can stop the batch\n\t\t\telse\n\t\t\t\tparams[k] = [curr,v]\n\n\t\tself\n\nclass DB < Component\n\tdeclare owner\\ServerAdapter\n\n\tbatches = new MemoMap do\n\t\tnew Query($1,$2)\n\n\tdef row raw\n\t\tlet out = {}\n\t\tfor own k,v of raw\n\t\t\tout[k] = v unless v === null\n\t\treturn out\n\n\tdef flush\n\t\tlet promises = []\n\t\tfor [k,batch] of batches\n\t\t\tpromises.push(batch)\n\t\tawait Promise.all(promises)\n\n\t# Returns rich OPObject for a raw datarow from db\n\t@bound def hydrator\\OPObject raw\n\t\t# TODO first check if we have the rich version at correct ref\n\t\tlet id = raw.id\n\t\tlet cloud = OP.$cloud[id]\n\t\tif cloud and cloud._rev == raw._rev\n\t\t\treturn OP.$rich[id] or OP.get(id)\n\n\t\treturn OP.$patch(row(raw))\n\n\tdef begin cb\n\t\towner.pg.begin(cb)\n\n\tdef val first, ...rest\n\t\tlet res = await owner.sql(first,...rest)\n\t\tif res = res[0]\n\t\t\tlet keys = Object.keys(res)\n\t\t\treturn keys.length > 1 ? res : res[keys[0]]\n\n\tdef upsert id,values\n\t\tlet typ = OP.getType(String(id))\n\t\tlet raw = await val`select id from {typ} where id = {id} limit 1`\n\t\traw ? update(id,values) : insert(id,values)\n\n\tdef insert id,values = {}\n\t\tlet typ = OP.getType(String(id))\n\t\tlet vals = Object.assign({id: id},values)\n\n\t\t# if typ.prototype isa OPPov\n\t\t#\tvals._for = id.split('.')[0]\n\t\t#\tvals._pov = id.split('.')[1]\n\t\tdelete vals._rev\n\t\tdelete vals._\n\n\t\tif typ.pov? # FIXME what if this is -4?\n\t\t\treturn one`insert into {typ} {vals} on conflict (id) do update set {vals} returning *`\n\n\t\tone`insert into {typ} {vals} returning *`\n\n\tdef one arg,...rest\n\t\tlet q = OP.sql(arg,...rest)\n\t\ttry\n\t\t\tlet ts = now!\n\t\t\tlet [row] = await q\n\t\t\treturn self.row(row) if row\n\t\tcatch e\n\t\t\te = augmentError(e)\n\t\t\tthrow e\n\n\tdef query-to-sql type, o\n\t\tlet parts = []\n\t\tlet shape = type.columns\n\t\tlet pg = OP.pg\n\n\t\tif o isa Array\n\t\t\tlet conds = o.map do query-to-sql(type,$1)\n\t\t\treturn conds.reduce do(acc,x) pg`({acc} OR {x})`\n\n\t\tfor own k,v of o\n\t\t\tcontinue if k[0] == '$'\n\n\t\t\tlet [name,op] = k.split('Ξ')\n\t\t\tlet f = shape[name]\n\t\t\tlet c\n\n\t\t\tif v isa Array\n\t\t\t\tv = v.map do $1..id or $1\n\n\t\t\tif v isa OPObject\n\t\t\t\tv = v.id\n\n\t\t\tif f\n\t\t\t\tif f.$sqlcond\n\t\t\t\t\tc = f.$sqlcond(v,op)\n\n\t\t\t\tunless c\n\t\t\t\t\tc = if op == 'gt'\n\t\t\t\t\t\tpg`{ pg(name) } > { v }`\n\t\t\t\t\telif op == 'gte'\n\t\t\t\t\t\tpg`{ pg(name) } >= { v }`\n\t\t\t\t\telif op == 'lt'\n\t\t\t\t\t\tpg`{ pg(name) } < { v }`\n\t\t\t\t\telif op == 'lte'\n\t\t\t\t\t\tpg`{ pg(name) } <= { v }`\n\t\t\t\t\telif op == 'has'\n\t\t\t\t\t\tif v isa Array\n\t\t\t\t\t\t\tpg`{ pg(name) } ?| { v }`\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\tpg`{ pg(name) } ? { v }`\n\t\t\t\t\telif v isa Array\n\t\t\t\t\t\tpg`{ pg(name) } = ANY ({ v })`\n\t\t\t\t\telse\n\t\t\t\t\t\tpg`{ pg(name) } = { v }`\n\n\t\t\t\tparts.push(c,o.$or ? pg`or` : pg`and`)\n\n\t\treturn parts.slice(0,-1)\n\n\tdef preload tbl,query\n\t\tbatches.get(tbl).add(query)\n\n\tdef update id,values\n\t\tlet typ = OP.getType(String(id))\n\t\tlet vals = Object.assign({},values)\n\t\tlet sql = OP.pg\n\t\tdelete vals._rev\n\t\tlet upd = []\n\t\tlet special = no\n\n\t\tfor own k,v of vals\n\t\t\tcontinue if k == '_'\n\n\t\t\tlet v0 = v\n\t\t\tlet col = sql(k)\n\t\t\tlet parts = k.split(/\\[([^\\]]+)\\]|\\./g)\n\n\t\t\tif parts.length > 1\n\t\t\t\tcol = `\"{parts.shift!}\"`\n\t\t\t\tcol += parts.map(do $1 ? `['{$1}']` : '').join('')\n\t\t\t\tcol = sql.unsafe(col)\n\t\t\t\tspecial = yes\n\n\t\t\tif v\n\t\t\t\tif v.$incr\n\t\t\t\t\tv = sql`COALESCE({col},0) + {v.$incr}`\n\t\t\t\telif v.$decr\n\t\t\t\t\tv = sql`COALESCE({col},0) - {v.$decr}`\n\t\t\t\telif v.$push\n\t\t\t\t\tv = sql`COALESCE({col},jsonb_build_array()) || {v.$push}::jsonb`\n\t\t\t\telif v.$delete\n\t\t\t\t\tv = sql`{col} - {String(v.$delete)}`\n\n\t\t\tspecial = yes if v != v0\n\n\t\t\tupd.push sql`,` if upd.size\n\t\t\tupd.push sql`{col} = {v}`\n\n\t\tif upd.length is 0\n\t\t\treturn\n\n\t\tif typ.pov? and !special and (!OP.$cloud[id] or OP.$cloud[id]._rev < 0) # FIXME what if this is -4?\n\t\t\tvals.id = id\n\t\t\treturn owner.one`insert into {sql(typ.pgname)} {vals} on conflict (id) do update set {upd} returning *`\n\n\t\t# Go through keys to convert the nested properties to jsonb\n\t\t# what about the sql type\n\n\t\towner.one`update {sql(typ.pgname)} set {upd} where id = {id} returning *`\n\nexport default global class ServerAdapter < OPAdapter\n\n\tdef constructor\n\t\tsuper\n\t\tdb = new DB(self)\n\n\t\t#context = {\n\t\t\tstore: store\n\t\t}\n\t\tpublications = []\n\t\tpreloads = new WeakCache do {}\n\t\tworkers = new Set\n\t\tservers = new Set\n\n\t\tprocess.on('SIGINT',kill)\n\n\t@bound def kill\n\t\tprocess.off('SIGINT',kill)\n\n\t\ttry\n\t\t\twal.teardown! if wal?\n\t\t\tfor server of servers\n\t\t\t\tawait server.kill!\n\t\tcatch e\n\t\t\tyes\n\t\tfinally\n\t\t\tprocess.exit(0)\n\n\tdef pub cond,setup\n\t\tif setup\n\t\t\tlet pub = new Publication(self,id: cond,cb: setup)\n\t\t\tpublications.push(pub)\n\t\t\treturn pub\n\t\telse\n\t\t\tfor pub in publications\n\t\t\t\treturn pub if pub.match(cond)\n\n\t\treturn null\n\n\t# def sub item\n\tdef sub item\n\t\tlet typ = OP.getType(item)\n\t\tlet match\n\t\tfor pub in publications\n\t\t\t\tbreak match = pub if pub.match(item)\n\n\t\treturn new OPSubscription(match,item)\n\n\tdef finalize\n\t\tself.fs = new FileSystem()\n\t\tself.sql = self.sql.bind(self)\n\t\tawait init({})\n\t\treturn null\n\n\tdef $call action, target, params, caller = null\n\t\tlet fn = action.callback\n\n\t\tif caller\n\t\t\tawait self.with-context(caller) do\n\t\t\t\tawait fn.apply(target,params)\n\t\telse\n\t\t\tawait fn.apply(target,params)\n\n\tget map\n\t\tcontext.map\n\n\tdef broadcast event\n\t\tfor server of servers\n\t\t\tserver.uws.publish('all',event,yes)\n\n\tdef createServer o = {}\n\t\tawait self\n\t\treturn new WebServer(self,o)\n\n\tdef createWorker o = {}\n\t\tawait self\n\t\t# when connecting to first worker\n\t\tif workers.size == 0\n\t\t\twal.init!\n\n\t\tlet worker = new JobWorker(self,o)\n\t\tworker.start! # autostarting worker?\n\t\treturn worker\n\n\tdef log ...params\n\t\tself\n\n\t###\n\tRun async callback with the ctx as the pov\n\t###\n\tdef with-context item, cb\n\t\tasl ||= new AsyncLocalStorage\n\n\t\tlet curr = context\n\t\tlet inherited = Object.create(curr)\n\t\tlet ctx = {}\n\n\t\tif item isa OP.Client\n\t\t\tctx.client = item\n\t\t\titem = item.session\n\n\t\tif item isa OP.Session\n\t\t\tctx.session = ctx.agent = item\n\t\t\titem = item.user\n\n\t\tif item isa OP.User\n\t\t\tctx.user = ctx.agent = item\n\t\t\titem = null\n\n\t\tif item and Object.isPlain(item)\n\t\t\tObject.assign(ctx,item)\n\n\t\tObject.assign(inherited,ctx)\n\n\t\tasl.run(inherited,cb)\n\n\t###\n\tRun async callback with the ctx as the pov\n\t###\n\tdef isolate ctx, cb\n\t\tthrow \"isolate not supported atm\"\n\n\tget context\n\t\t(asl..getStore! or #context)\n\n\tget agent\n\t\tcontext.agent\n\n\tset agent val\n\t\tcontext.agent = val\n\n\t# The current point-of-view for OP. Usually an\n\t# OP.User | OP.Server | OP.Client\n\tget pov\n\t\tconsole.warn \"OP.pov deprecated, use OP.agent instead\"\n\t\tcontext.pov\n\n\tset pov val\n\t\tconsole.warn \"OP.pov deprecated, use OP.agent instead\"\n\t\tcontext.pov = val\n\n\tget session\n\t\tcontext.session\n\n\tget user\n\t\tcontext.user\n\n\tget LFS_DIR\n\t\toptions.lfs or process.env.OP_LFS_DIR\n\n\t# Clean up mess with init and configure confusion\n\tdef init o = {}\n\t\tif #inited =? yes\n\t\t\tconfigure(o)\n\t\t\tif o.wipe\n\t\t\t\tawait wipe o.wipe\n\n\t\t\tawait migrate! # now?\n\t\t\tawait analyze!\n\t\t\twal.init! if o.wal\n\n\tdef configure options = {}\n\t\tlet pguri = options..pg..uri or process.env.OP_PG_URI\n\n\t\tunless pguri\n\t\t\tthrow \"pg not configured\"\n\n\t\tlet querycount = 0\n\t\tlet pgopts = options..pg or {}\n\n\t\tpgopts.debugz = do(conn,sql,params,t)\n\t\t\tnull\n\n\t\t# pgopts.prepare = no\n\n\t\tif pguri\n\t\t\tpgopts.types ??= {\n\t\t\t\tbigint: pgjs.BigInt\n\t\t\t}\n\n\t\t\tthrow \"Postgres already configured in adapter\" if pg\n\n\t\t\tpg = pgjs(self.pguri = pguri,pgopts)\n\t\tif options.fs\n\t\t\tfs.configure(options.fs)\n\n\t\tObject.assign(self.options,options)\n\t\tself\n\n\t# returns true if wal has been instantiated\n\tget wal?\n\t\thasOwnProperty('wal')\n\n\t@lazy get wal\n\t\tnew WAL(self)\n\n\tdef preload arg,...rest\n\t\tlet meta = preloads.get(arg)\n\t\tlet t0 = Date.now!\n\t\tlet key = String(rest)\n\n\t\treturn meta[key] ||= new Promise do(resolve)\n\t\t\tlet res = sql(arg,...rest)\n\t\t\tlet ctx = store\n\t\t\tawait res.forEach do(row)\n\t\t\t\treturn unless row.id\n\t\t\t\tlet raw = {}\n\t\t\t\tfor own k,v of row\n\t\t\t\t\tcontinue if v == null\n\t\t\t\t\traw[k] = v\n\t\t\t\t$patch(raw,self,ctx)\n\t\t\tresolve(yes)\n\n\tdef find-one type, query\n\t\tlet parts = []\n\n\t\tfor own k,v of query\n\t\t\tparts.push(pg`{ pg(k) } = { v }`, pg`and`)\n\n\t\tlet [raw] = await sql`select id from {type} where {parts.slice(0,-1)} limit 1`\n\n\t\traw ? type.get(raw.id) : null\n\n\tdef rich-query type, o\n\t\tOP.db.query-to-sql(type,o)\n\n\tdef find-many type, ...o\n\n\t\tlet types = type.types\n\n\t\t# for now only working with one query\n\t\tlet q = o[0]\n\t\tlet batch? = q.$batch\n\n\t\t# special query\n\t\tif q.$parent\n\t\t\tlet fields = OPFieldRegistry.$parent.filter do\n\t\t\t\tq.$parent isa $1.reftype\n\n\t\t\tlet map = new MemoMap do {}\n\n\t\t\tfor type of types\n\t\t\t\tfor field of fields\n\t\t\t\t\t# TODO Should find the closest view where it is actually defined\n\t\t\t\t\tif type.$fields[field.name] == field\n\t\t\t\t\t\tlet qry = map.get(type.table)\n\t\t\t\t\t\tqry[field.name] = q.$parent\n\n\t\t\tif batch?\n\t\t\t\tlet promises2 = for [table,o] of map\n\t\t\t\t\tOP.db.preload(table,o)\n\t\t\t\treturn Promise.all(promises2)\n\n\t\t\tlet results = []\n\t\t\tlet promises = for [table,o] of map\n\t\t\t\tlet q = sql`select * from {table} where {rich-query(table,o)}`\n\t\t\t\tq.forEach do(row) results.push(OP.db.hydrator(row))\n\n\t\t\tawait Promise.all(promises)\n\t\t\treturn results\n\n\t\tlet parts = rich-query(type,q)\n\t\tlet res = await sql`select * from {type} where {parts}`\n\t\tlet promises = res.map do(row) OP.db.hydrator(row)\n\t\t# await type.get(row.id)\n\t\tawait Promise.all promises\n\n\t# make callable\n\tdef wrap arg,...rest\n\t\tif arg..prototype isa OPObject\n\t\t\treturn arg.pg\n\n\tdef single sql\n\t\ttry\n\t\t\tlet res = await sql\n\t\t\t# if res - sanitize the row as well?\n\t\t\treturn res[0]\n\t\tcatch e\n\t\t\t# throw / log if debugging\n\t\t\tif self.debug\n\t\t\t\tconsole.log 'sql error',e.message\n\t\t\treturn e\n\n\tdef one arg,...rest\n\t\tlet q = sql(arg,...rest)\n\t\ttry\n\t\t\tlet ts = now!\n\t\t\tlet [row] = await q\n\t\t\tif row\n\t\t\t\tfor own k,v of row\n\t\t\t\t\tdelete row[k] if v === null\n\t\t\t\t\trow[k] = null if typeof v == 'string' and (/9none$/).test(v)\n\t\t\t\treturn row\n\t\tcatch e\n\t\t\te = augmentError(e)\n\t\t\tthrow e\n\n\tdef restore item\n\t\tlet type = root.getType(item)\n\t\tlet res = try await sql`update {type} set _del = (-op.now()) where id = {item} returning *` catch e [e]\n\t\treturn res\n\n\tdef wipe dbname\n\t\tunless dbname is pg.options.database\n\t\t\tconsole.error \"Failed to wipe: specified dbname '{dbname}' does not match '{pg.options.database}'\"\n\t\t\tprocess.exit!\n\t\tawait pg.unsafe(`SET client_min_messages TO WARNING;`)\n\t\tawait pg.unsafe(`DROP SCHEMA if exists public CASCADE;`)\n\t\tawait pg.unsafe(`DROP SCHEMA if exists op CASCADE;`)\n\t\tawait pg.unsafe(`CREATE SCHEMA public;`)\n\n\tdef analyze\n\t\t# find all tables from pg and map the oid of each table to each model.\n\t\t#analyze ??= new Promise do(resolve)\n\t\t\t# or do it multiple times?\n\t\t\tlet res = await pg`\n\t\t\t\tselect cl.* from pg_catalog.pg_class cl\n\t\t\t\t\tleft join pg_catalog.pg_namespace ns on cl.relnamespace = ns.oid\n\t\t\t\t\twhere nspname = 'public' and relkind in ('r','v')\n\t\t\t\t\torder by cl.oid\n\t\t\t\t`\n\n\t\t\tlet map = mapping\n\t\t\tfor row in res\n\n\t\t\t\tlet name = row.relname.slice(1).replace('_pov','')\n\t\t\t\tlet pov? = row.relname.slice(1) != name\n\n\t\t\t\tif let type = map[name]\n\t\t\t\t\tif pov?\n\t\t\t\t\t\ttype.Pov.pg_class = type.Pov.prototype.pg_class = row\n\t\t\t\t\t\ttype.Pov.pgname = type.Pov.prototype.pgname = row.relname\n\t\t\t\t\t\tmap[row.oid] = map[row.relname] = type.Pov\n\t\t\t\t\telse\n\t\t\t\t\t\ttype.pg_class = type.prototype.pg_class = row\n\t\t\t\t\t\ttype.pgname = type.prototype.pgname = row.relname\n\t\t\t\t\t\tmap[row.oid] = map[row.relname] = type # map the oid type as well\n\n\t\t\t\t\t# look for pov table?\n\n\t\t\t# Analyzed!\n\t\t\tresolve(yes)\n\n\tdef sql first,...rest\n\n\t\tunless pg\n\t\t\tthrow 'Need to configure postgres in Base.server.configure(pg: {...})'\n\n\t\tlet meta\n\n\t\tif first isa Array\n\t\t\tmeta = {}\n\n\t\t\tfor str,i in first\n\t\t\t\t# first[i] = ' ' + str\n\t\t\t\tif let m1 = str.match(/select\\s([\\_\\w\\.\\*\\,\\s\\n]+)?from/i)\n\n\t\t\t\t\tyes\n\n\t\t\t\tif let m = str.match(/\\sfrom\\s([\\_\\w\\.]+)?/i)\n\t\t\t\t\tif m[1]\n\t\t\t\t\t\tmeta.model = mapping[m[1]] or mapping[m[1].slice(1)]\n\t\t\t\t\telse\n\t\t\t\t\t\tmeta.model = rest[i]\n\n\t\tfor param,i in rest\n\t\t\tif param isa OPObject or param isa OPPov\n\t\t\t\trest[i] = param.id\n\t\t\telif param..pg_class\n\t\t\t\trest[i] = pg(param.pg_class.relname)\n\t\t\telif param isa OPField\n\t\t\t\trest[i] = pg(param.name)\n\t\t\telif param..prototype isa OPObject\n\t\t\t\trest[i] = pg(param.pgname)\n\t\t\telif param isa OPShape\n\t\t\t\trest[i] = pg(param.$names)\n\t\t\t\tconsole.log 'use columns',param.$names\n\t\t\telif param..reltype\n\t\t\t\trest[i] = pg(param.relname)\n\t\t\telif param isa OPSerialization\n\t\t\t\tlet obj = Object.assign({},param)\n\t\t\t\t# we shall never include _mod, _rev etc in server?\n\t\t\t\tdelete obj._\n\t\t\t\tdelete obj._mod\n\t\t\t\tdelete obj._rev\n\t\t\t\tdelete obj._role\n\t\t\t\tdelete obj._exp\n\n\t\t\t\trest[i] = pg(obj)\n\n\t\t\t\t# potentially replace models with ids as well\n\t\t\telif typeof param == 'object' and param != null\n\t\t\t\tif (param..constructor == Object)\n\t\t\t\t\t# TODO move over to using transaction-local variables for this\n\t\t\t\t\tlet obj = Object.assign({},param)\n\t\t\t\t\t# obj._agent = agent if agent\n\t\t\t\t\trest[i] = pg(obj)\n\n\t\tlet out = pg(first,...rest)\n\n\t\tif meta\n\t\t\tObject.defineProperty(out,'op',{enumerable: no, value: meta})\n\t\treturn out\n\n\tdef fetch ...items\n\t\tlet res = for item in items\n\t\t\tlet type = root.getType(item)\n\t\t\tsingle sql`select * from {type} where id = {item.id or item}`\n\n\t\tif items.length == 1\n\t\t\treturn res[0]\n\n\t\treturn Promise.all(res)\n\n\tdef resolve id\n\t\tlet type = root.getType(id)\n\t\tlet res = single sql`select * from {type} where id = {id.id or id}`\n\t\treturn res\n"],"names":[],"mappings":"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"},"dependencies":[],"meta":{"vite":{"lang":"js"}}}
\No newline at end of file