{"version":3,"file":"index.cjs","sources":["../src/index.ts"],"sourcesContent":["import {\n  hasInjectionContext,\n  inject,\n  provide,\n  withContext,\n} from '@andrew_l/context';\nimport {\n  type AnyFunction,\n  type OverwriteWith,\n  isFunction,\n} from '@andrew_l/toolkit';\n\ntype ServiceActorInternal = {\n  traceId: unknown;\n  actorId: unknown;\n  actorType: unknown;\n  [SYM_API]: Record<PropertyKey, Function>;\n  [SYM_MARKER]: boolean;\n  [SYM_RAW]: any;\n  [SYM_DATA]: Record<PropertyKey, unknown>;\n};\n\nexport type AnyServiceActor = {\n  traceId: any;\n  actorId: any;\n  actorType: any;\n  [x: PropertyKey]: any;\n};\n\nexport type ServiceActorData<T extends Record<PropertyKey, any> = {}> =\n  OverwriteWith<\n    {\n      traceId: string;\n      actorId: string | null;\n      actorType: 'unknown' | string;\n    },\n    T\n  >;\n\nexport type ServiceActor<T extends Record<PropertyKey, any> = {}> =\n  ServiceActorData<T> & {\n    assign(params: Partial<ServiceActorData<T>>): ServiceActor<T>;\n  };\n\nvar SYM_MARKER = Symbol();\nvar SYM_RAW = Symbol();\nvar SYM_DATA = Symbol();\nvar SYM_API = Symbol();\n\n/**\n * Create service actor hooks\n *\n * @example\n * const { use: useServiceActor, with: withServiceActor } = serviceActor(() => ({\n *   actorType: 'http-request',\n *   ipAddress: '',\n *  }));\n *\n * app.use((ctx, next) => {\n *   return withServiceActor(\n *     {\n *       traceId: ctx.headers['x-request-id'],\n *       ipAddress: ctx.headers['x-forwarded-for'],\n *     },\n *     next,\n *   );\n * });\n *\n * app.get('/', () => {\n *   const actor = useServiceActor();\n *\n *   // { traceId: 'req_35123', actorId: null, actorType: 'http-request', ipAddress: '::' }\n *   console.log(actor);\n * });\n *\n * @group Main\n */\nexport function serviceActor<T extends Record<PropertyKey, any> = {}>(\n  factory?: () => T,\n): {\n  /**\n   * Wrap a function to execute it with service actor providers\n   */\n  with: <Fn extends AnyFunction>(\n    fn: Fn,\n    params?: Partial<ServiceActor<T>>,\n  ) => Fn;\n\n  /**\n   * Returns the service actor instance from the current context.\n   */\n  inject: () => ServiceActor<T> | undefined;\n\n  /**\n   * Returns the service actor instance from the context, or creates and binds a new instance if none exists.\n   */\n  use: () => ServiceActor<T>;\n} {\n  var injectKey = Symbol();\n  var idSeq = 0;\n\n  var createActor = (): AnyServiceActor => {\n    var actor = createServiceActor();\n\n    actor.traceId = `trace-${++idSeq}`;\n\n    if (factory) {\n      actor.assign(factory());\n    }\n\n    return actor;\n  };\n\n  var withHook = <Fn extends AnyFunction>(\n    fn: Fn,\n    params?: Partial<ServiceActor<T>>,\n  ): Fn => {\n    return withContext(function (this: any, ...args: any[]) {\n      var parentActor = inject<ServiceActor>(injectKey);\n      var actor = createActor();\n\n      if (parentActor) {\n        actor.assign(parentActor);\n      }\n\n      if (params) {\n        actor.assign(params);\n      }\n\n      provide(injectKey, actor);\n\n      return fn.apply(this, args);\n    }) as Fn;\n  };\n\n  var injectHook = (): AnyServiceActor | undefined => {\n    return hasInjectionContext() ? inject<ServiceActor>(injectKey) : undefined;\n  };\n\n  var useHok = (): AnyServiceActor => {\n    var _actor: AnyServiceActor | undefined;\n\n    if (!hasInjectionContext()) {\n      _actor = createActor();\n      provide(injectKey, _actor, true);\n\n      return _actor;\n    }\n\n    // check for existed\n    _actor = inject<AnyServiceActor>(injectKey);\n\n    if (_actor) return _actor;\n\n    _actor = createActor();\n    provide(injectKey, _actor);\n\n    return _actor;\n  };\n\n  return { with: withHook, use: useHok as any, inject: injectHook as any };\n}\n\nfunction createServiceActor(): ServiceActor {\n  var actor: ServiceActorInternal = {\n    traceId: '',\n    actorId: null,\n    actorType: 'unknown',\n    [SYM_API]: {\n      assign,\n    },\n    [SYM_DATA]: {},\n    [SYM_RAW]: null,\n    [SYM_MARKER]: true,\n  };\n\n  var reservedKeys = new Set(Object.keys(actor));\n\n  actor[SYM_RAW] = actor;\n\n  var newProxy = new Proxy(actor[SYM_DATA], {\n    defineProperty(target, key, value) {\n      if (key in actor) {\n        (actor as any)[key] = value;\n      } else {\n        target[key] = value;\n      }\n\n      return true;\n    },\n    deleteProperty(target, key) {\n      if (key in actor) {\n        delete (actor as any)[key];\n      } else {\n        delete target[key];\n      }\n\n      return true;\n    },\n    has(target, key) {\n      return key in actor || key in target;\n    },\n    ownKeys(target) {\n      return [...reservedKeys, ...Object.keys(target)];\n    },\n    set: function (target, key, value) {\n      if (key in actor[SYM_API]) return false;\n\n      if (key in actor) {\n        Reflect.set(actor, key, value);\n      } else if (isFunction(value)) {\n        Reflect.set(actor[SYM_API], key, value);\n      } else {\n        Reflect.set(target, key, value);\n      }\n\n      return true;\n    },\n    get: (target, key) => {\n      var value: any;\n\n      if (key in actor) {\n        value = Reflect.get(actor, key, value);\n      } else if (key in actor[SYM_API]) {\n        value = Reflect.get(actor[SYM_API], key, value).bind(newProxy);\n      } else {\n        value = Reflect.get(target, key);\n      }\n\n      return value;\n    },\n    getOwnPropertyDescriptor(k) {\n      return {\n        enumerable: true,\n        configurable: true,\n      };\n    },\n  });\n\n  return newProxy as ServiceActor;\n}\n\nfunction assign(this: ServiceActor, params: Record<any, any>) {\n  Object.assign(this, params);\n  return this;\n}\n"],"names":["withContext","inject","provide","hasInjectionContext","isFunction"],"mappings":"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"}