@exabugs/dynamodb-client 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (230) hide show
  1. package/CHANGELOG.md +41 -0
  2. package/LICENSE +21 -0
  3. package/README.md +283 -0
  4. package/dist/client/Collection.d.ts +57 -0
  5. package/dist/client/Collection.d.ts.map +1 -0
  6. package/dist/client/Collection.js +174 -0
  7. package/dist/client/Collection.js.map +1 -0
  8. package/dist/client/Database.d.ts +35 -0
  9. package/dist/client/Database.d.ts.map +1 -0
  10. package/dist/client/Database.js +48 -0
  11. package/dist/client/Database.js.map +1 -0
  12. package/dist/client/DynamoClient.d.ts +43 -0
  13. package/dist/client/DynamoClient.d.ts.map +1 -0
  14. package/dist/client/DynamoClient.js +62 -0
  15. package/dist/client/DynamoClient.js.map +1 -0
  16. package/dist/client/FindCursor.d.ts +174 -0
  17. package/dist/client/FindCursor.d.ts.map +1 -0
  18. package/dist/client/FindCursor.js +256 -0
  19. package/dist/client/FindCursor.js.map +1 -0
  20. package/dist/client/aws-sigv4.d.ts +10 -0
  21. package/dist/client/aws-sigv4.d.ts.map +1 -0
  22. package/dist/client/aws-sigv4.js +54 -0
  23. package/dist/client/aws-sigv4.js.map +1 -0
  24. package/dist/client/index.cognito.d.ts +34 -0
  25. package/dist/client/index.cognito.d.ts.map +1 -0
  26. package/dist/client/index.cognito.js +30 -0
  27. package/dist/client/index.cognito.js.map +1 -0
  28. package/dist/client/index.d.ts +12 -0
  29. package/dist/client/index.d.ts.map +1 -0
  30. package/dist/client/index.iam.d.ts +34 -0
  31. package/dist/client/index.iam.d.ts.map +1 -0
  32. package/dist/client/index.iam.js +28 -0
  33. package/dist/client/index.iam.js.map +1 -0
  34. package/dist/client/index.js +12 -0
  35. package/dist/client/index.js.map +1 -0
  36. package/dist/client/index.token.d.ts +33 -0
  37. package/dist/client/index.token.d.ts.map +1 -0
  38. package/dist/client/index.token.js +28 -0
  39. package/dist/client/index.token.js.map +1 -0
  40. package/dist/dynamodb.d.ts +20 -0
  41. package/dist/dynamodb.d.ts.map +1 -0
  42. package/dist/dynamodb.js +31 -0
  43. package/dist/dynamodb.js.map +1 -0
  44. package/dist/errors.d.ts +100 -0
  45. package/dist/errors.d.ts.map +1 -0
  46. package/dist/errors.js +146 -0
  47. package/dist/errors.js.map +1 -0
  48. package/dist/index.d.ts +10 -0
  49. package/dist/index.d.ts.map +1 -0
  50. package/dist/index.js +7 -0
  51. package/dist/index.js.map +1 -0
  52. package/dist/integrations/react-admin/dataProvider.d.ts +59 -0
  53. package/dist/integrations/react-admin/dataProvider.d.ts.map +1 -0
  54. package/dist/integrations/react-admin/dataProvider.js +364 -0
  55. package/dist/integrations/react-admin/dataProvider.js.map +1 -0
  56. package/dist/integrations/react-admin/index.d.ts +24 -0
  57. package/dist/integrations/react-admin/index.d.ts.map +1 -0
  58. package/dist/integrations/react-admin/index.js +23 -0
  59. package/dist/integrations/react-admin/index.js.map +1 -0
  60. package/dist/integrations/react-admin/types.d.ts +47 -0
  61. package/dist/integrations/react-admin/types.d.ts.map +1 -0
  62. package/dist/integrations/react-admin/types.js +5 -0
  63. package/dist/integrations/react-admin/types.js.map +1 -0
  64. package/dist/logger.d.ts +61 -0
  65. package/dist/logger.d.ts.map +1 -0
  66. package/dist/logger.js +87 -0
  67. package/dist/logger.js.map +1 -0
  68. package/dist/scripts/repair-shadows.d.ts +3 -0
  69. package/dist/scripts/repair-shadows.d.ts.map +1 -0
  70. package/dist/scripts/repair-shadows.js +190 -0
  71. package/dist/scripts/repair-shadows.js.map +1 -0
  72. package/dist/server/handler.cjs +31378 -0
  73. package/dist/server/handler.cjs.map +7 -0
  74. package/dist/server/handler.d.ts +18 -0
  75. package/dist/server/handler.d.ts.map +1 -0
  76. package/dist/server/handler.js +435 -0
  77. package/dist/server/handler.js.map +1 -0
  78. package/dist/server/handler.zip +0 -0
  79. package/dist/server/index.d.ts +8 -0
  80. package/dist/server/index.d.ts.map +1 -0
  81. package/dist/server/index.js +8 -0
  82. package/dist/server/index.js.map +1 -0
  83. package/dist/server/operations/deleteMany.d.ts +18 -0
  84. package/dist/server/operations/deleteMany.d.ts.map +1 -0
  85. package/dist/server/operations/deleteMany.js +222 -0
  86. package/dist/server/operations/deleteMany.js.map +1 -0
  87. package/dist/server/operations/deleteOne.d.ts +17 -0
  88. package/dist/server/operations/deleteOne.d.ts.map +1 -0
  89. package/dist/server/operations/deleteOne.js +87 -0
  90. package/dist/server/operations/deleteOne.js.map +1 -0
  91. package/dist/server/operations/find.d.ts +18 -0
  92. package/dist/server/operations/find.d.ts.map +1 -0
  93. package/dist/server/operations/find.js +382 -0
  94. package/dist/server/operations/find.js.map +1 -0
  95. package/dist/server/operations/findMany.d.ts +13 -0
  96. package/dist/server/operations/findMany.d.ts.map +1 -0
  97. package/dist/server/operations/findMany.js +61 -0
  98. package/dist/server/operations/findMany.js.map +1 -0
  99. package/dist/server/operations/findManyReference.d.ts +18 -0
  100. package/dist/server/operations/findManyReference.d.ts.map +1 -0
  101. package/dist/server/operations/findManyReference.js +150 -0
  102. package/dist/server/operations/findManyReference.js.map +1 -0
  103. package/dist/server/operations/findOne.d.ts +14 -0
  104. package/dist/server/operations/findOne.d.ts.map +1 -0
  105. package/dist/server/operations/findOne.js +56 -0
  106. package/dist/server/operations/findOne.js.map +1 -0
  107. package/dist/server/operations/insertMany.d.ts +19 -0
  108. package/dist/server/operations/insertMany.d.ts.map +1 -0
  109. package/dist/server/operations/insertMany.js +243 -0
  110. package/dist/server/operations/insertMany.js.map +1 -0
  111. package/dist/server/operations/insertOne.d.ts +18 -0
  112. package/dist/server/operations/insertOne.d.ts.map +1 -0
  113. package/dist/server/operations/insertOne.js +85 -0
  114. package/dist/server/operations/insertOne.js.map +1 -0
  115. package/dist/server/operations/updateMany.d.ts +20 -0
  116. package/dist/server/operations/updateMany.d.ts.map +1 -0
  117. package/dist/server/operations/updateMany.js +316 -0
  118. package/dist/server/operations/updateMany.js.map +1 -0
  119. package/dist/server/operations/updateOne.d.ts +20 -0
  120. package/dist/server/operations/updateOne.d.ts.map +1 -0
  121. package/dist/server/operations/updateOne.js +159 -0
  122. package/dist/server/operations/updateOne.js.map +1 -0
  123. package/dist/server/query/converter.d.ts +85 -0
  124. package/dist/server/query/converter.d.ts.map +1 -0
  125. package/dist/server/query/converter.js +161 -0
  126. package/dist/server/query/converter.js.map +1 -0
  127. package/dist/server/query/index.d.ts +5 -0
  128. package/dist/server/query/index.d.ts.map +1 -0
  129. package/dist/server/query/index.js +5 -0
  130. package/dist/server/query/index.js.map +1 -0
  131. package/dist/server/shadow/config.d.ts +147 -0
  132. package/dist/server/shadow/config.d.ts.map +1 -0
  133. package/dist/server/shadow/config.js +162 -0
  134. package/dist/server/shadow/config.js.map +1 -0
  135. package/dist/server/shadow/differ.d.ts +42 -0
  136. package/dist/server/shadow/differ.d.ts.map +1 -0
  137. package/dist/server/shadow/differ.js +66 -0
  138. package/dist/server/shadow/differ.js.map +1 -0
  139. package/dist/server/shadow/generator.d.ts +104 -0
  140. package/dist/server/shadow/generator.d.ts.map +1 -0
  141. package/dist/server/shadow/generator.js +148 -0
  142. package/dist/server/shadow/generator.js.map +1 -0
  143. package/dist/server/shadow/index.d.ts +11 -0
  144. package/dist/server/shadow/index.d.ts.map +1 -0
  145. package/dist/server/shadow/index.js +11 -0
  146. package/dist/server/shadow/index.js.map +1 -0
  147. package/dist/server/shadow/types.d.ts +44 -0
  148. package/dist/server/shadow/types.d.ts.map +1 -0
  149. package/dist/server/shadow/types.js +2 -0
  150. package/dist/server/shadow/types.js.map +1 -0
  151. package/dist/server/types.d.ts +295 -0
  152. package/dist/server/types.d.ts.map +1 -0
  153. package/dist/server/types.js +7 -0
  154. package/dist/server/types.js.map +1 -0
  155. package/dist/server/utils/auth.d.ts +43 -0
  156. package/dist/server/utils/auth.d.ts.map +1 -0
  157. package/dist/server/utils/auth.js +123 -0
  158. package/dist/server/utils/auth.js.map +1 -0
  159. package/dist/server/utils/bulkOperations.d.ts +81 -0
  160. package/dist/server/utils/bulkOperations.d.ts.map +1 -0
  161. package/dist/server/utils/bulkOperations.js +147 -0
  162. package/dist/server/utils/bulkOperations.js.map +1 -0
  163. package/dist/server/utils/chunking.d.ts +96 -0
  164. package/dist/server/utils/chunking.d.ts.map +1 -0
  165. package/dist/server/utils/chunking.js +225 -0
  166. package/dist/server/utils/chunking.js.map +1 -0
  167. package/dist/server/utils/dynamodb.d.ts +41 -0
  168. package/dist/server/utils/dynamodb.d.ts.map +1 -0
  169. package/dist/server/utils/dynamodb.js +83 -0
  170. package/dist/server/utils/dynamodb.js.map +1 -0
  171. package/dist/server/utils/filter.d.ts +152 -0
  172. package/dist/server/utils/filter.d.ts.map +1 -0
  173. package/dist/server/utils/filter.js +270 -0
  174. package/dist/server/utils/filter.js.map +1 -0
  175. package/dist/server/utils/pagination.d.ts +27 -0
  176. package/dist/server/utils/pagination.d.ts.map +1 -0
  177. package/dist/server/utils/pagination.js +56 -0
  178. package/dist/server/utils/pagination.js.map +1 -0
  179. package/dist/server/utils/timestamps.d.ts +31 -0
  180. package/dist/server/utils/timestamps.d.ts.map +1 -0
  181. package/dist/server/utils/timestamps.js +84 -0
  182. package/dist/server/utils/timestamps.js.map +1 -0
  183. package/dist/server/utils/ttl.d.ts +17 -0
  184. package/dist/server/utils/ttl.d.ts.map +1 -0
  185. package/dist/server/utils/ttl.js +62 -0
  186. package/dist/server/utils/ttl.js.map +1 -0
  187. package/dist/server/utils/validation.d.ts +40 -0
  188. package/dist/server/utils/validation.d.ts.map +1 -0
  189. package/dist/server/utils/validation.js +54 -0
  190. package/dist/server/utils/validation.js.map +1 -0
  191. package/dist/shadows/config.d.ts +54 -0
  192. package/dist/shadows/config.d.ts.map +1 -0
  193. package/dist/shadows/config.js +95 -0
  194. package/dist/shadows/config.js.map +1 -0
  195. package/dist/shadows/differ.d.ts +42 -0
  196. package/dist/shadows/differ.d.ts.map +1 -0
  197. package/dist/shadows/differ.js +66 -0
  198. package/dist/shadows/differ.js.map +1 -0
  199. package/dist/shadows/generator.d.ts +63 -0
  200. package/dist/shadows/generator.d.ts.map +1 -0
  201. package/dist/shadows/generator.js +107 -0
  202. package/dist/shadows/generator.js.map +1 -0
  203. package/dist/shadows/index.d.ts +15 -0
  204. package/dist/shadows/index.d.ts.map +1 -0
  205. package/dist/shadows/index.js +17 -0
  206. package/dist/shadows/index.js.map +1 -0
  207. package/dist/shadows/types.d.ts +44 -0
  208. package/dist/shadows/types.d.ts.map +1 -0
  209. package/dist/shadows/types.js +2 -0
  210. package/dist/shadows/types.js.map +1 -0
  211. package/dist/types.d.ts +165 -0
  212. package/dist/types.d.ts.map +1 -0
  213. package/dist/types.js +2 -0
  214. package/dist/types.js.map +1 -0
  215. package/dist/ulid.d.ts +46 -0
  216. package/dist/ulid.d.ts.map +1 -0
  217. package/dist/ulid.js +66 -0
  218. package/dist/ulid.js.map +1 -0
  219. package/package.json +136 -0
  220. package/terraform/README.md +222 -0
  221. package/terraform/examples/advanced/README.md +129 -0
  222. package/terraform/examples/advanced/main.tf +158 -0
  223. package/terraform/examples/advanced/shadow.config.json +35 -0
  224. package/terraform/examples/advanced/variables.tf +28 -0
  225. package/terraform/examples/basic/README.md +53 -0
  226. package/terraform/examples/basic/main.tf +99 -0
  227. package/terraform/examples/basic/variables.tf +17 -0
  228. package/terraform/main.tf +159 -0
  229. package/terraform/outputs.tf +56 -0
  230. package/terraform/variables.tf +59 -0
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Database.js","sourceRoot":"","sources":["../../src/client/Database.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AACH,OAAO,EAA0B,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAGrE;;;;;;GAMG;AACH,MAAM,OAAO,QAAQ;IAET;IACA;IACA;IACA;IACA;IACA;IANV,YACU,SAAiB,EACjB,aAAqB,EACrB,UAA8B,EAC9B,YAAsC,EACtC,cAAyC,EACzC,eAAgD;QALhD,cAAS,GAAT,SAAS,CAAQ;QACjB,kBAAa,GAAb,aAAa,CAAQ;QACrB,eAAU,GAAV,UAAU,CAAoB;QAC9B,iBAAY,GAAZ,YAAY,CAA0B;QACtC,mBAAc,GAAd,cAAc,CAA2B;QACzC,oBAAe,GAAf,eAAe,CAAiC;IACvD,CAAC;IAEJ,WAAW;QACT,OAAO,IAAI,CAAC,SAAS,CAAC;IACxB,CAAC;IAED,eAAe;QACb,OAAO,IAAI,CAAC,aAAa,CAAC;IAC5B,CAAC;IAED,YAAY;QACV,OAAO,IAAI,CAAC,UAAU,CAAC;IACzB,CAAC;IAED,cAAc;QACZ,OAAO,IAAI,CAAC,YAAY,CAAC;IAC3B,CAAC;IAED,UAAU,CAER,IAAY;QACZ,IAAI,CAAC,IAAI,IAAI,IAAI,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE,CAAC;YAChC,MAAM,IAAI,KAAK,CAAC,iCAAiC,CAAC,CAAC;QACrD,CAAC;QAED,OAAO,IAAI,UAAU,CACnB,IAAI,CAAC,SAAS,EACd,IAAI,CAAC,aAAa,EAClB,IAAI,EACJ,IAAI,CAAC,UAAU,EACf,IAAI,CAAC,YAAY,EACjB,IAAI,CAAC,cAAc,EACnB,IAAI,CAAC,eAAe,CACrB,CAAC;IACJ,CAAC;CACF"}
@@ -0,0 +1,43 @@
1
+ import type { AuthHeadersGetter } from './Collection.js';
2
+ import { Database } from './Database.js';
3
+ /**
4
+ * クライアントオプション
5
+ *
6
+ * @template TAuthOptions - 認証オプションの型
7
+ */
8
+ export interface ClientOptions<TAuthOptions = unknown> {
9
+ /** 認証設定 */
10
+ auth?: TAuthOptions;
11
+ /** 自動接続(デフォルト: false) */
12
+ autoConnect?: boolean;
13
+ /** タイムアウト(ミリ秒、デフォルト: 30000) */
14
+ timeout?: number;
15
+ }
16
+ /**
17
+ * DynamoDBクライアント
18
+ *
19
+ * Lambda Function URL経由でDynamoDBにアクセスするHTTPクライアント。
20
+ * MongoDB風のシンプルなAPIを提供します。
21
+ *
22
+ * @template TAuthOptions - 認証オプションの型
23
+ */
24
+ export declare class DynamoClient<TAuthOptions = unknown> {
25
+ private endpoint;
26
+ private options?;
27
+ private authToken?;
28
+ private connected;
29
+ private getAuthHeaders;
30
+ /**
31
+ * DynamoClientを作成
32
+ *
33
+ * @param endpoint - Lambda Function URL
34
+ * @param options - クライアントオプション
35
+ * @param getAuthHeaders - 認証ヘッダー取得関数
36
+ */
37
+ constructor(endpoint: string, options: ClientOptions<TAuthOptions> | undefined, getAuthHeaders: AuthHeadersGetter<TAuthOptions>);
38
+ connect(): Promise<void>;
39
+ db(name: string): Database<TAuthOptions>;
40
+ close(): Promise<void>;
41
+ isConnected(): boolean;
42
+ }
43
+ //# sourceMappingURL=DynamoClient.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"DynamoClient.d.ts","sourceRoot":"","sources":["../../src/client/DynamoClient.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,iBAAiB,CAAC;AACzD,OAAO,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;AAEzC;;;;GAIG;AACH,MAAM,WAAW,aAAa,CAAC,YAAY,GAAG,OAAO;IACnD,WAAW;IACX,IAAI,CAAC,EAAE,YAAY,CAAC;IACpB,yBAAyB;IACzB,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,+BAA+B;IAC/B,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED;;;;;;;GAOG;AACH,qBAAa,YAAY,CAAC,YAAY,GAAG,OAAO;IAC9C,OAAO,CAAC,QAAQ,CAAS;IACzB,OAAO,CAAC,OAAO,CAAC,CAA8B;IAC9C,OAAO,CAAC,SAAS,CAAC,CAAS;IAC3B,OAAO,CAAC,SAAS,CAAkB;IACnC,OAAO,CAAC,cAAc,CAAkC;IAExD;;;;;;OAMG;gBAED,QAAQ,EAAE,MAAM,EAChB,OAAO,EAAE,aAAa,CAAC,YAAY,CAAC,GAAG,SAAS,EAChD,cAAc,EAAE,iBAAiB,CAAC,YAAY,CAAC;IAiB3C,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC;IAU9B,EAAE,CAAC,IAAI,EAAE,MAAM,GAAG,QAAQ,CAAC,YAAY,CAAC;IAsBlC,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IAK5B,WAAW,IAAI,OAAO;CAGvB"}
@@ -0,0 +1,62 @@
1
+ import { Database } from './Database.js';
2
+ /**
3
+ * DynamoDBクライアント
4
+ *
5
+ * Lambda Function URL経由でDynamoDBにアクセスするHTTPクライアント。
6
+ * MongoDB風のシンプルなAPIを提供します。
7
+ *
8
+ * @template TAuthOptions - 認証オプションの型
9
+ */
10
+ export class DynamoClient {
11
+ endpoint;
12
+ options;
13
+ authToken;
14
+ connected = false;
15
+ getAuthHeaders;
16
+ /**
17
+ * DynamoClientを作成
18
+ *
19
+ * @param endpoint - Lambda Function URL
20
+ * @param options - クライアントオプション
21
+ * @param getAuthHeaders - 認証ヘッダー取得関数
22
+ */
23
+ constructor(endpoint, options, getAuthHeaders) {
24
+ if (!endpoint || endpoint.trim() === '') {
25
+ throw new Error('Endpoint cannot be empty');
26
+ }
27
+ this.endpoint = endpoint;
28
+ this.options = options;
29
+ this.getAuthHeaders = getAuthHeaders;
30
+ if (options?.autoConnect) {
31
+ this.connect().catch((err) => {
32
+ console.error('Auto-connect failed:', err);
33
+ });
34
+ }
35
+ }
36
+ async connect() {
37
+ // Cognito認証の場合、トークンを取得(getToken関数が存在する場合)
38
+ const auth = this.options?.auth;
39
+ if (auth?.getToken) {
40
+ this.authToken = await auth.getToken();
41
+ }
42
+ this.connected = true;
43
+ }
44
+ db(name) {
45
+ if (!this.connected) {
46
+ throw new Error('Client is not connected. Please call await client.connect() before using the client. ' +
47
+ 'Alternatively, set { autoConnect: true } in the client options.');
48
+ }
49
+ if (!name || name.trim() === '') {
50
+ throw new Error('Database name cannot be empty');
51
+ }
52
+ return new Database(this.endpoint, name, this.authToken, this.options?.auth, this.options, this.getAuthHeaders);
53
+ }
54
+ async close() {
55
+ this.authToken = undefined;
56
+ this.connected = false;
57
+ }
58
+ isConnected() {
59
+ return this.connected;
60
+ }
61
+ }
62
+ //# sourceMappingURL=DynamoClient.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"DynamoClient.js","sourceRoot":"","sources":["../../src/client/DynamoClient.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;AAgBzC;;;;;;;GAOG;AACH,MAAM,OAAO,YAAY;IACf,QAAQ,CAAS;IACjB,OAAO,CAA+B;IACtC,SAAS,CAAU;IACnB,SAAS,GAAY,KAAK,CAAC;IAC3B,cAAc,CAAkC;IAExD;;;;;;OAMG;IACH,YACE,QAAgB,EAChB,OAAgD,EAChD,cAA+C;QAE/C,IAAI,CAAC,QAAQ,IAAI,QAAQ,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE,CAAC;YACxC,MAAM,IAAI,KAAK,CAAC,0BAA0B,CAAC,CAAC;QAC9C,CAAC;QAED,IAAI,CAAC,QAAQ,GAAG,QAAQ,CAAC;QACzB,IAAI,CAAC,OAAO,GAAG,OAAO,CAAC;QACvB,IAAI,CAAC,cAAc,GAAG,cAAc,CAAC;QAErC,IAAI,OAAO,EAAE,WAAW,EAAE,CAAC;YACzB,IAAI,CAAC,OAAO,EAAE,CAAC,KAAK,CAAC,CAAC,GAAG,EAAE,EAAE;gBAC3B,OAAO,CAAC,KAAK,CAAC,sBAAsB,EAAE,GAAG,CAAC,CAAC;YAC7C,CAAC,CAAC,CAAC;QACL,CAAC;IACH,CAAC;IAED,KAAK,CAAC,OAAO;QACX,0CAA0C;QAC1C,MAAM,IAAI,GAAG,IAAI,CAAC,OAAO,EAAE,IAAwD,CAAC;QACpF,IAAI,IAAI,EAAE,QAAQ,EAAE,CAAC;YACnB,IAAI,CAAC,SAAS,GAAG,MAAM,IAAI,CAAC,QAAQ,EAAE,CAAC;QACzC,CAAC;QAED,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC;IACxB,CAAC;IAED,EAAE,CAAC,IAAY;QACb,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,CAAC;YACpB,MAAM,IAAI,KAAK,CACb,uFAAuF;gBACrF,iEAAiE,CACpE,CAAC;QACJ,CAAC;QAED,IAAI,CAAC,IAAI,IAAI,IAAI,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE,CAAC;YAChC,MAAM,IAAI,KAAK,CAAC,+BAA+B,CAAC,CAAC;QACnD,CAAC;QAED,OAAO,IAAI,QAAQ,CACjB,IAAI,CAAC,QAAQ,EACb,IAAI,EACJ,IAAI,CAAC,SAAS,EACd,IAAI,CAAC,OAAO,EAAE,IAAI,EAClB,IAAI,CAAC,OAAO,EACZ,IAAI,CAAC,cAAc,CACpB,CAAC;IACJ,CAAC;IAED,KAAK,CAAC,KAAK;QACT,IAAI,CAAC,SAAS,GAAG,SAAS,CAAC;QAC3B,IAAI,CAAC,SAAS,GAAG,KAAK,CAAC;IACzB,CAAC;IAED,WAAW;QACT,OAAO,IAAI,CAAC,SAAS,CAAC;IACxB,CAAC;CACF"}
@@ -0,0 +1,174 @@
1
+ import type { Filter, FindOptions } from '../types.js';
2
+ import type { AuthHeadersGetter } from './Collection.js';
3
+ import type { ClientOptions } from './DynamoClient.js';
4
+ /**
5
+ * FindCursor
6
+ *
7
+ * MongoDB風のカーソルAPIを提供します。
8
+ * メソッドチェーンでソート、制限、スキップを設定し、
9
+ * toArray()で結果を取得します。
10
+ *
11
+ * @template TSchema - ドキュメント型
12
+ *
13
+ * @example
14
+ * ```typescript
15
+ * const results = await products
16
+ * .find({ status: 'active', price: { gte: 1000 } })
17
+ * .sort({ price: 'desc', createdAt: 'asc' })
18
+ * .limit(10)
19
+ * .skip(20)
20
+ * .toArray();
21
+ * ```
22
+ */
23
+ export declare class FindCursor<TSchema extends {
24
+ id: string;
25
+ [key: string]: unknown;
26
+ } = {
27
+ id: string;
28
+ [key: string]: unknown;
29
+ }, TAuthOptions = unknown> {
30
+ private endpoint;
31
+ private databaseName;
32
+ private collectionName;
33
+ private filter;
34
+ private authToken?;
35
+ private authOptions?;
36
+ private clientOptions?;
37
+ private getAuthHeaders?;
38
+ private options;
39
+ private executed;
40
+ private results;
41
+ private pageInfo?;
42
+ /**
43
+ * FindCursorを作成
44
+ *
45
+ * @param endpoint - Lambda Function URL
46
+ * @param databaseName - データベース名
47
+ * @param collectionName - コレクション名
48
+ * @param filter - フィルタ条件
49
+ * @param options - 検索オプション
50
+ * @param authToken - 認証トークン
51
+ * @param authOptions - 認証オプション
52
+ * @param clientOptions - クライアントオプション
53
+ * @param getAuthHeaders - 認証ヘッダー取得関数
54
+ */
55
+ constructor(endpoint: string, databaseName: string, collectionName: string, filter: Filter<TSchema>, options?: FindOptions, authToken?: string | undefined, authOptions?: TAuthOptions | undefined, clientOptions?: ClientOptions | undefined, getAuthHeaders?: AuthHeadersGetter<TAuthOptions> | undefined);
56
+ /**
57
+ * ソート条件を設定
58
+ *
59
+ * 複数のフィールドでソートする場合、オブジェクトのキー順序でソート優先度が決まります。
60
+ * 1または'asc'で昇順、-1または'desc'で降順を指定します。
61
+ *
62
+ * @param sort - ソート条件(例: { price: 'desc', createdAt: 'asc' })
63
+ * @returns this(メソッドチェーン用)
64
+ *
65
+ * @example
66
+ * ```typescript
67
+ * // 価格の降順でソート
68
+ * cursor.sort({ price: 'desc' });
69
+ *
70
+ * // 複数フィールドでソート
71
+ * cursor.sort({ priority: 'desc', createdAt: 'asc' });
72
+ *
73
+ * // 数値形式でも指定可能
74
+ * cursor.sort({ price: -1, createdAt: 1 });
75
+ * ```
76
+ */
77
+ sort(sort: Record<string, 1 | -1 | 'asc' | 'desc'>): this;
78
+ /**
79
+ * 取得件数を制限
80
+ *
81
+ * 返されるドキュメントの最大数を設定します。
82
+ * ページネーション実装時にskip()と組み合わせて使用します。
83
+ *
84
+ * @param limit - 取得件数(正の整数)
85
+ * @returns this(メソッドチェーン用)
86
+ *
87
+ * @example
88
+ * ```typescript
89
+ * // 最初の10件を取得
90
+ * cursor.limit(10);
91
+ *
92
+ * // ページネーション(2ページ目、1ページ10件)
93
+ * cursor.skip(10).limit(10);
94
+ * ```
95
+ */
96
+ limit(limit: number): this;
97
+ /**
98
+ * スキップする件数を設定
99
+ *
100
+ * 指定した件数のドキュメントをスキップします。
101
+ * ページネーション実装時にlimit()と組み合わせて使用します。
102
+ *
103
+ * @param skip - スキップする件数(0以上の整数)
104
+ * @returns this(メソッドチェーン用)
105
+ *
106
+ * @example
107
+ * ```typescript
108
+ * // 最初の20件をスキップ
109
+ * cursor.skip(20);
110
+ *
111
+ * // ページネーション(3ページ目、1ページ10件)
112
+ * cursor.skip(20).limit(10);
113
+ * ```
114
+ */
115
+ skip(skip: number): this;
116
+ /**
117
+ * クエリを実行(内部使用)
118
+ *
119
+ * Lambda Function URLにHTTPリクエストを送信し、結果を取得します。
120
+ * 一度実行されたクエリは再実行されません(結果がキャッシュされます)。
121
+ */
122
+ private execute;
123
+ /**
124
+ * 配列として取得
125
+ *
126
+ * クエリを実行し、結果をドキュメントの配列として返します。
127
+ * このメソッドを呼び出すまで、実際のHTTPリクエストは送信されません。
128
+ *
129
+ * @returns ドキュメントの配列
130
+ *
131
+ * @example
132
+ * ```typescript
133
+ * const results = await products
134
+ * .find({ status: 'active' })
135
+ * .sort({ price: 'desc' })
136
+ * .limit(10)
137
+ * .toArray();
138
+ *
139
+ * console.log(`Found ${results.length} products`);
140
+ * results.forEach(product => {
141
+ * console.log(product.name, product.price);
142
+ * });
143
+ * ```
144
+ */
145
+ toArray(): Promise<TSchema[]>;
146
+ /**
147
+ * ページネーション情報を取得
148
+ *
149
+ * クエリを実行し、ページネーション情報を返します。
150
+ * 無限スクロールやカーソルベースのページネーションに使用します。
151
+ *
152
+ * @returns ページネーション情報
153
+ *
154
+ * @example
155
+ * ```typescript
156
+ * const cursor = products
157
+ * .find({ status: 'active' })
158
+ * .sort({ price: 'desc' })
159
+ * .limit(10);
160
+ *
161
+ * const results = await cursor.toArray();
162
+ * const pageInfo = await cursor.getPageInfo();
163
+ *
164
+ * console.log(`Has next page: ${pageInfo.hasNextPage}`);
165
+ * console.log(`Next token: ${pageInfo.nextToken}`);
166
+ * ```
167
+ */
168
+ getPageInfo(): Promise<{
169
+ hasNextPage: boolean;
170
+ hasPreviousPage: boolean;
171
+ nextToken?: string;
172
+ }>;
173
+ }
174
+ //# sourceMappingURL=FindCursor.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"FindCursor.d.ts","sourceRoot":"","sources":["../../src/client/FindCursor.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AACvD,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,iBAAiB,CAAC;AACzD,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAC;AAEvD;;;;;;;;;;;;;;;;;;GAkBG;AACH,qBAAa,UAAU,CACrB,OAAO,SAAS;IAAE,EAAE,EAAE,MAAM,CAAC;IAAC,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAA;CAAE,GAAG;IAAE,EAAE,EAAE,MAAM,CAAC;IAAC,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAA;CAAE,EAC/F,YAAY,GAAG,OAAO;IAqBpB,OAAO,CAAC,QAAQ;IAChB,OAAO,CAAC,YAAY;IACpB,OAAO,CAAC,cAAc;IACtB,OAAO,CAAC,MAAM;IAEd,OAAO,CAAC,SAAS,CAAC;IAClB,OAAO,CAAC,WAAW,CAAC;IACpB,OAAO,CAAC,aAAa,CAAC;IACtB,OAAO,CAAC,cAAc,CAAC;IA3BzB,OAAO,CAAC,OAAO,CAAc;IAC7B,OAAO,CAAC,QAAQ,CAAkB;IAClC,OAAO,CAAC,OAAO,CAAiB;IAChC,OAAO,CAAC,QAAQ,CAAC,CAAyE;IAE1F;;;;;;;;;;;;OAYG;gBAEO,QAAQ,EAAE,MAAM,EAChB,YAAY,EAAE,MAAM,EACpB,cAAc,EAAE,MAAM,EACtB,MAAM,EAAE,MAAM,CAAC,OAAO,CAAC,EAC/B,OAAO,GAAE,WAAgB,EACjB,SAAS,CAAC,EAAE,MAAM,YAAA,EAClB,WAAW,CAAC,EAAE,YAAY,YAAA,EAC1B,aAAa,CAAC,EAAE,aAAa,YAAA,EAC7B,cAAc,CAAC,EAAE,iBAAiB,CAAC,YAAY,CAAC,YAAA;IAK1D;;;;;;;;;;;;;;;;;;;;OAoBG;IACH,IAAI,CAAC,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,GAAG,KAAK,GAAG,MAAM,CAAC,GAAG,IAAI;IAKzD;;;;;;;;;;;;;;;;;OAiBG;IACH,KAAK,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI;IAK1B;;;;;;;;;;;;;;;;;OAiBG;IACH,IAAI,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI;IAKxB;;;;;OAKG;YACW,OAAO;IAuFrB;;;;;;;;;;;;;;;;;;;;;OAqBG;IACG,OAAO,IAAI,OAAO,CAAC,OAAO,EAAE,CAAC;IAOnC;;;;;;;;;;;;;;;;;;;;;OAqBG;IACG,WAAW,IAAI,OAAO,CAAC;QAC3B,WAAW,EAAE,OAAO,CAAC;QACrB,eAAe,EAAE,OAAO,CAAC;QACzB,SAAS,CAAC,EAAE,MAAM,CAAC;KACpB,CAAC;CAWH"}
@@ -0,0 +1,256 @@
1
+ /**
2
+ * FindCursor
3
+ *
4
+ * MongoDB風のカーソルAPIを提供します。
5
+ * メソッドチェーンでソート、制限、スキップを設定し、
6
+ * toArray()で結果を取得します。
7
+ *
8
+ * @template TSchema - ドキュメント型
9
+ *
10
+ * @example
11
+ * ```typescript
12
+ * const results = await products
13
+ * .find({ status: 'active', price: { gte: 1000 } })
14
+ * .sort({ price: 'desc', createdAt: 'asc' })
15
+ * .limit(10)
16
+ * .skip(20)
17
+ * .toArray();
18
+ * ```
19
+ */
20
+ export class FindCursor {
21
+ endpoint;
22
+ databaseName;
23
+ collectionName;
24
+ filter;
25
+ authToken;
26
+ authOptions;
27
+ clientOptions;
28
+ getAuthHeaders;
29
+ options;
30
+ executed = false;
31
+ results = [];
32
+ pageInfo;
33
+ /**
34
+ * FindCursorを作成
35
+ *
36
+ * @param endpoint - Lambda Function URL
37
+ * @param databaseName - データベース名
38
+ * @param collectionName - コレクション名
39
+ * @param filter - フィルタ条件
40
+ * @param options - 検索オプション
41
+ * @param authToken - 認証トークン
42
+ * @param authOptions - 認証オプション
43
+ * @param clientOptions - クライアントオプション
44
+ * @param getAuthHeaders - 認証ヘッダー取得関数
45
+ */
46
+ constructor(endpoint, databaseName, collectionName, filter, options = {}, authToken, authOptions, clientOptions, getAuthHeaders) {
47
+ this.endpoint = endpoint;
48
+ this.databaseName = databaseName;
49
+ this.collectionName = collectionName;
50
+ this.filter = filter;
51
+ this.authToken = authToken;
52
+ this.authOptions = authOptions;
53
+ this.clientOptions = clientOptions;
54
+ this.getAuthHeaders = getAuthHeaders;
55
+ this.options = { ...options };
56
+ }
57
+ /**
58
+ * ソート条件を設定
59
+ *
60
+ * 複数のフィールドでソートする場合、オブジェクトのキー順序でソート優先度が決まります。
61
+ * 1または'asc'で昇順、-1または'desc'で降順を指定します。
62
+ *
63
+ * @param sort - ソート条件(例: { price: 'desc', createdAt: 'asc' })
64
+ * @returns this(メソッドチェーン用)
65
+ *
66
+ * @example
67
+ * ```typescript
68
+ * // 価格の降順でソート
69
+ * cursor.sort({ price: 'desc' });
70
+ *
71
+ * // 複数フィールドでソート
72
+ * cursor.sort({ priority: 'desc', createdAt: 'asc' });
73
+ *
74
+ * // 数値形式でも指定可能
75
+ * cursor.sort({ price: -1, createdAt: 1 });
76
+ * ```
77
+ */
78
+ sort(sort) {
79
+ this.options = { ...this.options, sort };
80
+ return this;
81
+ }
82
+ /**
83
+ * 取得件数を制限
84
+ *
85
+ * 返されるドキュメントの最大数を設定します。
86
+ * ページネーション実装時にskip()と組み合わせて使用します。
87
+ *
88
+ * @param limit - 取得件数(正の整数)
89
+ * @returns this(メソッドチェーン用)
90
+ *
91
+ * @example
92
+ * ```typescript
93
+ * // 最初の10件を取得
94
+ * cursor.limit(10);
95
+ *
96
+ * // ページネーション(2ページ目、1ページ10件)
97
+ * cursor.skip(10).limit(10);
98
+ * ```
99
+ */
100
+ limit(limit) {
101
+ this.options = { ...this.options, limit };
102
+ return this;
103
+ }
104
+ /**
105
+ * スキップする件数を設定
106
+ *
107
+ * 指定した件数のドキュメントをスキップします。
108
+ * ページネーション実装時にlimit()と組み合わせて使用します。
109
+ *
110
+ * @param skip - スキップする件数(0以上の整数)
111
+ * @returns this(メソッドチェーン用)
112
+ *
113
+ * @example
114
+ * ```typescript
115
+ * // 最初の20件をスキップ
116
+ * cursor.skip(20);
117
+ *
118
+ * // ページネーション(3ページ目、1ページ10件)
119
+ * cursor.skip(20).limit(10);
120
+ * ```
121
+ */
122
+ skip(skip) {
123
+ this.options = { ...this.options, skip };
124
+ return this;
125
+ }
126
+ /**
127
+ * クエリを実行(内部使用)
128
+ *
129
+ * Lambda Function URLにHTTPリクエストを送信し、結果を取得します。
130
+ * 一度実行されたクエリは再実行されません(結果がキャッシュされます)。
131
+ */
132
+ async execute() {
133
+ if (this.executed) {
134
+ return;
135
+ }
136
+ const requestBody = JSON.stringify({
137
+ operation: 'find',
138
+ database: this.databaseName,
139
+ collection: this.collectionName,
140
+ params: {
141
+ filter: this.filter,
142
+ options: {
143
+ ...this.options,
144
+ },
145
+ },
146
+ });
147
+ let headers = {
148
+ 'Content-Type': 'application/json',
149
+ };
150
+ // 認証ヘッダーを追加(注入された関数を使用)
151
+ if (this.getAuthHeaders) {
152
+ const authHeaders = await this.getAuthHeaders(this.endpoint, requestBody, this.authOptions);
153
+ headers = { ...headers, ...authHeaders };
154
+ }
155
+ // 後方互換性: authTokenが直接指定されている場合(非推奨)
156
+ if (this.authToken && !this.authOptions) {
157
+ headers['Authorization'] = `Bearer ${this.authToken}`;
158
+ }
159
+ // タイムアウト設定
160
+ const controller = new AbortController();
161
+ const timeout = this.clientOptions?.timeout || 30000; // デフォルト30秒
162
+ const timeoutId = setTimeout(() => controller.abort(), timeout);
163
+ try {
164
+ const response = await fetch(this.endpoint, {
165
+ method: 'POST',
166
+ headers,
167
+ body: requestBody,
168
+ signal: controller.signal,
169
+ });
170
+ clearTimeout(timeoutId);
171
+ if (!response.ok) {
172
+ const error = (await response.json().catch(() => ({ message: response.statusText })));
173
+ throw new Error(`Request failed: ${error.message || response.statusText}`);
174
+ }
175
+ const result = (await response.json());
176
+ // Lambda からのレスポンス: { success: true, data: { items: [...], pageInfo: {...}, nextToken?: string } }
177
+ this.results = result.data?.items || result.data?.documents || [];
178
+ this.pageInfo = result.data?.pageInfo
179
+ ? {
180
+ hasNextPage: result.data.pageInfo.hasNextPage,
181
+ hasPreviousPage: result.data.pageInfo.hasPreviousPage,
182
+ nextToken: result.data.nextToken, // nextTokenはpageInfoの外にある
183
+ }
184
+ : undefined;
185
+ this.executed = true;
186
+ }
187
+ catch (error) {
188
+ clearTimeout(timeoutId);
189
+ // タイムアウトエラーの場合
190
+ if (error instanceof Error && error.name === 'AbortError') {
191
+ throw new Error(`Request timeout after ${timeout}ms`);
192
+ }
193
+ throw error;
194
+ }
195
+ }
196
+ /**
197
+ * 配列として取得
198
+ *
199
+ * クエリを実行し、結果をドキュメントの配列として返します。
200
+ * このメソッドを呼び出すまで、実際のHTTPリクエストは送信されません。
201
+ *
202
+ * @returns ドキュメントの配列
203
+ *
204
+ * @example
205
+ * ```typescript
206
+ * const results = await products
207
+ * .find({ status: 'active' })
208
+ * .sort({ price: 'desc' })
209
+ * .limit(10)
210
+ * .toArray();
211
+ *
212
+ * console.log(`Found ${results.length} products`);
213
+ * results.forEach(product => {
214
+ * console.log(product.name, product.price);
215
+ * });
216
+ * ```
217
+ */
218
+ async toArray() {
219
+ if (!this.executed) {
220
+ await this.execute();
221
+ }
222
+ return this.results;
223
+ }
224
+ /**
225
+ * ページネーション情報を取得
226
+ *
227
+ * クエリを実行し、ページネーション情報を返します。
228
+ * 無限スクロールやカーソルベースのページネーションに使用します。
229
+ *
230
+ * @returns ページネーション情報
231
+ *
232
+ * @example
233
+ * ```typescript
234
+ * const cursor = products
235
+ * .find({ status: 'active' })
236
+ * .sort({ price: 'desc' })
237
+ * .limit(10);
238
+ *
239
+ * const results = await cursor.toArray();
240
+ * const pageInfo = await cursor.getPageInfo();
241
+ *
242
+ * console.log(`Has next page: ${pageInfo.hasNextPage}`);
243
+ * console.log(`Next token: ${pageInfo.nextToken}`);
244
+ * ```
245
+ */
246
+ async getPageInfo() {
247
+ if (!this.executed) {
248
+ await this.execute();
249
+ }
250
+ return (this.pageInfo || {
251
+ hasNextPage: false,
252
+ hasPreviousPage: false,
253
+ });
254
+ }
255
+ }
256
+ //# sourceMappingURL=FindCursor.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"FindCursor.js","sourceRoot":"","sources":["../../src/client/FindCursor.ts"],"names":[],"mappings":"AAIA;;;;;;;;;;;;;;;;;;GAkBG;AACH,MAAM,OAAO,UAAU;IAuBX;IACA;IACA;IACA;IAEA;IACA;IACA;IACA;IA3BF,OAAO,CAAc;IACrB,QAAQ,GAAY,KAAK,CAAC;IAC1B,OAAO,GAAc,EAAE,CAAC;IACxB,QAAQ,CAA0E;IAE1F;;;;;;;;;;;;OAYG;IACH,YACU,QAAgB,EAChB,YAAoB,EACpB,cAAsB,EACtB,MAAuB,EAC/B,UAAuB,EAAE,EACjB,SAAkB,EAClB,WAA0B,EAC1B,aAA6B,EAC7B,cAAgD;QARhD,aAAQ,GAAR,QAAQ,CAAQ;QAChB,iBAAY,GAAZ,YAAY,CAAQ;QACpB,mBAAc,GAAd,cAAc,CAAQ;QACtB,WAAM,GAAN,MAAM,CAAiB;QAEvB,cAAS,GAAT,SAAS,CAAS;QAClB,gBAAW,GAAX,WAAW,CAAe;QAC1B,kBAAa,GAAb,aAAa,CAAgB;QAC7B,mBAAc,GAAd,cAAc,CAAkC;QAExD,IAAI,CAAC,OAAO,GAAG,EAAE,GAAG,OAAO,EAAE,CAAC;IAChC,CAAC;IAED;;;;;;;;;;;;;;;;;;;;OAoBG;IACH,IAAI,CAAC,IAA6C;QAChD,IAAI,CAAC,OAAO,GAAG,EAAE,GAAG,IAAI,CAAC,OAAO,EAAE,IAAI,EAAE,CAAC;QACzC,OAAO,IAAI,CAAC;IACd,CAAC;IAED;;;;;;;;;;;;;;;;;OAiBG;IACH,KAAK,CAAC,KAAa;QACjB,IAAI,CAAC,OAAO,GAAG,EAAE,GAAG,IAAI,CAAC,OAAO,EAAE,KAAK,EAAE,CAAC;QAC1C,OAAO,IAAI,CAAC;IACd,CAAC;IAED;;;;;;;;;;;;;;;;;OAiBG;IACH,IAAI,CAAC,IAAY;QACf,IAAI,CAAC,OAAO,GAAG,EAAE,GAAG,IAAI,CAAC,OAAO,EAAE,IAAI,EAAE,CAAC;QACzC,OAAO,IAAI,CAAC;IACd,CAAC;IAED;;;;;OAKG;IACK,KAAK,CAAC,OAAO;QACnB,IAAI,IAAI,CAAC,QAAQ,EAAE,CAAC;YAClB,OAAO;QACT,CAAC;QAED,MAAM,WAAW,GAAG,IAAI,CAAC,SAAS,CAAC;YACjC,SAAS,EAAE,MAAM;YACjB,QAAQ,EAAE,IAAI,CAAC,YAAY;YAC3B,UAAU,EAAE,IAAI,CAAC,cAAc;YAC/B,MAAM,EAAE;gBACN,MAAM,EAAE,IAAI,CAAC,MAAM;gBACnB,OAAO,EAAE;oBACP,GAAG,IAAI,CAAC,OAAO;iBAChB;aACF;SACF,CAAC,CAAC;QAEH,IAAI,OAAO,GAA2B;YACpC,cAAc,EAAE,kBAAkB;SACnC,CAAC;QAEF,wBAAwB;QACxB,IAAI,IAAI,CAAC,cAAc,EAAE,CAAC;YACxB,MAAM,WAAW,GAAG,MAAM,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC,QAAQ,EAAE,WAAW,EAAE,IAAI,CAAC,WAAW,CAAC,CAAC;YAC5F,OAAO,GAAG,EAAE,GAAG,OAAO,EAAE,GAAG,WAAW,EAAE,CAAC;QAC3C,CAAC;QAED,oCAAoC;QACpC,IAAI,IAAI,CAAC,SAAS,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC;YACxC,OAAO,CAAC,eAAe,CAAC,GAAG,UAAU,IAAI,CAAC,SAAS,EAAE,CAAC;QACxD,CAAC;QAED,WAAW;QACX,MAAM,UAAU,GAAG,IAAI,eAAe,EAAE,CAAC;QACzC,MAAM,OAAO,GAAG,IAAI,CAAC,aAAa,EAAE,OAAO,IAAI,KAAK,CAAC,CAAC,WAAW;QACjE,MAAM,SAAS,GAAG,UAAU,CAAC,GAAG,EAAE,CAAC,UAAU,CAAC,KAAK,EAAE,EAAE,OAAO,CAAC,CAAC;QAEhE,IAAI,CAAC;YACH,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,IAAI,CAAC,QAAQ,EAAE;gBAC1C,MAAM,EAAE,MAAM;gBACd,OAAO;gBACP,IAAI,EAAE,WAAW;gBACjB,MAAM,EAAE,UAAU,CAAC,MAAM;aAC1B,CAAC,CAAC;YAEH,YAAY,CAAC,SAAS,CAAC,CAAC;YAExB,IAAI,CAAC,QAAQ,CAAC,EAAE,EAAE,CAAC;gBACjB,MAAM,KAAK,GAAG,CAAC,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,CAAC,EAAE,OAAO,EAAE,QAAQ,CAAC,UAAU,EAAE,CAAC,CAAC,CAEnF,CAAC;gBACF,MAAM,IAAI,KAAK,CAAC,mBAAmB,KAAK,CAAC,OAAO,IAAI,QAAQ,CAAC,UAAU,EAAE,CAAC,CAAC;YAC7E,CAAC;YAED,MAAM,MAAM,GAAG,CAAC,MAAM,QAAQ,CAAC,IAAI,EAAE,CAUpC,CAAC;YACF,kGAAkG;YAClG,IAAI,CAAC,OAAO,GAAG,MAAM,CAAC,IAAI,EAAE,KAAK,IAAI,MAAM,CAAC,IAAI,EAAE,SAAS,IAAI,EAAE,CAAC;YAClE,IAAI,CAAC,QAAQ,GAAG,MAAM,CAAC,IAAI,EAAE,QAAQ;gBACnC,CAAC,CAAC;oBACE,WAAW,EAAE,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC,WAAW;oBAC7C,eAAe,EAAE,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC,eAAe;oBACrD,SAAS,EAAE,MAAM,CAAC,IAAI,CAAC,SAAS,EAAE,0BAA0B;iBAC7D;gBACH,CAAC,CAAC,SAAS,CAAC;YACd,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC;QACvB,CAAC;QAAC,OAAO,KAAc,EAAE,CAAC;YACxB,YAAY,CAAC,SAAS,CAAC,CAAC;YAExB,eAAe;YACf,IAAI,KAAK,YAAY,KAAK,IAAI,KAAK,CAAC,IAAI,KAAK,YAAY,EAAE,CAAC;gBAC1D,MAAM,IAAI,KAAK,CAAC,yBAAyB,OAAO,IAAI,CAAC,CAAC;YACxD,CAAC;YAED,MAAM,KAAK,CAAC;QACd,CAAC;IACH,CAAC;IAED;;;;;;;;;;;;;;;;;;;;;OAqBG;IACH,KAAK,CAAC,OAAO;QACX,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,CAAC;YACnB,MAAM,IAAI,CAAC,OAAO,EAAE,CAAC;QACvB,CAAC;QACD,OAAO,IAAI,CAAC,OAAO,CAAC;IACtB,CAAC;IAED;;;;;;;;;;;;;;;;;;;;;OAqBG;IACH,KAAK,CAAC,WAAW;QAKf,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,CAAC;YACnB,MAAM,IAAI,CAAC,OAAO,EAAE,CAAC;QACvB,CAAC;QACD,OAAO,CACL,IAAI,CAAC,QAAQ,IAAI;YACf,WAAW,EAAE,KAAK;YAClB,eAAe,EAAE,KAAK;SACvB,CACF,CAAC;IACJ,CAAC;CACF"}
@@ -0,0 +1,10 @@
1
+ /**
2
+ * AWS SigV4 署名を生成してリクエストに追加
3
+ *
4
+ * @param url - リクエスト URL
5
+ * @param body - リクエストボディ
6
+ * @param region - AWS リージョン
7
+ * @returns 署名済みヘッダー
8
+ */
9
+ export declare function signRequest(url: string, body: string, region: string): Promise<Record<string, string>>;
10
+ //# sourceMappingURL=aws-sigv4.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"aws-sigv4.d.ts","sourceRoot":"","sources":["../../src/client/aws-sigv4.ts"],"names":[],"mappings":"AAWA;;;;;;;GAOG;AACH,wBAAsB,WAAW,CAC/B,GAAG,EAAE,MAAM,EACX,IAAI,EAAE,MAAM,EACZ,MAAM,EAAE,MAAM,GACb,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAyCjC"}
@@ -0,0 +1,54 @@
1
+ /**
2
+ * AWS Signature Version 4 署名ユーティリティ
3
+ *
4
+ * IAM 認証で Lambda Function URL にリクエストを送信する際に使用します。
5
+ */
6
+ import { Sha256 } from '@aws-crypto/sha256-js';
7
+ import { HttpRequest } from '@smithy/protocol-http';
8
+ import { SignatureV4 } from '@smithy/signature-v4';
9
+ import { defaultProvider } from '@aws-sdk/credential-provider-node';
10
+ /**
11
+ * AWS SigV4 署名を生成してリクエストに追加
12
+ *
13
+ * @param url - リクエスト URL
14
+ * @param body - リクエストボディ
15
+ * @param region - AWS リージョン
16
+ * @returns 署名済みヘッダー
17
+ */
18
+ export async function signRequest(url, body, region) {
19
+ const parsedUrl = new URL(url);
20
+ // HttpRequest を作成
21
+ const request = new HttpRequest({
22
+ method: 'POST',
23
+ protocol: parsedUrl.protocol,
24
+ hostname: parsedUrl.hostname,
25
+ path: parsedUrl.pathname,
26
+ headers: {
27
+ 'Content-Type': 'application/json',
28
+ host: parsedUrl.hostname,
29
+ },
30
+ body,
31
+ });
32
+ // SignatureV4 インスタンスを作成
33
+ const signer = new SignatureV4({
34
+ service: 'lambda',
35
+ region,
36
+ credentials: defaultProvider(),
37
+ sha256: Sha256,
38
+ });
39
+ // リクエストに署名
40
+ const signedRequest = await signer.sign(request);
41
+ // ヘッダーを抽出(ヘッダー名を正規化)
42
+ const headers = {};
43
+ for (const [key, value] of Object.entries(signedRequest.headers)) {
44
+ if (typeof value === 'string') {
45
+ // Authorization ヘッダーは大文字にする(fetch API の制限対策)
46
+ const headerName = key.toLowerCase() === 'authorization' ? 'Authorization' : key;
47
+ headers[headerName] = value;
48
+ }
49
+ }
50
+ // デバッグ: 署名済みヘッダーをログ出力
51
+ console.log('AWS SigV4 signed headers:', Object.keys(headers));
52
+ return headers;
53
+ }
54
+ //# sourceMappingURL=aws-sigv4.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"aws-sigv4.js","sourceRoot":"","sources":["../../src/client/aws-sigv4.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AACH,OAAO,EAAE,MAAM,EAAE,MAAM,uBAAuB,CAAC;AAC/C,OAAO,EAAE,WAAW,EAAE,MAAM,uBAAuB,CAAC;AACpD,OAAO,EAAE,WAAW,EAAE,MAAM,sBAAsB,CAAC;AAEnD,OAAO,EAAE,eAAe,EAAE,MAAM,mCAAmC,CAAC;AAEpE;;;;;;;GAOG;AACH,MAAM,CAAC,KAAK,UAAU,WAAW,CAC/B,GAAW,EACX,IAAY,EACZ,MAAc;IAEd,MAAM,SAAS,GAAG,IAAI,GAAG,CAAC,GAAG,CAAC,CAAC;IAE/B,kBAAkB;IAClB,MAAM,OAAO,GAAG,IAAI,WAAW,CAAC;QAC9B,MAAM,EAAE,MAAM;QACd,QAAQ,EAAE,SAAS,CAAC,QAAQ;QAC5B,QAAQ,EAAE,SAAS,CAAC,QAAQ;QAC5B,IAAI,EAAE,SAAS,CAAC,QAAQ;QACxB,OAAO,EAAE;YACP,cAAc,EAAE,kBAAkB;YAClC,IAAI,EAAE,SAAS,CAAC,QAAQ;SACzB;QACD,IAAI;KACL,CAAC,CAAC;IAEH,wBAAwB;IACxB,MAAM,MAAM,GAAG,IAAI,WAAW,CAAC;QAC7B,OAAO,EAAE,QAAQ;QACjB,MAAM;QACN,WAAW,EAAE,eAAe,EAAE;QAC9B,MAAM,EAAE,MAAM;KACf,CAAC,CAAC;IAEH,WAAW;IACX,MAAM,aAAa,GAAG,MAAM,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;IAEjD,qBAAqB;IACrB,MAAM,OAAO,GAA2B,EAAE,CAAC;IAC3C,KAAK,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,aAAa,CAAC,OAAO,CAAC,EAAE,CAAC;QACjE,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE,CAAC;YAC9B,6CAA6C;YAC7C,MAAM,UAAU,GAAG,GAAG,CAAC,WAAW,EAAE,KAAK,eAAe,CAAC,CAAC,CAAC,eAAe,CAAC,CAAC,CAAC,GAAG,CAAC;YACjF,OAAO,CAAC,UAAU,CAAC,GAAG,KAAK,CAAC;QAC9B,CAAC;IACH,CAAC;IAED,sBAAsB;IACtB,OAAO,CAAC,GAAG,CAAC,2BAA2B,EAAE,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC;IAE/D,OAAO,OAAO,CAAC;AACjB,CAAC"}
@@ -0,0 +1,34 @@
1
+ /**
2
+ * DynamoDBクライアントSDK(Cognito認証用)
3
+ *
4
+ * Lambda Function URL経由でDynamoDBにアクセスするHTTPクライアント。
5
+ * Cognito認証(動的トークン取得)を使用します。
6
+ */
7
+ import { type ClientOptions as BaseClientOptions, DynamoClient as BaseDynamoClient } from './DynamoClient.js';
8
+ export { Database } from './Database.js';
9
+ export { Collection } from './Collection.js';
10
+ export { FindCursor } from './FindCursor.js';
11
+ /**
12
+ * Cognito認証オプション
13
+ */
14
+ export interface CognitoAuthOptions {
15
+ /** トークン取得関数(必須) */
16
+ getToken: () => Promise<string>;
17
+ }
18
+ /**
19
+ * クライアントオプション(Cognito認証用)
20
+ */
21
+ export interface ClientOptions extends Omit<BaseClientOptions<CognitoAuthOptions>, 'auth'> {
22
+ /** Cognito認証設定(必須) */
23
+ auth: CognitoAuthOptions;
24
+ }
25
+ /**
26
+ * DynamoDBクライアント(Cognito認証用)
27
+ *
28
+ * Cognito認証を使用してLambda Function URLにアクセスします。
29
+ * トークンは動的に取得されます。
30
+ */
31
+ export declare class DynamoClient extends BaseDynamoClient<CognitoAuthOptions> {
32
+ constructor(endpoint: string, options: ClientOptions);
33
+ }
34
+ //# sourceMappingURL=index.cognito.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.cognito.d.ts","sourceRoot":"","sources":["../../src/client/index.cognito.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AACH,OAAO,EACL,KAAK,aAAa,IAAI,iBAAiB,EACvC,YAAY,IAAI,gBAAgB,EACjC,MAAM,mBAAmB,CAAC;AAE3B,OAAO,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;AACzC,OAAO,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAC7C,OAAO,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAE7C;;GAEG;AACH,MAAM,WAAW,kBAAkB;IACjC,mBAAmB;IACnB,QAAQ,EAAE,MAAM,OAAO,CAAC,MAAM,CAAC,CAAC;CACjC;AAED;;GAEG;AACH,MAAM,WAAW,aAAc,SAAQ,IAAI,CAAC,iBAAiB,CAAC,kBAAkB,CAAC,EAAE,MAAM,CAAC;IACxF,sBAAsB;IACtB,IAAI,EAAE,kBAAkB,CAAC;CAC1B;AAED;;;;;GAKG;AACH,qBAAa,YAAa,SAAQ,gBAAgB,CAAC,kBAAkB,CAAC;gBACxD,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE,aAAa;CAWrD"}