@procedures/s3 0.0.0-stage → 0.2.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 (80) hide show
  1. package/CHANGELOG.md +25 -0
  2. package/LICENSE +21 -0
  3. package/README.md +886 -2
  4. package/dist/.tsbuildinfo +1 -0
  5. package/dist/index.d.ts +18 -0
  6. package/dist/index.d.ts.map +1 -0
  7. package/dist/index.js +20 -0
  8. package/dist/index.js.map +1 -0
  9. package/dist/module.d.ts +22 -0
  10. package/dist/module.d.ts.map +1 -0
  11. package/dist/module.js +173 -0
  12. package/dist/module.js.map +1 -0
  13. package/dist/procedures/s3/delete.d.ts +26 -0
  14. package/dist/procedures/s3/delete.d.ts.map +1 -0
  15. package/dist/procedures/s3/delete.js +40 -0
  16. package/dist/procedures/s3/delete.js.map +1 -0
  17. package/dist/procedures/s3/download.d.ts +36 -0
  18. package/dist/procedures/s3/download.d.ts.map +1 -0
  19. package/dist/procedures/s3/download.js +143 -0
  20. package/dist/procedures/s3/download.js.map +1 -0
  21. package/dist/procedures/s3/index.d.ts +13 -0
  22. package/dist/procedures/s3/index.d.ts.map +1 -0
  23. package/dist/procedures/s3/index.js +13 -0
  24. package/dist/procedures/s3/index.js.map +1 -0
  25. package/dist/procedures/s3/list-all.d.ts +24 -0
  26. package/dist/procedures/s3/list-all.d.ts.map +1 -0
  27. package/dist/procedures/s3/list-all.js +57 -0
  28. package/dist/procedures/s3/list-all.js.map +1 -0
  29. package/dist/procedures/s3/list.d.ts +28 -0
  30. package/dist/procedures/s3/list.d.ts.map +1 -0
  31. package/dist/procedures/s3/list.js +56 -0
  32. package/dist/procedures/s3/list.js.map +1 -0
  33. package/dist/procedures/s3/multipart-abort.d.ts +21 -0
  34. package/dist/procedures/s3/multipart-abort.d.ts.map +1 -0
  35. package/dist/procedures/s3/multipart-abort.js +33 -0
  36. package/dist/procedures/s3/multipart-abort.js.map +1 -0
  37. package/dist/procedures/s3/multipart-complete.d.ts +26 -0
  38. package/dist/procedures/s3/multipart-complete.d.ts.map +1 -0
  39. package/dist/procedures/s3/multipart-complete.js +51 -0
  40. package/dist/procedures/s3/multipart-complete.js.map +1 -0
  41. package/dist/procedures/s3/multipart-init.d.ts +24 -0
  42. package/dist/procedures/s3/multipart-init.d.ts.map +1 -0
  43. package/dist/procedures/s3/multipart-init.js +42 -0
  44. package/dist/procedures/s3/multipart-init.js.map +1 -0
  45. package/dist/procedures/s3/multipart-upload.d.ts +24 -0
  46. package/dist/procedures/s3/multipart-upload.d.ts.map +1 -0
  47. package/dist/procedures/s3/multipart-upload.js +44 -0
  48. package/dist/procedures/s3/multipart-upload.js.map +1 -0
  49. package/dist/procedures/s3/upload.d.ts +30 -0
  50. package/dist/procedures/s3/upload.d.ts.map +1 -0
  51. package/dist/procedures/s3/upload.js +50 -0
  52. package/dist/procedures/s3/upload.js.map +1 -0
  53. package/dist/register.d.ts +7 -0
  54. package/dist/register.d.ts.map +1 -0
  55. package/dist/register.js +9 -0
  56. package/dist/register.js.map +1 -0
  57. package/dist/s3-client.d.ts +38 -0
  58. package/dist/s3-client.d.ts.map +1 -0
  59. package/dist/s3-client.js +83 -0
  60. package/dist/s3-client.js.map +1 -0
  61. package/dist/types.d.ts +198 -0
  62. package/dist/types.d.ts.map +1 -0
  63. package/dist/types.js +197 -0
  64. package/dist/types.js.map +1 -0
  65. package/package.json +80 -3
  66. package/src/index.ts +72 -0
  67. package/src/module.ts +234 -0
  68. package/src/procedures/s3/delete.ts +45 -0
  69. package/src/procedures/s3/download.ts +155 -0
  70. package/src/procedures/s3/index.ts +13 -0
  71. package/src/procedures/s3/list-all.ts +63 -0
  72. package/src/procedures/s3/list.ts +63 -0
  73. package/src/procedures/s3/multipart-abort.ts +40 -0
  74. package/src/procedures/s3/multipart-complete.ts +58 -0
  75. package/src/procedures/s3/multipart-init.ts +50 -0
  76. package/src/procedures/s3/multipart-upload.ts +53 -0
  77. package/src/procedures/s3/upload.ts +56 -0
  78. package/src/register.ts +11 -0
  79. package/src/s3-client.ts +94 -0
  80. package/src/types.ts +425 -0
