summaryrefslogtreecommitdiffhomepage
path: root/packages/console/core/src/actor.ts
diff options
context:
space:
mode:
Diffstat (limited to 'packages/console/core/src/actor.ts')
-rw-r--r--packages/console/core/src/actor.ts74
1 files changed, 74 insertions, 0 deletions
diff --git a/packages/console/core/src/actor.ts b/packages/console/core/src/actor.ts
new file mode 100644
index 000000000..0d13f7216
--- /dev/null
+++ b/packages/console/core/src/actor.ts
@@ -0,0 +1,74 @@
+import { Context } from "./context"
+import { Log } from "./util/log"
+
+export namespace Actor {
+ interface Account {
+ type: "account"
+ properties: {
+ accountID: string
+ email: string
+ }
+ }
+
+ interface Public {
+ type: "public"
+ properties: {}
+ }
+
+ interface User {
+ type: "user"
+ properties: {
+ userID: string
+ workspaceID: string
+ }
+ }
+
+ interface System {
+ type: "system"
+ properties: {
+ workspaceID: string
+ }
+ }
+
+ export type Info = Account | Public | User | System
+
+ const ctx = Context.create<Info>()
+ export const use = ctx.use
+
+ const log = Log.create().tag("namespace", "actor")
+
+ export function provide<R, T extends Info["type"]>(
+ type: T,
+ properties: Extract<Info, { type: T }>["properties"],
+ cb: () => R,
+ ) {
+ return ctx.provide(
+ {
+ type,
+ properties,
+ } as any,
+ () => {
+ return Log.provide({ ...properties }, () => {
+ log.info("provided")
+ return cb()
+ })
+ },
+ )
+ }
+
+ export function assert<T extends Info["type"]>(type: T) {
+ const actor = use()
+ if (actor.type !== type) {
+ throw new Error(`Expected actor type ${type}, got ${actor.type}`)
+ }
+ return actor as Extract<Info, { type: T }>
+ }
+
+ export function workspace() {
+ const actor = use()
+ if ("workspaceID" in actor.properties) {
+ return actor.properties.workspaceID
+ }
+ throw new Error(`actor of type "${actor.type}" is not associated with a workspace`)
+ }
+}