{"_id":"@croco/impersonation-core","_rev":"2-6edec1121d1ed316e3afd79dd393dabf","name":"@croco/impersonation-core","dist-tags":{"latest":"0.0.2"},"versions":{"0.0.1":{"name":"@croco/impersonation-core","version":"0.0.1","_id":"@croco/impersonation-core@0.0.1","maintainers":[{"name":"kang-heewon","email":"heewon.dev@gmail.com"},{"name":"ddark","email":"ddark.kr@gmail.com"}],"dist":{"shasum":"d745e7a9478233d1fcad7f14a21775e1905f130d","tarball":"https://registry.npmjs.org/@croco/impersonation-core/-/impersonation-core-0.0.1.tgz","fileCount":6,"integrity":"sha512-z0EclS4H8gEWuF8hiaGbXos8jtdWqwZDh6Ck0/5eClUh7bJGwXaqJlWJ0xJICawhEgHYr3FkSsqI2RCnE3vI2w==","signatures":[{"sig":"MEUCIQCqAMa6uTcfZMEt4930l91fBmJ2F2vveblJVZF5mQgtmwIgDVbyvsTwoRnTyfvGHwwd/DbGdrEeRGXki75LU9FWN3o=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":24812},"main":"./dist/index.js","type":"commonjs","_from":"file:croco-impersonation-core-0.0.1.tgz","types":"./dist/index.d.ts","module":"./dist/index.mjs","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js","require":"./dist/index.cjs"}},"scripts":{"lint":"oxlint .","test":"vitest run","build":"tsup src/index.ts --format esm,cjs --minify --clean --dts","typecheck":"tsc --noEmit"},"_npmUser":{"name":"kang-heewon","email":"heewon.dev@gmail.com"},"_resolved":"/tmp/e195112388febf197e3d1b477285deaf/croco-impersonation-core-0.0.1.tgz","_integrity":"sha512-z0EclS4H8gEWuF8hiaGbXos8jtdWqwZDh6Ck0/5eClUh7bJGwXaqJlWJ0xJICawhEgHYr3FkSsqI2RCnE3vI2w==","_npmVersion":"10.9.7","description":"사용자 사칭(Impersonation) 기능을 위한 핵심 패키지입니다. 관리자가 다른 사용자로 로그인하여 지원을 제공할 수 있습니다.","directories":{},"_nodeVersion":"22.22.2","dependencies":{"@croco/gid-core":"0.0.1","@croco/auth-core":"0.0.1","reflect-metadata":"^0.2.2","@croco/audit-core":"0.0.1","@croco/events-core":"0.0.1","@croco/problems-core":"0.0.1","@croco/framework-context":"0.0.1"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"tsup":"^8.0.0","vitest":"4.0.16","typescript":"^5.7.0","@croco/events-inmemory":"0.0.1"},"_npmOperationalInternal":{"tmp":"tmp/impersonation-core_0.0.1_1778834261686_0.30542142259560734","host":"s3://npm-registry-packages-npm-production"}},"0.0.2":{"name":"@croco/impersonation-core","version":"0.0.2","type":"commonjs","main":"./dist/index.js","module":"./dist/index.mjs","types":"./dist/index.d.ts","exports":{".":{"import":"./dist/index.mjs","require":"./dist/index.js","types":"./dist/index.d.ts"}},"publishConfig":{"access":"public"},"dependencies":{"reflect-metadata":"^0.2.2","@croco/audit-core":"0.0.2","@croco/events-core":"0.0.2","@croco/framework-context":"0.0.2","@croco/gid-core":"0.0.2","@croco/problems-core":"0.0.2","@croco/auth-core":"0.0.2"},"devDependencies":{"tsup":"^8.0.0","typescript":"^5.7.0","vitest":"4.0.16","@croco/events-inmemory":"0.0.2"},"scripts":{"build":"tsup src/index.ts --format esm,cjs --minify --clean --dts","test":"vitest run","typecheck":"tsc --noEmit","lint":"oxlint ."},"_id":"@croco/impersonation-core@0.0.2","description":"사용자 사칭(Impersonation) 기능을 위한 핵심 패키지입니다. 관리자가 다른 사용자로 로그인하여 지원을 제공할 수 있습니다.","_integrity":"sha512-MYS91hWcA/KR4Iw6K74CvLm/I9m8azTmvctaEe+eECuNKIUT/kePnJdUZ3/VKy5Jrqq6QGlCOqvKyUh7ZjfwWg==","_resolved":"/private/var/folders/zp/px4pj6gs20q8c38hgmbym1080000gn/T/7423ba013ba5b3f21296992ebf9eb271/croco-impersonation-core-0.0.2.tgz","_from":"file:croco-impersonation-core-0.0.2.tgz","_nodeVersion":"24.14.0","_npmVersion":"11.9.0","dist":{"integrity":"sha512-MYS91hWcA/KR4Iw6K74CvLm/I9m8azTmvctaEe+eECuNKIUT/kePnJdUZ3/VKy5Jrqq6QGlCOqvKyUh7ZjfwWg==","shasum":"1180c0f49a345e17a68e9b34db8ef72011aee284","tarball":"https://registry.npmjs.org/@croco/impersonation-core/-/impersonation-core-0.0.2.tgz","fileCount":6,"unpackedSize":24812,"signatures":[{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEYCIQCNUq4+VLZkJLQ4iVrQRYDGnz33fbKCELFOapH7mgyJuwIhAPbrUlgGZMBEi7GPmJi0Ky+XRp8Gg7Jb6yUFOLU6PL2P"}]},"_npmUser":{"name":"kang-heewon","email":"heewon.dev@gmail.com"},"directories":{},"maintainers":[{"name":"kang-heewon","email":"heewon.dev@gmail.com"},{"name":"ddark","email":"ddark.kr@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/impersonation-core_0.0.2_1780294764710_0.9478904660660861"},"_hasShrinkwrap":false}},"time":{"created":"2026-05-15T08:37:41.572Z","modified":"2026-06-01T06:19:25.034Z","0.0.1":"2026-05-15T08:37:41.882Z","0.0.2":"2026-06-01T06:19:24.914Z"},"description":"사용자 사칭(Impersonation) 기능을 위한 핵심 패키지입니다. 관리자가 다른 사용자로 로그인하여 지원을 제공할 수 있습니다.","maintainers":[{"name":"kang-heewon","email":"heewon.dev@gmail.com"},{"name":"ddark","email":"ddark.kr@gmail.com"}],"readme":"# @croco/impersonation-core\n\n사용자 사칭(Impersonation) 기능을 위한 핵심 패키지입니다. 관리자가 다른 사용자로 로그인하여 지원을 제공할 수 있습니다.\n\n## 설치\n\n```bash\npnpm add @croco/impersonation-core\n```\n\n## 주요 기능\n\n### ImpersonationService\n\n사칭 세션 관리를 위한 서비스입니다.\n\n```typescript\nimport { ImpersonationService } from \"@croco/impersonation-core\";\n\nconst service = new ImpersonationService(store, authProvider, config);\n\n// 사칭 시작\nconst session = await service.start(\"admin-1\", \"user-123\", \"Support request\");\n\n// 사칭 종료\nawait service.end(session.sessionId);\n\n// 컨텍스트에서 사칭 여부 확인\nconst isImpersonating = service.isImpersonating(context);\n\n// 사칭자 ID 가져오기\nconst impersonatorId = service.getImpersonator(context);\n\n// 타겟 사용자 ID 가져오기\nconst targetUserId = service.getTargetUser(context);\n```\n\n### ImpersonationContext\n\n사칭 컨텍스트 타입은 `RequestContext`를 확장합니다.\n\n```typescript\nimport type { ImpersonationContext } from \"@croco/impersonation-core\";\n\nconst context: ImpersonationContext = {\n  requestId: \"req-1\",\n  impersonation: {\n    sessionId: \"imp-123\",\n    impersonatorId: \"admin-1\",\n    targetUserId: \"user-123\",\n    reason: \"Support request\",\n    startedAt: new Date(),\n    expiresAt: new Date(),\n  },\n};\n```\n\n### ImpersonationStartedEvent\n\n사칭 세션 시작 이벤트입니다.\n\n```typescript\nimport { ImpersonationStartedEvent } from \"@croco/impersonation-core\";\n\nconst event = new ImpersonationStartedEvent(session);\nawait eventPublisher.publish(event);\n```\n\n### ImpersonationEndedEvent\n\n사칭 세션 종료 이벤트입니다.\n\n```typescript\nimport { ImpersonationEndedEvent } from \"@croco/impersonation-core\";\n\nconst event = new ImpersonationEndedEvent(session);\nawait eventPublisher.publish(event);\n```\n\n### BlockDuringImpersonation 데코레이터\n\n사칭 중 특정 작업을 차단합니다.\n\n```typescript\nimport { BlockDuringImpersonation } from \"@croco/impersonation-core\";\n\nclass UserService {\n  @BlockDuringImpersonation()\n  async deleteUser(userId: string) {\n    // 사칭 중에는 이 메서드 실행 불가\n  }\n}\n```\n\n### ImpersonationGuard\n\n사칭 여부를 확인하고 차단합니다.\n\n```typescript\nimport { ImpersonationGuard } from \"@croco/impersonation-core\";\n\nconst guard = new ImpersonationGuard(service);\n\nif (guard.canPerformAction(context, \"deleteUser\")) {\n  // 작업 수행\n}\n```\n\n### InMemoryImpersonationStore\n\n인메모리 사칭 세션 저장소입니다.\n\n```typescript\nimport { InMemoryImpersonationStore } from \"@croco/impersonation-core\";\n\nconst store = new InMemoryImpersonationStore();\n```\n\n## API\n\n### ImpersonationService\n\n| 메서드                                         | 설명                |\n| ---------------------------------------------- | ------------------- |\n| `start(impersonatorId, targetUserId, reason?)` | 사칭 세션 시작      |\n| `end(sessionId)`                               | 사칭 세션 종료      |\n| `isImpersonating(context)`                     | 사칭 여부 확인      |\n| `getImpersonator(context)`                     | 사칭자 ID 반환      |\n| `getTargetUser(context)`                       | 타겟 사용자 ID 반환 |\n\n### ImpersonationConfig\n\n| 속성             | 타입     | 설명                    |\n| ---------------- | -------- | ----------------------- |\n| `maxDurationMs`  | number   | 최대 지속 시간 (밀리초) |\n| `requireReason`  | boolean  | 사칭 사유 필수 여부     |\n| `blockedActions` | string[] | 차단할 작업 목록        |\n\n### ImpersonationState\n\n| 속성             | 타입                | 설명           |\n| ---------------- | ------------------- | -------------- |\n| `sessionId`      | string              | 세션 ID        |\n| `impersonatorId` | string              | 사칭자 ID      |\n| `targetUserId`   | string              | 타겟 사용자 ID |\n| `reason`         | string \\| undefined | 사칭 사유      |\n| `startedAt`      | Date                | 시작 시간      |\n| `expiresAt`      | Date                | 만료 시간      |\n\n## 타입 안전성\n\n모든 타입은 strict TypeScript 모드에서 안전하게 동작합니다.\n\n- `as any` 사용 없이 타입 추론이 완벽하게 동작\n- 모든 컨텍스트 타입은 타입 가드와 함께 사용 가능\n\n## 사용 예시\n\n### 완전한 예시\n\n```typescript\nimport \"reflect-metadata\";\nimport { Container } from \"@croco/framework-context\";\nimport { ImpersonationService } from \"@croco/impersonation-core\";\nimport { InMemoryImpersonationStore } from \"@croco/impersonation-core\";\nimport type { AuthProvider } from \"@croco/impersonation-core\";\n\nclass MyAuthProvider implements AuthProvider {\n  getCurrentUserId(): string | null {\n    return \"admin-1\";\n  }\n}\n\nconst store = new InMemoryImpersonationStore();\nconst authProvider = new MyAuthProvider();\nconst config = {\n  maxDurationMs: 30 * 60 * 1000,\n  requireReason: true,\n  blockedActions: [\"deleteUser\", \"updatePassword\"],\n};\n\nconst service = new ImpersonationService(store, authProvider, config);\n\nconst session = await service.start(\"admin-1\", \"user-123\", \"Customer support\");\n\nconst context: ImpersonationContext = {\n  requestId: \"req-1\",\n  impersonation: session,\n};\n\nconst isImpersonating = service.isImpersonating(context);\nconsole.log(isImpersonating);\n```\n","readmeFilename":"README.md"}