diff --git a/src/backend/src/ExtensionService.js b/src/backend/src/ExtensionService.js index 95ecf77a..3321090c 100644 --- a/src/backend/src/ExtensionService.js +++ b/src/backend/src/ExtensionService.js @@ -23,6 +23,7 @@ const { Endpoint } = require("./util/expressutil"); const configurable_auth = require("./middleware/configurable_auth"); const { Context } = require("./util/context"); const { DB_READ, DB_WRITE } = require("./services/database/consts"); +const { Actor } = require("./services/auth/Actor"); /** * State shared with the default service and the `extension` global so that @@ -96,6 +97,39 @@ class ExtensionService extends BaseService { svc_event.emit(key, data, meta); }); + + this.state.extension.kv = (() => { + const impls = this.services.get_implementors('puter-kvstore'); + const impl_kv = impls[0].impl; + + return new Proxy(impl_kv, { + get: (target, prop) => { + if ( typeof target[prop] !== 'function' ) { + return target[prop]; + } + + return (...args) => { + if ( typeof args[0] !== 'object' ) { + // Luckily named parameters don't have positional + // overlaps between the different kv methods, so + // we can just set them all. + args[0] = { + key: args[0], + as: args[0], + value: args[1], + amount: args[2], + timestamp: args[2], + ttl: args[2], + }; + } + return Context.sub({ + actor: Actor.get_system_actor(), + }).arun(() => target[prop](...args)); + }; + }, + }); + })(); + console.log('set kv on', this.state.extension); } ['__on_install.routes'] (_, { app }) {