@@ -0,0 +1,18 @@
1
+ /**
2
+ * client-s3 - AWS S3 procedures for the client ecosystem
3
+ *
4
+ * Provides upload, download, list, delete, and multipart upload operations.
5
+ * Credentials are loaded from environment variables (all optional — when the
6
+ * static keys are absent the AWS SDK default credential provider chain is used):
7
+ * - AWS_ACCESS_KEY_ID (optional; pair with AWS_SECRET_ACCESS_KEY)
8
+ * - AWS_SECRET_ACCESS_KEY (optional)
9
+ * - AWS_SESSION_TOKEN (optional, for STS/SSO temporary credentials)
10
+ * - AWS_REGION (optional, defaults to us-east-1)
11
+ * - S3_ENDPOINT (optional, for MinIO/LocalStack)
12
+ */
13
+ export * from "./module.js";
14
+ export type { S3Config, S3UploadInput, S3UploadOutput, S3DownloadInput, S3DownloadOutput, S3ListInput, S3ListOutput, S3ListObject, S3ListAllInput, S3ListAllOutput, S3DeleteInput, S3DeleteOutput, S3MultipartInitInput, S3MultipartInitOutput, S3MultipartUploadInput, S3MultipartUploadOutput, S3MultipartCompleteInput, S3MultipartCompleteOutput, S3MultipartAbortInput, S3MultipartAbortOutput, } from "./types.js";
15
+ export { S3UploadInputSchema, S3DownloadInputSchema, S3ListInputSchema, S3ListAllInputSchema, S3DeleteInputSchema, S3MultipartInitInputSchema, S3MultipartUploadInputSchema, S3MultipartCompleteInputSchema, S3MultipartAbortInputSchema, } from "./types.js";
16
+ export { getS3Config, createS3Client, getS3Client, resetS3Client, } from "./s3-client.js";
17
+ export { s3Upload, s3Download, s3List, s3ListAll, s3Delete, s3MultipartInit, s3MultipartUpload, s3MultipartComplete, s3MultipartAbort, } from "./procedures/s3/index.js";
18
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAEH,cAAc,aAAa,CAAC;AAG5B,YAAY,EACV,QAAQ,EACR,aAAa,EACb,cAAc,EACd,eAAe,EACf,gBAAgB,EAChB,WAAW,EACX,YAAY,EACZ,YAAY,EACZ,cAAc,EACd,eAAe,EACf,aAAa,EACb,cAAc,EACd,oBAAoB,EACpB,qBAAqB,EACrB,sBAAsB,EACtB,uBAAuB,EACvB,wBAAwB,EACxB,yBAAyB,EACzB,qBAAqB,EACrB,sBAAsB,GACvB,MAAM,YAAY,CAAC;AAGpB,OAAO,EACL,mBAAmB,EACnB,qBAAqB,EACrB,iBAAiB,EACjB,oBAAoB,EACpB,mBAAmB,EACnB,0BAA0B,EAC1B,4BAA4B,EAC5B,8BAA8B,EAC9B,2BAA2B,GAC5B,MAAM,YAAY,CAAC;AAGpB,OAAO,EACL,WAAW,EACX,cAAc,EACd,WAAW,EACX,aAAa,GACd,MAAM,gBAAgB,CAAC;AAGxB,OAAO,EACL,QAAQ,EACR,UAAU,EACV,MAAM,EACN,SAAS,EACT,QAAQ,EACR,eAAe,EACf,iBAAiB,EACjB,mBAAmB,EACnB,gBAAgB,GACjB,MAAM,0BAA0B,CAAC"}
package/dist/index.js ADDED
@@ -0,0 +1,20 @@
1
+ /**
2
+ * client-s3 - AWS S3 procedures for the client ecosystem
3
+ *
4
+ * Provides upload, download, list, delete, and multipart upload operations.
5
+ * Credentials are loaded from environment variables (all optional — when the
6
+ * static keys are absent the AWS SDK default credential provider chain is used):
7
+ * - AWS_ACCESS_KEY_ID (optional; pair with AWS_SECRET_ACCESS_KEY)
8
+ * - AWS_SECRET_ACCESS_KEY (optional)
9
+ * - AWS_SESSION_TOKEN (optional, for STS/SSO temporary credentials)
10
+ * - AWS_REGION (optional, defaults to us-east-1)
11
+ * - S3_ENDPOINT (optional, for MinIO/LocalStack)
12
+ */
13
+ export * from "./module.js";
14
+ // Re-export schemas for external use
15
+ export { S3UploadInputSchema, S3DownloadInputSchema, S3ListInputSchema, S3ListAllInputSchema, S3DeleteInputSchema, S3MultipartInitInputSchema, S3MultipartUploadInputSchema, S3MultipartCompleteInputSchema, S3MultipartAbortInputSchema, } from "./types.js";
16
+ // Re-export S3 client utilities
17
+ export { getS3Config, createS3Client, getS3Client, resetS3Client, } from "./s3-client.js";
18
+ // Re-export procedure implementations for direct use
19
+ export { s3Upload, s3Download, s3List, s3ListAll, s3Delete, s3MultipartInit, s3MultipartUpload, s3MultipartComplete, s3MultipartAbort, } from "./procedures/s3/index.js";
20
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAEH,cAAc,aAAa,CAAC;AA0B5B,qCAAqC;AACrC,OAAO,EACL,mBAAmB,EACnB,qBAAqB,EACrB,iBAAiB,EACjB,oBAAoB,EACpB,mBAAmB,EACnB,0BAA0B,EAC1B,4BAA4B,EAC5B,8BAA8B,EAC9B,2BAA2B,GAC5B,MAAM,YAAY,CAAC;AAEpB,gCAAgC;AAChC,OAAO,EACL,WAAW,EACX,cAAc,EACd,WAAW,EACX,aAAa,GACd,MAAM,gBAAgB,CAAC;AAExB,qDAAqD;AACrD,OAAO,EACL,QAAQ,EACR,UAAU,EACV,MAAM,EACN,SAAS,EACT,QAAQ,EACR,eAAe,EACf,iBAAiB,EACjB,mBAAmB,EACnB,gBAAgB,GACjB,MAAM,0BAA0B,CAAC"}
@@ -0,0 +1,22 @@
1
+ /**
2
+ * Module (no side effects): the procedures of this package as data, for `createRegistry()`.
3
+ *
4
+ * Procedure Registration for S3 operations
5
+ *
6
+ * Provides s3.upload, s3.download, s3.list, s3.delete, and s3.multipart.* procedures.
7
+ * Credentials are loaded from environment variables (AWS_ACCESS_KEY_ID, AWS_SECRET_ACCESS_KEY).
8
+ */
9
+ import { type ProcedureModule, type ProcedureRegistry } from "@procedures/client";
10
+ /**
11
+ * The module of this package, for `createRegistry()`: its procedures as data. Importing this
12
+ * file registers nothing. (`register.ts` registers the same procedures in the global registry.)
13
+ */
14
+ export declare const s3Module: ProcedureModule;
15
+ export default s3Module;
16
+ /**
17
+ * This function registers the procedures of @procedures/s3, and of the modules that it requires, in
18
+ * a registry. The default is the global registry. Importing this file registers nothing: the
19
+ * `./register` entry starts this function (ARCHITECTURE-PROPOSALS-2026-10, P9).
20
+ */
21
+ export declare function registerS3Procedures(registry?: ProcedureRegistry): void;
22
+ //# sourceMappingURL=module.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"module.d.ts","sourceRoot":"","sources":["../src/module.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,EAA6C,KAAK,eAAe,EAAuC,KAAK,iBAAiB,EAAE,MAAM,oBAAoB,CAAC;AAuMlK;;;GAGG;AACH,eAAO,MAAM,QAAQ,EAAE,eAUnB,CAAC;eAEU,QAAQ;AAEvB;;;;GAIG;AACH,wBAAgB,oBAAoB,CAAC,QAAQ,GAAE,iBAAsC,GAAG,IAAI,CAE3F"}
package/dist/module.js ADDED
@@ -0,0 +1,173 @@
1
+ /**
2
+ * Module (no side effects): the procedures of this package as data, for `createRegistry()`.
3
+ *
4
+ * Procedure Registration for S3 operations
5
+ *
6
+ * Provides s3.upload, s3.download, s3.list, s3.delete, and s3.multipart.* procedures.
7
+ * Credentials are loaded from environment variables (AWS_ACCESS_KEY_ID, AWS_SECRET_ACCESS_KEY).
8
+ */
9
+ import { createProcedure, zodAdapter, defineModule, PROCEDURE_REGISTRY, registerModules } from "@procedures/client";
10
+ import { s3Upload, s3Download, s3List, s3ListAll, s3Delete, s3MultipartInit, s3MultipartUpload, s3MultipartComplete, s3MultipartAbort, } from "./procedures/s3/index.js";
11
+ import { S3UploadInputSchema, S3DownloadInputSchema, S3ListInputSchema, S3ListAllInputSchema, S3DeleteInputSchema, S3MultipartInitInputSchema, S3MultipartUploadInputSchema, S3MultipartCompleteInputSchema, S3MultipartAbortInputSchema, S3UploadOutputSchema, S3DownloadOutputSchema, S3ListOutputSchema, S3ListAllOutputSchema, S3DeleteOutputSchema, S3MultipartInitOutputSchema, S3MultipartUploadOutputSchema, S3MultipartCompleteOutputSchema, S3MultipartAbortOutputSchema, } from "./types.js";
12
+ // =============================================================================
13
+ // Procedures
14
+ // =============================================================================
15
+ const s3UploadProcedure = createProcedure()
16
+ .path(["s3", "upload"])
17
+ .input(zodAdapter(S3UploadInputSchema))
18
+ .output(zodAdapter(S3UploadOutputSchema))
19
+ .meta({
20
+ description: "Upload content to S3 bucket",
21
+ // A put replaces the object of an existing key
22
+ effects: { reads: ["s3", "network"], writes: ["s3", "network"] },
23
+ shorts: { bucket: "b", key: "k" },
24
+ output: "json",
25
+ })
26
+ .handler(async (input) => {
27
+ return s3Upload(input);
28
+ })
29
+ .build();
30
+ const s3DownloadProcedure = createProcedure()
31
+ .path(["s3", "download"])
32
+ .input(zodAdapter(S3DownloadInputSchema))
33
+ .output(zodAdapter(S3DownloadOutputSchema))
34
+ .meta({
35
+ description: "Download content from S3 bucket",
36
+ // With destPath, it replaces the file at that path
37
+ effects: { reads: ["s3", "network"], writes: ["fs"], idempotent: true },
38
+ shorts: { bucket: "b", key: "k", encoding: "e" },
39
+ output: "json",
40
+ })
41
+ .handler(async (input) => {
42
+ return s3Download(input);
43
+ })
44
+ .build();
45
+ const s3ListProcedure = createProcedure()
46
+ .path(["s3", "list"])
47
+ .input(zodAdapter(S3ListInputSchema))
48
+ .output(zodAdapter(S3ListOutputSchema))
49
+ .meta({
50
+ description: "List objects in S3 bucket",
51
+ effects: { reads: ["s3", "network"], writes: [] },
52
+ shorts: { bucket: "b", prefix: "p", maxKeys: "n" },
53
+ output: "json",
54
+ })
55
+ .handler(async (input) => {
56
+ return s3List(input);
57
+ })
58
+ .build();
59
+ const s3ListAllProcedure = createProcedure()
60
+ .path(["s3", "listAll"])
61
+ .input(zodAdapter(S3ListAllInputSchema))
62
+ .output(zodAdapter(S3ListAllOutputSchema))
63
+ .meta({
64
+ description: "List ALL objects in S3 bucket, following continuation tokens (unbounded by 1000)",
65
+ effects: { reads: ["s3", "network"], writes: [] },
66
+ shorts: { bucket: "b", prefix: "p", maxKeys: "n" },
67
+ output: "json",
68
+ })
69
+ .handler(async (input) => {
70
+ return s3ListAll(input);
71
+ })
72
+ .build();
73
+ const s3DeleteProcedure = createProcedure()
74
+ .path(["s3", "delete"])
75
+ .input(zodAdapter(S3DeleteInputSchema))
76
+ .output(zodAdapter(S3DeleteOutputSchema))
77
+ .meta({
78
+ description: "Delete object from S3 bucket",
79
+ effects: { reads: ["s3", "network"], writes: ["s3", "network"] },
80
+ shorts: { bucket: "b", key: "k" },
81
+ output: "json",
82
+ })
83
+ .handler(async (input) => {
84
+ return s3Delete(input);
85
+ })
86
+ .build();
87
+ const s3MultipartInitProcedure = createProcedure()
88
+ .path(["s3", "multipart", "init"])
89
+ .input(zodAdapter(S3MultipartInitInputSchema))
90
+ .output(zodAdapter(S3MultipartInitOutputSchema))
91
+ .meta({
92
+ description: "Initialize multipart upload for large files",
93
+ // It starts a new upload: the object of the key does not change before the completion
94
+ effects: { reads: ["s3", "network"], writes: ["s3", "network"], destructive: false },
95
+ shorts: { bucket: "b", key: "k" },
96
+ output: "json",
97
+ })
98
+ .handler(async (input) => {
99
+ return s3MultipartInit(input);
100
+ })
101
+ .build();
102
+ const s3MultipartUploadProcedure = createProcedure()
103
+ .path(["s3", "multipart", "upload"])
104
+ .input(zodAdapter(S3MultipartUploadInputSchema))
105
+ .output(zodAdapter(S3MultipartUploadOutputSchema))
106
+ .meta({
107
+ description: "Upload a part in multipart upload",
108
+ // A part replaces the earlier part with the same number
109
+ effects: { reads: ["s3", "network"], writes: ["s3", "network"], idempotent: true },
110
+ shorts: { bucket: "b", key: "k", partNumber: "n" },
111
+ output: "json",
112
+ })
113
+ .handler(async (input) => {
114
+ return s3MultipartUpload(input);
115
+ })
116
+ .build();
117
+ const s3MultipartCompleteProcedure = createProcedure()
118
+ .path(["s3", "multipart", "complete"])
119
+ .input(zodAdapter(S3MultipartCompleteInputSchema))
120
+ .output(zodAdapter(S3MultipartCompleteOutputSchema))
121
+ .meta({
122
+ description: "Complete multipart upload by assembling parts",
123
+ // The assembled object replaces the object of an existing key
124
+ effects: { reads: ["s3", "network"], writes: ["s3", "network"] },
125
+ shorts: { bucket: "b", key: "k" },
126
+ output: "json",
127
+ })
128
+ .handler(async (input) => {
129
+ return s3MultipartComplete(input);
130
+ })
131
+ .build();
132
+ const s3MultipartAbortProcedure = createProcedure()
133
+ .path(["s3", "multipart", "abort"])
134
+ .input(zodAdapter(S3MultipartAbortInputSchema))
135
+ .output(zodAdapter(S3MultipartAbortOutputSchema))
136
+ .meta({
137
+ description: "Abort multipart upload and clean up parts",
138
+ effects: { reads: ["s3", "network"], writes: ["s3", "network"] },
139
+ shorts: { bucket: "b", key: "k" },
140
+ output: "json",
141
+ })
142
+ .handler(async (input) => {
143
+ return s3MultipartAbort(input);
144
+ })
145
+ .build();
146
+ // =============================================================================
147
+ // Registration
148
+ // =============================================================================
149
+ /**
150
+ * The module of this package, for `createRegistry()`: its procedures as data. Importing this
151
+ * file registers nothing. (`register.ts` registers the same procedures in the global registry.)
152
+ */
153
+ export const s3Module = defineModule("@procedures/s3", [
154
+ s3UploadProcedure,
155
+ s3DownloadProcedure,
156
+ s3ListProcedure,
157
+ s3ListAllProcedure,
158
+ s3DeleteProcedure,
159
+ s3MultipartInitProcedure,
160
+ s3MultipartUploadProcedure,
161
+ s3MultipartCompleteProcedure,
162
+ s3MultipartAbortProcedure,
163
+ ]);
164
+ export default s3Module;
165
+ /**
166
+ * This function registers the procedures of @procedures/s3, and of the modules that it requires, in
167
+ * a registry. The default is the global registry. Importing this file registers nothing: the
168
+ * `./register` entry starts this function (ARCHITECTURE-PROPOSALS-2026-10, P9).
169
+ */
170
+ export function registerS3Procedures(registry = PROCEDURE_REGISTRY) {
171
+ registerModules(registry, [s3Module]);
172
+ }
173
+ //# sourceMappingURL=module.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"module.js","sourceRoot":"","sources":["../src/module.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,26 @@
1
+ /**
2
+ * s3.delete procedure
3
+ *
4
+ * Delete object from S3 bucket.
5
+ */
6
+ import type { S3DeleteInput, S3DeleteOutput } from "../../types.js";
7
+ /**
8
+ * Delete object from S3
9
+ *
10
+ * @example
11
+ * // Delete an object
12
+ * await client.call(["s3", "delete"], {
13
+ * bucket: "my-bucket",
14
+ * key: "path/to/file.json",
15
+ * });
16
+ *
17
+ * @example
18
+ * // Delete specific version
19
+ * await client.call(["s3", "delete"], {
20
+ * bucket: "my-bucket",
21
+ * key: "path/to/file.json",
22
+ * versionId: "abc123",
23
+ * });
24
+ */
25
+ export declare function s3Delete(input: S3DeleteInput): Promise<S3DeleteOutput>;
26
+ //# sourceMappingURL=delete.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"delete.d.ts","sourceRoot":"","sources":["../../../src/procedures/s3/delete.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAIH,OAAO,KAAK,EAAE,aAAa,EAAE,cAAc,EAAE,MAAM,gBAAgB,CAAC;AAEpE;;;;;;;;;;;;;;;;;GAiBG;AACH,wBAAsB,QAAQ,CAAC,KAAK,EAAE,aAAa,GAAG,OAAO,CAAC,cAAc,CAAC,CAgB5E"}
@@ -0,0 +1,40 @@
1
+ /**
2
+ * s3.delete procedure
3
+ *
4
+ * Delete object from S3 bucket.
5
+ */
6
+ import { DeleteObjectCommand } from "@aws-sdk/client-s3";
7
+ import { getS3Client } from "../../s3-client.js";
8
+ /**
9
+ * Delete object from S3
10
+ *
11
+ * @example
12
+ * // Delete an object
13
+ * await client.call(["s3", "delete"], {
14
+ * bucket: "my-bucket",
15
+ * key: "path/to/file.json",
16
+ * });
17
+ *
18
+ * @example
19
+ * // Delete specific version
20
+ * await client.call(["s3", "delete"], {
21
+ * bucket: "my-bucket",
22
+ * key: "path/to/file.json",
23
+ * versionId: "abc123",
24
+ * });
25
+ */
26
+ export async function s3Delete(input) {
27
+ const client = getS3Client();
28
+ const command = new DeleteObjectCommand({
29
+ Bucket: input.bucket,
30
+ Key: input.key,
31
+ VersionId: input.versionId,
32
+ });
33
+ const response = await client.send(command);
34
+ return {
35
+ deleted: true,
36
+ deleteMarker: response.DeleteMarker,
37
+ versionId: response.VersionId,
38
+ };
39
+ }
40
+ //# sourceMappingURL=delete.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"delete.js","sourceRoot":"","sources":["../../../src/procedures/s3/delete.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,mBAAmB,EAAE,MAAM,oBAAoB,CAAC;AACzD,OAAO,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AAGjD;;;;;;;;;;;;;;;;;GAiBG;AACH,MAAM,CAAC,KAAK,UAAU,QAAQ,CAAC,KAAoB;IACjD,MAAM,MAAM,GAAG,WAAW,EAAE,CAAC;IAE7B,MAAM,OAAO,GAAG,IAAI,mBAAmB,CAAC;QACtC,MAAM,EAAE,KAAK,CAAC,MAAM;QACpB,GAAG,EAAE,KAAK,CAAC,GAAG;QACd,SAAS,EAAE,KAAK,CAAC,SAAS;KAC3B,CAAC,CAAC;IAEH,MAAM,QAAQ,GAAG,MAAM,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;IAE5C,OAAO;QACL,OAAO,EAAE,IAAI;QACb,YAAY,EAAE,QAAQ,CAAC,YAAY;QACnC,SAAS,EAAE,QAAQ,CAAC,SAAS;KAC9B,CAAC;AACJ,CAAC"}
@@ -0,0 +1,36 @@
1
+ /**
2
+ * s3.download procedure
3
+ *
4
+ * Download content from S3 bucket.
5
+ */
6
+ import type { S3DownloadInput, S3DownloadOutput } from "../../types.js";
7
+ /**
8
+ * Download content from S3
9
+ *
10
+ * @example
11
+ * // Download text file
12
+ * const result = await client.call(["s3", "download"], {
13
+ * bucket: "my-bucket",
14
+ * key: "path/to/file.json",
15
+ * encoding: "utf8",
16
+ * });
17
+ * console.log(result.body); // JSON string
18
+ *
19
+ * @example
20
+ * // Download binary as base64
21
+ * const result = await client.call(["s3", "download"], {
22
+ * bucket: "my-bucket",
23
+ * key: "path/to/image.png",
24
+ * });
25
+ * console.log(result.body); // base64 encoded
26
+ *
27
+ * @example
28
+ * // Download a large object straight to a file
29
+ * await client.call(["s3", "download"], {
30
+ * bucket: "my-bucket",
31
+ * key: "backups/archive.tar.gz",
32
+ * destPath: "/tmp/archive.tar.gz",
33
+ * });
34
+ */
35
+ export declare function s3Download(input: S3DownloadInput): Promise<S3DownloadOutput>;
36
+ //# sourceMappingURL=download.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"download.d.ts","sourceRoot":"","sources":["../../../src/procedures/s3/download.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AASH,OAAO,KAAK,EAAE,eAAe,EAAE,gBAAgB,EAAE,MAAM,gBAAgB,CAAC;AA6CxE;;;;;;;;;;;;;;;;;;;;;;;;;;;GA2BG;AACH,wBAAsB,UAAU,CAAC,KAAK,EAAE,eAAe,GAAG,OAAO,CAAC,gBAAgB,CAAC,CAoElF"}
@@ -0,0 +1,143 @@
1
+ /**
2
+ * s3.download procedure
3
+ *
4
+ * Download content from S3 bucket.
5
+ */
6
+ import { randomUUID } from "node:crypto";
7
+ import { createWriteStream } from "node:fs";
8
+ import { rename, rm } from "node:fs/promises";
9
+ import { Transform } from "node:stream";
10
+ import { pipeline } from "node:stream/promises";
11
+ import { GetObjectCommand } from "@aws-sdk/client-s3";
12
+ import { getS3Client } from "../../s3-client.js";
13
+ /** Largest object loaded into memory by default (the base64 body is a third larger again) */
14
+ const DEFAULT_MAX_BYTES = 64 * 1024 * 1024;
15
+ function tooLarge(bytes, maxBytes) {
16
+ return new Error(`Object is ${bytes} bytes, more than maxBytes (${maxBytes}). Use destPath to download it to a file.`);
17
+ }
18
+ /** A stream step that counts the bytes and fails past `maxBytes`. */
19
+ function byteLimit(maxBytes) {
20
+ let total = 0;
21
+ return new Transform({
22
+ transform(chunk, _encoding, callback) {
23
+ total += chunk.length;
24
+ if (total > maxBytes) {
25
+ callback(tooLarge(`more than ${maxBytes}`, maxBytes));
26
+ return;
27
+ }
28
+ callback(null, chunk);
29
+ },
30
+ });
31
+ }
32
+ /**
33
+ * Read a body into memory, counting the bytes. `Content-Length` can be missing or wrong, so the
34
+ * count is the limit (deep dive DATA-14).
35
+ */
36
+ async function readLimited(body, maxBytes) {
37
+ const chunks = [];
38
+ let total = 0;
39
+ for await (const chunk of body) {
40
+ const buffer = Buffer.isBuffer(chunk) ? chunk : Buffer.from(chunk);
41
+ total += buffer.length;
42
+ if (total > maxBytes) {
43
+ body.destroy();
44
+ throw tooLarge(`more than ${maxBytes}`, maxBytes);
45
+ }
46
+ chunks.push(buffer);
47
+ }
48
+ return Buffer.concat(chunks);
49
+ }
50
+ /**
51
+ * Download content from S3
52
+ *
53
+ * @example
54
+ * // Download text file
55
+ * const result = await client.call(["s3", "download"], {
56
+ * bucket: "my-bucket",
57
+ * key: "path/to/file.json",
58
+ * encoding: "utf8",
59
+ * });
60
+ * console.log(result.body); // JSON string
61
+ *
62
+ * @example
63
+ * // Download binary as base64
64
+ * const result = await client.call(["s3", "download"], {
65
+ * bucket: "my-bucket",
66
+ * key: "path/to/image.png",
67
+ * });
68
+ * console.log(result.body); // base64 encoded
69
+ *
70
+ * @example
71
+ * // Download a large object straight to a file
72
+ * await client.call(["s3", "download"], {
73
+ * bucket: "my-bucket",
74
+ * key: "backups/archive.tar.gz",
75
+ * destPath: "/tmp/archive.tar.gz",
76
+ * });
77
+ */
78
+ export async function s3Download(input) {
79
+ const client = getS3Client();
80
+ const command = new GetObjectCommand({
81
+ Bucket: input.bucket,
82
+ Key: input.key,
83
+ VersionId: input.versionId,
84
+ });
85
+ const response = await client.send(command);
86
+ // To a file: stream the body, nothing is held in memory (BUGS-2026-07 M22)
87
+ if (input.destPath) {
88
+ if (!response.Body) {
89
+ throw new Error("Empty response body");
90
+ }
91
+ // Write a part file, then rename it. A failed transfer leaves the previous file
92
+ // (createWriteStream on destPath truncated it first: deep dive DATA-14).
93
+ const partPath = `${input.destPath}.${randomUUID().slice(0, 8)}.part`;
94
+ const source = response.Body;
95
+ try {
96
+ if (input.maxBytes !== undefined) {
97
+ await pipeline(source, byteLimit(input.maxBytes), createWriteStream(partPath));
98
+ }
99
+ else {
100
+ await pipeline(source, createWriteStream(partPath));
101
+ }
102
+ await rename(partPath, input.destPath);
103
+ }
104
+ catch (error) {
105
+ await rm(partPath, { force: true });
106
+ throw error;
107
+ }
108
+ return {
109
+ body: "",
110
+ path: input.destPath,
111
+ contentLength: response.ContentLength ?? 0,
112
+ contentType: response.ContentType,
113
+ etag: response.ETag?.replace(/"/g, ""),
114
+ lastModified: response.LastModified?.toISOString(),
115
+ };
116
+ }
117
+ // Into memory: refuse an object that is too large before reading it (BUGS-2026-07 M22)
118
+ const maxBytes = input.maxBytes ?? DEFAULT_MAX_BYTES;
119
+ if (response.ContentLength !== undefined && response.ContentLength > maxBytes) {
120
+ response.Body?.destroy?.();
121
+ throw tooLarge(response.ContentLength, maxBytes);
122
+ }
123
+ if (!response.Body) {
124
+ throw new Error("Empty response body");
125
+ }
126
+ const bodyBytes = await readLimited(response.Body, maxBytes);
127
+ // Convert to string based on encoding
128
+ let body;
129
+ if (input.encoding) {
130
+ body = bodyBytes.toString(input.encoding);
131
+ }
132
+ else {
133
+ body = bodyBytes.toString("base64");
134
+ }
135
+ return {
136
+ body,
137
+ contentLength: bodyBytes.length,
138
+ contentType: response.ContentType,
139
+ etag: response.ETag?.replace(/"/g, ""),
140
+ lastModified: response.LastModified?.toISOString(),
141
+ };
142
+ }
143
+ //# sourceMappingURL=download.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"download.js","sourceRoot":"","sources":["../../../src/procedures/s3/download.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,13 @@
1
+ /**
2
+ * S3 Procedures Index
3
+ */
4
+ export { s3Upload } from "./upload.js";
5
+ export { s3Download } from "./download.js";
6
+ export { s3List } from "./list.js";
7
+ export { s3ListAll } from "./list-all.js";
8
+ export { s3Delete } from "./delete.js";
9
+ export { s3MultipartInit } from "./multipart-init.js";
10
+ export { s3MultipartUpload } from "./multipart-upload.js";
11
+ export { s3MultipartComplete } from "./multipart-complete.js";
12
+ export { s3MultipartAbort } from "./multipart-abort.js";
13
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/procedures/s3/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AACvC,OAAO,EAAE,UAAU,EAAE,MAAM,eAAe,CAAC;AAC3C,OAAO,EAAE,MAAM,EAAE,MAAM,WAAW,CAAC;AACnC,OAAO,EAAE,SAAS,EAAE,MAAM,eAAe,CAAC;AAC1C,OAAO,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AACvC,OAAO,EAAE,eAAe,EAAE,MAAM,qBAAqB,CAAC;AACtD,OAAO,EAAE,iBAAiB,EAAE,MAAM,uBAAuB,CAAC;AAC1D,OAAO,EAAE,mBAAmB,EAAE,MAAM,yBAAyB,CAAC;AAC9D,OAAO,EAAE,gBAAgB,EAAE,MAAM,sBAAsB,CAAC"}
@@ -0,0 +1,13 @@
1
+ /**
2
+ * S3 Procedures Index
3
+ */
4
+ export { s3Upload } from "./upload.js";
5
+ export { s3Download } from "./download.js";
6
+ export { s3List } from "./list.js";
7
+ export { s3ListAll } from "./list-all.js";
8
+ export { s3Delete } from "./delete.js";
9
+ export { s3MultipartInit } from "./multipart-init.js";
10
+ export { s3MultipartUpload } from "./multipart-upload.js";
11
+ export { s3MultipartComplete } from "./multipart-complete.js";
12
+ export { s3MultipartAbort } from "./multipart-abort.js";
13
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/procedures/s3/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AACvC,OAAO,EAAE,UAAU,EAAE,MAAM,eAAe,CAAC;AAC3C,OAAO,EAAE,MAAM,EAAE,MAAM,WAAW,CAAC;AACnC,OAAO,EAAE,SAAS,EAAE,MAAM,eAAe,CAAC;AAC1C,OAAO,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AACvC,OAAO,EAAE,eAAe,EAAE,MAAM,qBAAqB,CAAC;AACtD,OAAO,EAAE,iBAAiB,EAAE,MAAM,uBAAuB,CAAC;AAC1D,OAAO,EAAE,mBAAmB,EAAE,MAAM,yBAAyB,CAAC;AAC9D,OAAO,EAAE,gBAAgB,EAAE,MAAM,sBAAsB,CAAC"}
@@ -0,0 +1,24 @@
1
+ /**
2
+ * s3.listAll procedure
3
+ *
4
+ * List ALL objects in an S3 bucket, transparently following the
5
+ * ListObjectsV2 continuation token so that buckets/prefixes with more than
6
+ * 1000 keys are fully reachable in a single call.
7
+ */
8
+ import type { S3ListAllInput, S3ListAllOutput } from "../../types.js";
9
+ /**
10
+ * List every object under a bucket/prefix, following pagination automatically.
11
+ *
12
+ * Unlike `s3.list` (which returns at most one page — up to 1000 keys — and
13
+ * exposes `nextContinuationToken` for manual paging), `s3.listAll` loops until
14
+ * the result is no longer truncated and returns the aggregated contents.
15
+ *
16
+ * @example
17
+ * const { contents, keyCount } = await client.call(["s3", "listAll"], {
18
+ * bucket: "my-bucket",
19
+ * prefix: "snapshots/",
20
+ * });
21
+ * console.log(keyCount); // e.g. 4213, not clamped to 1000
22
+ */
23
+ export declare function s3ListAll(input: S3ListAllInput): Promise<S3ListAllOutput>;
24
+ //# sourceMappingURL=list-all.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"list-all.d.ts","sourceRoot":"","sources":["../../../src/procedures/s3/list-all.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAGH,OAAO,KAAK,EAAE,cAAc,EAAE,eAAe,EAAgB,MAAM,gBAAgB,CAAC;AAEpF;;;;;;;;;;;;;GAaG;AACH,wBAAsB,SAAS,CAAC,KAAK,EAAE,cAAc,GAAG,OAAO,CAAC,eAAe,CAAC,CAqC/E"}
@@ -0,0 +1,57 @@
1
+ /**
2
+ * s3.listAll procedure
3
+ *
4
+ * List ALL objects in an S3 bucket, transparently following the
5
+ * ListObjectsV2 continuation token so that buckets/prefixes with more than
6
+ * 1000 keys are fully reachable in a single call.
7
+ */
8
+ import { s3List } from "./list.js";
9
+ /**
10
+ * List every object under a bucket/prefix, following pagination automatically.
11
+ *
12
+ * Unlike `s3.list` (which returns at most one page — up to 1000 keys — and
13
+ * exposes `nextContinuationToken` for manual paging), `s3.listAll` loops until
14
+ * the result is no longer truncated and returns the aggregated contents.
15
+ *
16
+ * @example
17
+ * const { contents, keyCount } = await client.call(["s3", "listAll"], {
18
+ * bucket: "my-bucket",
19
+ * prefix: "snapshots/",
20
+ * });
21
+ * console.log(keyCount); // e.g. 4213, not clamped to 1000
22
+ */
23
+ export async function s3ListAll(input) {
24
+ const contents = [];
25
+ const commonPrefixes = [];
26
+ const seenPrefixes = new Set();
27
+ let continuationToken = undefined;
28
+ let pageCount = 0;
29
+ do {
30
+ const page = await s3List({
31
+ bucket: input.bucket,
32
+ prefix: input.prefix,
33
+ delimiter: input.delimiter,
34
+ maxKeys: input.maxKeys,
35
+ continuationToken,
36
+ });
37
+ pageCount += 1;
38
+ for (const object of page.contents) {
39
+ contents.push(object);
40
+ }
41
+ for (const prefix of page.commonPrefixes) {
42
+ if (!seenPrefixes.has(prefix)) {
43
+ seenPrefixes.add(prefix);
44
+ commonPrefixes.push(prefix);
45
+ }
46
+ }
47
+ // Only continue while S3 reports more results AND hands back a token.
48
+ continuationToken = page.isTruncated ? page.nextContinuationToken : undefined;
49
+ } while (continuationToken);
50
+ return {
51
+ contents,
52
+ commonPrefixes,
53
+ keyCount: contents.length,
54
+ pageCount,
55
+ };
56
+ }
57
+ //# sourceMappingURL=list-all.js.map