{"_id":"@bizmori/sdk","name":"@bizmori/sdk","dist-tags":{"latest":"0.1.0"},"versions":{"0.1.0":{"name":"@bizmori/sdk","version":"0.1.0","description":"Official MORI API SDK for TypeScript/JavaScript - Anti-AI protection and invisible watermarking","main":"./dist/index.js","module":"./dist/index.mjs","types":"./dist/index.d.ts","exports":{".":{"import":{"types":"./dist/index.d.mts","default":"./dist/index.mjs"},"require":{"types":"./dist/index.d.ts","default":"./dist/index.js"}}},"scripts":{"build":"tsup","dev":"tsup --watch","test":"vitest run","test:watch":"vitest","test:coverage":"vitest run --coverage","lint":"eslint src --ext .ts","lint:fix":"eslint src --ext .ts --fix","typecheck":"tsc --noEmit","clean":"rm -rf dist","prepublishOnly":"npm run build"},"keywords":["mori","sdk","api","anti-ai","watermark","invisible-watermark","image-protection","ai-protection","copyright","typescript"],"author":{"name":"MORI CORP."},"license":"MIT","repository":{"type":"git","url":"git+https://github.com/mori/mori-sdk.git","directory":"sdks/typescript"},"bugs":{"url":"https://github.com/mori/mori-sdk/issues"},"homepage":"https://github.com/mori/mori-sdk/tree/main/sdks/typescript#readme","engines":{"node":">=18.0.0"},"devDependencies":{"@types/node":"^20.10.0","@typescript-eslint/eslint-plugin":"^6.13.0","@typescript-eslint/parser":"^6.13.0","eslint":"^8.55.0","tsup":"^8.0.0","typescript":"^5.3.0","vitest":"^1.0.0"},"gitHead":"df65422ad119169bb8383491571c81a3ed6dd344","_id":"@bizmori/sdk@0.1.0","_nodeVersion":"22.19.0","_npmVersion":"9.5.1","dist":{"integrity":"sha512-EO3x+EtFYLpmdDzMc0j02gIftlRtbXNI8++MAxrsc/IUPOu78w2fGbpFcNy1EyMoZm1z/JwbSgepJvlmelJcMw==","shasum":"6c20d57a2b4b99a16d25182834bf04369b5b58ec","tarball":"https://registry.npmjs.org/@bizmori/sdk/-/sdk-0.1.0.tgz","fileCount":8,"unpackedSize":137825,"signatures":[{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEMCHxtAts4OWIECXgR4P2FjxqXGH52qH0QGMDkk1zE+5kYCIHVZqSHcIJ1SO4rTqoyWg/TycMTe6ojqSZo5qarGhWPl"}]},"_npmUser":{"name":"supia7k","email":"supia7k@gmail.com"},"directories":{},"maintainers":[{"name":"supia7k","email":"supia7k@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/sdk_0.1.0_1765936379498_0.3755975857248812"},"_hasShrinkwrap":false}},"time":{"created":"2025-12-17T01:52:59.417Z","0.1.0":"2025-12-17T01:52:59.650Z","modified":"2025-12-17T01:52:59.944Z"},"maintainers":[{"name":"supia7k","email":"supia7k@gmail.com"}],"description":"Official MORI API SDK for TypeScript/JavaScript - Anti-AI protection and invisible watermarking","homepage":"https://github.com/mori/mori-sdk/tree/main/sdks/typescript#readme","keywords":["mori","sdk","api","anti-ai","watermark","invisible-watermark","image-protection","ai-protection","copyright","typescript"],"repository":{"type":"git","url":"git+https://github.com/mori/mori-sdk.git","directory":"sdks/typescript"},"author":{"name":"MORI CORP."},"bugs":{"url":"https://github.com/mori/mori-sdk/issues"},"license":"MIT","readme":"# @bizmori/sdk\n\n공식 MORI API TypeScript/JavaScript SDK입니다.\n\n- **Anti-AI**: 이미지에 AI 학습 방해 필터 적용\n- **Invisible Watermark**: 비가시성 워터마크 삽입 및 검출\n\n## 설치\n\n```bash\nnpm install @bizmori/sdk\n# 또는\nyarn add @bizmori/sdk\n# 또는\npnpm add @bizmori/sdk\n```\n\n## 요구사항\n\n- Node.js 18.0.0 이상\n- TypeScript 5.0 이상 (TypeScript 사용 시)\n\n## 빠른 시작\n\n```typescript\nimport { MoriClient } from '@bizmori/sdk';\nimport fs from 'fs';\n\nconst client = new MoriClient({\n  apiKey: process.env.MORI_API_KEY!,\n});\n\n// 1. Anti-AI 보호 처리\nasync function protectImage() {\n  // 주문 생성\n  const order = await client.antiAi.createOrder({\n    files: [{ fileName: 'image.jpg' }],\n    orderName: 'My Protection Order',\n  });\n\n  // 파일 업로드\n  const buffer = fs.readFileSync('./image.jpg');\n  await client.upload(order.files[0], buffer);\n\n  // 주문 확인\n  await client.orders.confirm(order.orderId);\n\n  // 완료 대기\n  const result = await client.orders.waitForCompletion(order.orderId, {\n    pollingInterval: 2000,\n    timeout: 300000,\n    onProgress: (status) => console.log('Status:', status.status),\n  });\n\n  // 다운로드\n  if (result.status === 'complete') {\n    const downloadUrl = await client.orders.getDownloadUrl(order.orderId);\n    console.log('Download URL:', downloadUrl);\n  }\n}\n```\n\n## 주요 기능\n\n### Anti-AI (학습 방지)\n\n```typescript\nconst order = await client.antiAi.createOrder({\n  files: [\n    { fileName: 'image1.jpg' },\n    { fileName: 'image2.png' },\n  ],\n  orderName: 'Protection Order',\n});\n```\n\n### Watermark 삽입\n\n```typescript\nconst order = await client.watermark.embed({\n  files: [{ fileName: 'artwork.jpg' }],\n  orderName: 'Watermark Order',\n});\n```\n\n### Watermark 검출\n\n```typescript\nconst order = await client.watermark.extract({\n  originalFiles: [\n    { fileName: 'original1.jpg' },\n    { fileName: 'original2.jpg' },\n  ],\n  watermarkedFile: { fileName: 'suspected.jpg' },\n});\n\n// 결과 확인\nconst result = await client.orders.waitForCompletion(order.orderId);\nconsole.log(result.status); // 'detected' or 'undetected'\n```\n\n### 파일 업로드\n\n```typescript\n// 단일 파일\nawait client.upload(order.files[0], buffer);\n\n// 여러 파일 동시 업로드\nawait client.uploadAll([\n  [order.files[0], buffer1],\n  [order.files[1], buffer2],\n]);\n```\n\n### Webhook 설정\n\n```typescript\n// 웹훅 등록\nconst { secret } = await client.webhook.register('https://my-server.com/webhook');\n\n// 서명 검증 (서버에서)\nconst isValid = await client.webhook.verifySignature(\n  requestBody,\n  request.headers['x-mori-signature'],\n  secret\n);\n\n// 페이로드 파싱\nconst event = client.webhook.parsePayload(requestBody);\nconsole.log(event.eventType); // 'ORDER.ANTI_AI.PROCESSED'\n```\n\n## 설정 옵션\n\n```typescript\nconst client = new MoriClient({\n  apiKey: 'your-api-key',            // 필수\n  baseUrl: 'https://morimori.app/api/v2',  // 선택 (기본값)\n  timeout: 30000,                    // 선택: 요청 타임아웃 (ms)\n  maxRetries: 3,                     // 선택: 최대 재시도 횟수\n  retryDelay: 1000,                  // 선택: 재시도 기본 딜레이 (ms)\n});\n```\n\n## 에러 처리\n\n```typescript\nimport {\n  MoriError,\n  MoriAuthError,\n  MoriValidationError,\n  MoriNotFoundError,\n  MoriRateLimitError,\n  MoriServerError,\n  MoriTimeoutError,\n} from '@bizmori/sdk';\n\ntry {\n  await client.orders.get('invalid-id');\n} catch (error) {\n  if (error instanceof MoriAuthError) {\n    console.error('인증 오류:', error.message);\n  } else if (error instanceof MoriNotFoundError) {\n    console.error('주문을 찾을 수 없음:', error.code);\n  } else if (error instanceof MoriRateLimitError) {\n    console.error('요청 한도 초과');\n  } else if (error instanceof MoriError) {\n    console.error('API 오류:', error.code, error.message);\n  }\n}\n```\n\n## Zero Copy 모드\n\n처리된 이미지를 고객 S3로 직접 업로드:\n\n```typescript\nconst order = await client.antiAi.createOrder({\n  files: [{ fileName: 'image.jpg' }],\n  mode: { zeroCopy: true },\n  outputTargets: [\n    {\n      fileKey: 'output/protected-image.jpg',\n      url: 'https://your-bucket.s3.../presigned-upload-url',\n      expiresAt: '2024-01-15T12:00:00Z',\n    },\n  ],\n});\n```\n\n## 지원 이미지 형식\n\n- JPG, JPEG, PNG\n- GIF (정지 이미지만)\n- WEBP (정지 이미지만)\n\n## 라이선스\n\nMIT License - [LICENSE](../../LICENSE) 참조\n","readmeFilename":"README.md","_rev":"1-8709edac2be0b24f3eef0ff54584898c"}