@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.
- package/CHANGELOG.md +41 -0
- package/LICENSE +21 -0
- package/README.md +283 -0
- package/dist/client/Collection.d.ts +57 -0
- package/dist/client/Collection.d.ts.map +1 -0
- package/dist/client/Collection.js +174 -0
- package/dist/client/Collection.js.map +1 -0
- package/dist/client/Database.d.ts +35 -0
- package/dist/client/Database.d.ts.map +1 -0
- package/dist/client/Database.js +48 -0
- package/dist/client/Database.js.map +1 -0
- package/dist/client/DynamoClient.d.ts +43 -0
- package/dist/client/DynamoClient.d.ts.map +1 -0
- package/dist/client/DynamoClient.js +62 -0
- package/dist/client/DynamoClient.js.map +1 -0
- package/dist/client/FindCursor.d.ts +174 -0
- package/dist/client/FindCursor.d.ts.map +1 -0
- package/dist/client/FindCursor.js +256 -0
- package/dist/client/FindCursor.js.map +1 -0
- package/dist/client/aws-sigv4.d.ts +10 -0
- package/dist/client/aws-sigv4.d.ts.map +1 -0
- package/dist/client/aws-sigv4.js +54 -0
- package/dist/client/aws-sigv4.js.map +1 -0
- package/dist/client/index.cognito.d.ts +34 -0
- package/dist/client/index.cognito.d.ts.map +1 -0
- package/dist/client/index.cognito.js +30 -0
- package/dist/client/index.cognito.js.map +1 -0
- package/dist/client/index.d.ts +12 -0
- package/dist/client/index.d.ts.map +1 -0
- package/dist/client/index.iam.d.ts +34 -0
- package/dist/client/index.iam.d.ts.map +1 -0
- package/dist/client/index.iam.js +28 -0
- package/dist/client/index.iam.js.map +1 -0
- package/dist/client/index.js +12 -0
- package/dist/client/index.js.map +1 -0
- package/dist/client/index.token.d.ts +33 -0
- package/dist/client/index.token.d.ts.map +1 -0
- package/dist/client/index.token.js +28 -0
- package/dist/client/index.token.js.map +1 -0
- package/dist/dynamodb.d.ts +20 -0
- package/dist/dynamodb.d.ts.map +1 -0
- package/dist/dynamodb.js +31 -0
- package/dist/dynamodb.js.map +1 -0
- package/dist/errors.d.ts +100 -0
- package/dist/errors.d.ts.map +1 -0
- package/dist/errors.js +146 -0
- package/dist/errors.js.map +1 -0
- package/dist/index.d.ts +10 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +7 -0
- package/dist/index.js.map +1 -0
- package/dist/integrations/react-admin/dataProvider.d.ts +59 -0
- package/dist/integrations/react-admin/dataProvider.d.ts.map +1 -0
- package/dist/integrations/react-admin/dataProvider.js +364 -0
- package/dist/integrations/react-admin/dataProvider.js.map +1 -0
- package/dist/integrations/react-admin/index.d.ts +24 -0
- package/dist/integrations/react-admin/index.d.ts.map +1 -0
- package/dist/integrations/react-admin/index.js +23 -0
- package/dist/integrations/react-admin/index.js.map +1 -0
- package/dist/integrations/react-admin/types.d.ts +47 -0
- package/dist/integrations/react-admin/types.d.ts.map +1 -0
- package/dist/integrations/react-admin/types.js +5 -0
- package/dist/integrations/react-admin/types.js.map +1 -0
- package/dist/logger.d.ts +61 -0
- package/dist/logger.d.ts.map +1 -0
- package/dist/logger.js +87 -0
- package/dist/logger.js.map +1 -0
- package/dist/scripts/repair-shadows.d.ts +3 -0
- package/dist/scripts/repair-shadows.d.ts.map +1 -0
- package/dist/scripts/repair-shadows.js +190 -0
- package/dist/scripts/repair-shadows.js.map +1 -0
- package/dist/server/handler.cjs +31378 -0
- package/dist/server/handler.cjs.map +7 -0
- package/dist/server/handler.d.ts +18 -0
- package/dist/server/handler.d.ts.map +1 -0
- package/dist/server/handler.js +435 -0
- package/dist/server/handler.js.map +1 -0
- package/dist/server/handler.zip +0 -0
- package/dist/server/index.d.ts +8 -0
- package/dist/server/index.d.ts.map +1 -0
- package/dist/server/index.js +8 -0
- package/dist/server/index.js.map +1 -0
- package/dist/server/operations/deleteMany.d.ts +18 -0
- package/dist/server/operations/deleteMany.d.ts.map +1 -0
- package/dist/server/operations/deleteMany.js +222 -0
- package/dist/server/operations/deleteMany.js.map +1 -0
- package/dist/server/operations/deleteOne.d.ts +17 -0
- package/dist/server/operations/deleteOne.d.ts.map +1 -0
- package/dist/server/operations/deleteOne.js +87 -0
- package/dist/server/operations/deleteOne.js.map +1 -0
- package/dist/server/operations/find.d.ts +18 -0
- package/dist/server/operations/find.d.ts.map +1 -0
- package/dist/server/operations/find.js +382 -0
- package/dist/server/operations/find.js.map +1 -0
- package/dist/server/operations/findMany.d.ts +13 -0
- package/dist/server/operations/findMany.d.ts.map +1 -0
- package/dist/server/operations/findMany.js +61 -0
- package/dist/server/operations/findMany.js.map +1 -0
- package/dist/server/operations/findManyReference.d.ts +18 -0
- package/dist/server/operations/findManyReference.d.ts.map +1 -0
- package/dist/server/operations/findManyReference.js +150 -0
- package/dist/server/operations/findManyReference.js.map +1 -0
- package/dist/server/operations/findOne.d.ts +14 -0
- package/dist/server/operations/findOne.d.ts.map +1 -0
- package/dist/server/operations/findOne.js +56 -0
- package/dist/server/operations/findOne.js.map +1 -0
- package/dist/server/operations/insertMany.d.ts +19 -0
- package/dist/server/operations/insertMany.d.ts.map +1 -0
- package/dist/server/operations/insertMany.js +243 -0
- package/dist/server/operations/insertMany.js.map +1 -0
- package/dist/server/operations/insertOne.d.ts +18 -0
- package/dist/server/operations/insertOne.d.ts.map +1 -0
- package/dist/server/operations/insertOne.js +85 -0
- package/dist/server/operations/insertOne.js.map +1 -0
- package/dist/server/operations/updateMany.d.ts +20 -0
- package/dist/server/operations/updateMany.d.ts.map +1 -0
- package/dist/server/operations/updateMany.js +316 -0
- package/dist/server/operations/updateMany.js.map +1 -0
- package/dist/server/operations/updateOne.d.ts +20 -0
- package/dist/server/operations/updateOne.d.ts.map +1 -0
- package/dist/server/operations/updateOne.js +159 -0
- package/dist/server/operations/updateOne.js.map +1 -0
- package/dist/server/query/converter.d.ts +85 -0
- package/dist/server/query/converter.d.ts.map +1 -0
- package/dist/server/query/converter.js +161 -0
- package/dist/server/query/converter.js.map +1 -0
- package/dist/server/query/index.d.ts +5 -0
- package/dist/server/query/index.d.ts.map +1 -0
- package/dist/server/query/index.js +5 -0
- package/dist/server/query/index.js.map +1 -0
- package/dist/server/shadow/config.d.ts +147 -0
- package/dist/server/shadow/config.d.ts.map +1 -0
- package/dist/server/shadow/config.js +162 -0
- package/dist/server/shadow/config.js.map +1 -0
- package/dist/server/shadow/differ.d.ts +42 -0
- package/dist/server/shadow/differ.d.ts.map +1 -0
- package/dist/server/shadow/differ.js +66 -0
- package/dist/server/shadow/differ.js.map +1 -0
- package/dist/server/shadow/generator.d.ts +104 -0
- package/dist/server/shadow/generator.d.ts.map +1 -0
- package/dist/server/shadow/generator.js +148 -0
- package/dist/server/shadow/generator.js.map +1 -0
- package/dist/server/shadow/index.d.ts +11 -0
- package/dist/server/shadow/index.d.ts.map +1 -0
- package/dist/server/shadow/index.js +11 -0
- package/dist/server/shadow/index.js.map +1 -0
- package/dist/server/shadow/types.d.ts +44 -0
- package/dist/server/shadow/types.d.ts.map +1 -0
- package/dist/server/shadow/types.js +2 -0
- package/dist/server/shadow/types.js.map +1 -0
- package/dist/server/types.d.ts +295 -0
- package/dist/server/types.d.ts.map +1 -0
- package/dist/server/types.js +7 -0
- package/dist/server/types.js.map +1 -0
- package/dist/server/utils/auth.d.ts +43 -0
- package/dist/server/utils/auth.d.ts.map +1 -0
- package/dist/server/utils/auth.js +123 -0
- package/dist/server/utils/auth.js.map +1 -0
- package/dist/server/utils/bulkOperations.d.ts +81 -0
- package/dist/server/utils/bulkOperations.d.ts.map +1 -0
- package/dist/server/utils/bulkOperations.js +147 -0
- package/dist/server/utils/bulkOperations.js.map +1 -0
- package/dist/server/utils/chunking.d.ts +96 -0
- package/dist/server/utils/chunking.d.ts.map +1 -0
- package/dist/server/utils/chunking.js +225 -0
- package/dist/server/utils/chunking.js.map +1 -0
- package/dist/server/utils/dynamodb.d.ts +41 -0
- package/dist/server/utils/dynamodb.d.ts.map +1 -0
- package/dist/server/utils/dynamodb.js +83 -0
- package/dist/server/utils/dynamodb.js.map +1 -0
- package/dist/server/utils/filter.d.ts +152 -0
- package/dist/server/utils/filter.d.ts.map +1 -0
- package/dist/server/utils/filter.js +270 -0
- package/dist/server/utils/filter.js.map +1 -0
- package/dist/server/utils/pagination.d.ts +27 -0
- package/dist/server/utils/pagination.d.ts.map +1 -0
- package/dist/server/utils/pagination.js +56 -0
- package/dist/server/utils/pagination.js.map +1 -0
- package/dist/server/utils/timestamps.d.ts +31 -0
- package/dist/server/utils/timestamps.d.ts.map +1 -0
- package/dist/server/utils/timestamps.js +84 -0
- package/dist/server/utils/timestamps.js.map +1 -0
- package/dist/server/utils/ttl.d.ts +17 -0
- package/dist/server/utils/ttl.d.ts.map +1 -0
- package/dist/server/utils/ttl.js +62 -0
- package/dist/server/utils/ttl.js.map +1 -0
- package/dist/server/utils/validation.d.ts +40 -0
- package/dist/server/utils/validation.d.ts.map +1 -0
- package/dist/server/utils/validation.js +54 -0
- package/dist/server/utils/validation.js.map +1 -0
- package/dist/shadows/config.d.ts +54 -0
- package/dist/shadows/config.d.ts.map +1 -0
- package/dist/shadows/config.js +95 -0
- package/dist/shadows/config.js.map +1 -0
- package/dist/shadows/differ.d.ts +42 -0
- package/dist/shadows/differ.d.ts.map +1 -0
- package/dist/shadows/differ.js +66 -0
- package/dist/shadows/differ.js.map +1 -0
- package/dist/shadows/generator.d.ts +63 -0
- package/dist/shadows/generator.d.ts.map +1 -0
- package/dist/shadows/generator.js +107 -0
- package/dist/shadows/generator.js.map +1 -0
- package/dist/shadows/index.d.ts +15 -0
- package/dist/shadows/index.d.ts.map +1 -0
- package/dist/shadows/index.js +17 -0
- package/dist/shadows/index.js.map +1 -0
- package/dist/shadows/types.d.ts +44 -0
- package/dist/shadows/types.d.ts.map +1 -0
- package/dist/shadows/types.js +2 -0
- package/dist/shadows/types.js.map +1 -0
- package/dist/types.d.ts +165 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +2 -0
- package/dist/types.js.map +1 -0
- package/dist/ulid.d.ts +46 -0
- package/dist/ulid.d.ts.map +1 -0
- package/dist/ulid.js +66 -0
- package/dist/ulid.js.map +1 -0
- package/package.json +136 -0
- package/terraform/README.md +222 -0
- package/terraform/examples/advanced/README.md +129 -0
- package/terraform/examples/advanced/main.tf +158 -0
- package/terraform/examples/advanced/shadow.config.json +35 -0
- package/terraform/examples/advanced/variables.tf +28 -0
- package/terraform/examples/basic/README.md +53 -0
- package/terraform/examples/basic/main.tf +99 -0
- package/terraform/examples/basic/variables.tf +17 -0
- package/terraform/main.tf +159 -0
- package/terraform/outputs.tf +56 -0
- 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":"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"}
|
|
@@ -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"}
|