@supabase/storage-js 2.79.1-canary.1 → 2.80.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 (197) hide show
  1. package/README.md +920 -12
  2. package/dist/main/StorageClient.d.ts +28 -0
  3. package/dist/main/StorageClient.d.ts.map +1 -1
  4. package/dist/main/StorageClient.js +38 -5
  5. package/dist/main/StorageClient.js.map +1 -1
  6. package/dist/main/index.d.ts +2 -0
  7. package/dist/main/index.d.ts.map +1 -1
  8. package/dist/main/index.js +7 -17
  9. package/dist/main/index.js.map +1 -1
  10. package/dist/main/lib/constants.d.ts.map +1 -1
  11. package/dist/main/lib/constants.js +3 -1
  12. package/dist/main/lib/constants.js.map +1 -1
  13. package/dist/main/lib/fetch.d.ts.map +1 -1
  14. package/dist/main/lib/fetch.js +16 -17
  15. package/dist/main/lib/fetch.js.map +1 -1
  16. package/dist/main/lib/helpers.d.ts +1 -1
  17. package/dist/main/lib/helpers.d.ts.map +1 -1
  18. package/dist/main/lib/helpers.js +4 -57
  19. package/dist/main/lib/helpers.js.map +1 -1
  20. package/dist/main/lib/index.d.ts +1 -0
  21. package/dist/main/lib/index.d.ts.map +1 -1
  22. package/dist/main/lib/index.js +6 -18
  23. package/dist/main/lib/index.js.map +1 -1
  24. package/dist/main/lib/types.d.ts +74 -4
  25. package/dist/main/lib/types.d.ts.map +1 -1
  26. package/dist/main/lib/vectors/StorageVectorsClient.d.ts +310 -0
  27. package/dist/main/lib/vectors/StorageVectorsClient.d.ts.map +1 -0
  28. package/dist/main/lib/vectors/StorageVectorsClient.js +366 -0
  29. package/dist/main/lib/vectors/StorageVectorsClient.js.map +1 -0
  30. package/dist/main/lib/vectors/VectorBucketApi.d.ts +129 -0
  31. package/dist/main/lib/vectors/VectorBucketApi.d.ts.map +1 -0
  32. package/dist/main/lib/vectors/VectorBucketApi.js +199 -0
  33. package/dist/main/lib/vectors/VectorBucketApi.js.map +1 -0
  34. package/dist/main/lib/vectors/VectorDataApi.d.ts +221 -0
  35. package/dist/main/lib/vectors/VectorDataApi.d.ts.map +1 -0
  36. package/dist/main/lib/vectors/VectorDataApi.js +336 -0
  37. package/dist/main/lib/vectors/VectorDataApi.js.map +1 -0
  38. package/dist/main/lib/vectors/VectorIndexApi.d.ts +157 -0
  39. package/dist/main/lib/vectors/VectorIndexApi.d.ts.map +1 -0
  40. package/dist/main/lib/vectors/VectorIndexApi.js +218 -0
  41. package/dist/main/lib/vectors/VectorIndexApi.js.map +1 -0
  42. package/dist/main/lib/vectors/constants.d.ts +5 -0
  43. package/dist/main/lib/vectors/constants.d.ts.map +1 -0
  44. package/dist/main/lib/vectors/constants.js +9 -0
  45. package/dist/main/lib/vectors/constants.js.map +1 -0
  46. package/dist/main/lib/vectors/errors.d.ts +55 -0
  47. package/dist/main/lib/vectors/errors.d.ts.map +1 -0
  48. package/dist/main/lib/vectors/errors.js +76 -0
  49. package/dist/main/lib/vectors/errors.js.map +1 -0
  50. package/dist/main/lib/vectors/fetch.d.ts +57 -0
  51. package/dist/main/lib/vectors/fetch.d.ts.map +1 -0
  52. package/dist/main/lib/vectors/fetch.js +167 -0
  53. package/dist/main/lib/vectors/fetch.js.map +1 -0
  54. package/dist/main/lib/vectors/helpers.d.ts +46 -0
  55. package/dist/main/lib/vectors/helpers.d.ts.map +1 -0
  56. package/dist/main/lib/vectors/helpers.js +74 -0
  57. package/dist/main/lib/vectors/helpers.js.map +1 -0
  58. package/dist/main/lib/vectors/index.d.ts +11 -0
  59. package/dist/main/lib/vectors/index.d.ts.map +1 -0
  60. package/dist/main/lib/vectors/index.js +31 -0
  61. package/dist/main/lib/vectors/index.js.map +1 -0
  62. package/dist/main/lib/vectors/types.d.ts +277 -0
  63. package/dist/main/lib/vectors/types.d.ts.map +1 -0
  64. package/dist/main/lib/vectors/types.js +3 -0
  65. package/dist/main/lib/vectors/types.js.map +1 -0
  66. package/dist/main/lib/version.d.ts +1 -1
  67. package/dist/main/lib/version.d.ts.map +1 -1
  68. package/dist/main/lib/version.js +1 -1
  69. package/dist/main/lib/version.js.map +1 -1
  70. package/dist/main/packages/BlobDownloadBuilder.d.ts +6 -1
  71. package/dist/main/packages/BlobDownloadBuilder.d.ts.map +1 -1
  72. package/dist/main/packages/BlobDownloadBuilder.js +20 -15
  73. package/dist/main/packages/BlobDownloadBuilder.js.map +1 -1
  74. package/dist/main/packages/StorageAnalyticsApi.d.ts +123 -0
  75. package/dist/main/packages/StorageAnalyticsApi.d.ts.map +1 -0
  76. package/dist/main/packages/StorageAnalyticsApi.js +164 -0
  77. package/dist/main/packages/StorageAnalyticsApi.js.map +1 -0
  78. package/dist/main/packages/StorageBucketApi.d.ts +3 -2
  79. package/dist/main/packages/StorageBucketApi.d.ts.map +1 -1
  80. package/dist/main/packages/StorageBucketApi.js +34 -18
  81. package/dist/main/packages/StorageBucketApi.js.map +1 -1
  82. package/dist/main/packages/StorageFileApi.d.ts.map +1 -1
  83. package/dist/main/packages/StorageFileApi.js +28 -29
  84. package/dist/main/packages/StorageFileApi.js.map +1 -1
  85. package/dist/main/packages/StreamDownloadBuilder.js +2 -10
  86. package/dist/main/packages/StreamDownloadBuilder.js.map +1 -1
  87. package/dist/module/StorageClient.d.ts +28 -0
  88. package/dist/module/StorageClient.d.ts.map +1 -1
  89. package/dist/module/StorageClient.js +35 -0
  90. package/dist/module/StorageClient.js.map +1 -1
  91. package/dist/module/index.d.ts +2 -0
  92. package/dist/module/index.d.ts.map +1 -1
  93. package/dist/module/index.js +2 -0
  94. package/dist/module/index.js.map +1 -1
  95. package/dist/module/lib/constants.d.ts.map +1 -1
  96. package/dist/module/lib/constants.js +3 -1
  97. package/dist/module/lib/constants.js.map +1 -1
  98. package/dist/module/lib/fetch.d.ts.map +1 -1
  99. package/dist/module/lib/fetch.js +9 -10
  100. package/dist/module/lib/fetch.js.map +1 -1
  101. package/dist/module/lib/helpers.d.ts +1 -1
  102. package/dist/module/lib/helpers.d.ts.map +1 -1
  103. package/dist/module/lib/helpers.js +4 -24
  104. package/dist/module/lib/helpers.js.map +1 -1
  105. package/dist/module/lib/index.d.ts +1 -0
  106. package/dist/module/lib/index.d.ts.map +1 -1
  107. package/dist/module/lib/index.js +1 -0
  108. package/dist/module/lib/index.js.map +1 -1
  109. package/dist/module/lib/types.d.ts +74 -4
  110. package/dist/module/lib/types.d.ts.map +1 -1
  111. package/dist/module/lib/vectors/StorageVectorsClient.d.ts +310 -0
  112. package/dist/module/lib/vectors/StorageVectorsClient.d.ts.map +1 -0
  113. package/dist/module/lib/vectors/StorageVectorsClient.js +360 -0
  114. package/dist/module/lib/vectors/StorageVectorsClient.js.map +1 -0
  115. package/dist/module/lib/vectors/VectorBucketApi.d.ts +129 -0
  116. package/dist/module/lib/vectors/VectorBucketApi.d.ts.map +1 -0
  117. package/dist/module/lib/vectors/VectorBucketApi.js +196 -0
  118. package/dist/module/lib/vectors/VectorBucketApi.js.map +1 -0
  119. package/dist/module/lib/vectors/VectorDataApi.d.ts +221 -0
  120. package/dist/module/lib/vectors/VectorDataApi.d.ts.map +1 -0
  121. package/dist/module/lib/vectors/VectorDataApi.js +333 -0
  122. package/dist/module/lib/vectors/VectorDataApi.js.map +1 -0
  123. package/dist/module/lib/vectors/VectorIndexApi.d.ts +157 -0
  124. package/dist/module/lib/vectors/VectorIndexApi.d.ts.map +1 -0
  125. package/dist/module/lib/vectors/VectorIndexApi.js +215 -0
  126. package/dist/module/lib/vectors/VectorIndexApi.js.map +1 -0
  127. package/dist/module/lib/vectors/constants.d.ts +5 -0
  128. package/dist/module/lib/vectors/constants.d.ts.map +1 -0
  129. package/dist/module/lib/vectors/constants.js +6 -0
  130. package/dist/module/lib/vectors/constants.js.map +1 -0
  131. package/dist/module/lib/vectors/errors.d.ts +55 -0
  132. package/dist/module/lib/vectors/errors.d.ts.map +1 -0
  133. package/dist/module/lib/vectors/errors.js +69 -0
  134. package/dist/module/lib/vectors/errors.js.map +1 -0
  135. package/dist/module/lib/vectors/fetch.d.ts +57 -0
  136. package/dist/module/lib/vectors/fetch.d.ts.map +1 -0
  137. package/dist/module/lib/vectors/fetch.js +161 -0
  138. package/dist/module/lib/vectors/fetch.js.map +1 -0
  139. package/dist/module/lib/vectors/helpers.d.ts +46 -0
  140. package/dist/module/lib/vectors/helpers.d.ts.map +1 -0
  141. package/dist/module/lib/vectors/helpers.js +66 -0
  142. package/dist/module/lib/vectors/helpers.js.map +1 -0
  143. package/dist/module/lib/vectors/index.d.ts +11 -0
  144. package/dist/module/lib/vectors/index.d.ts.map +1 -0
  145. package/dist/module/lib/vectors/index.js +11 -0
  146. package/dist/module/lib/vectors/index.js.map +1 -0
  147. package/dist/module/lib/vectors/types.d.ts +277 -0
  148. package/dist/module/lib/vectors/types.d.ts.map +1 -0
  149. package/dist/module/lib/vectors/types.js +2 -0
  150. package/dist/module/lib/vectors/types.js.map +1 -0
  151. package/dist/module/lib/version.d.ts +1 -1
  152. package/dist/module/lib/version.d.ts.map +1 -1
  153. package/dist/module/lib/version.js +1 -1
  154. package/dist/module/lib/version.js.map +1 -1
  155. package/dist/module/packages/BlobDownloadBuilder.d.ts +6 -1
  156. package/dist/module/packages/BlobDownloadBuilder.d.ts.map +1 -1
  157. package/dist/module/packages/BlobDownloadBuilder.js +20 -11
  158. package/dist/module/packages/BlobDownloadBuilder.js.map +1 -1
  159. package/dist/module/packages/StorageAnalyticsApi.d.ts +123 -0
  160. package/dist/module/packages/StorageAnalyticsApi.d.ts.map +1 -0
  161. package/dist/module/packages/StorageAnalyticsApi.js +161 -0
  162. package/dist/module/packages/StorageAnalyticsApi.js.map +1 -0
  163. package/dist/module/packages/StorageBucketApi.d.ts +3 -2
  164. package/dist/module/packages/StorageBucketApi.d.ts.map +1 -1
  165. package/dist/module/packages/StorageBucketApi.js +28 -12
  166. package/dist/module/packages/StorageBucketApi.js.map +1 -1
  167. package/dist/module/packages/StorageFileApi.d.ts.map +1 -1
  168. package/dist/module/packages/StorageFileApi.js +13 -11
  169. package/dist/module/packages/StorageFileApi.js.map +1 -1
  170. package/dist/module/packages/StreamDownloadBuilder.js +1 -9
  171. package/dist/module/packages/StreamDownloadBuilder.js.map +1 -1
  172. package/dist/tsconfig.module.tsbuildinfo +1 -0
  173. package/dist/tsconfig.tsbuildinfo +1 -0
  174. package/dist/umd/supabase.js +1 -1
  175. package/package.json +6 -13
  176. package/src/StorageClient.ts +37 -0
  177. package/src/index.ts +2 -0
  178. package/src/lib/constants.ts +3 -1
  179. package/src/lib/fetch.ts +5 -1
  180. package/src/lib/helpers.ts +3 -14
  181. package/src/lib/index.ts +1 -0
  182. package/src/lib/types.ts +83 -2
  183. package/src/lib/vectors/StorageVectorsClient.ts +405 -0
  184. package/src/lib/vectors/VectorBucketApi.ts +217 -0
  185. package/src/lib/vectors/VectorDataApi.ts +341 -0
  186. package/src/lib/vectors/VectorIndexApi.ts +245 -0
  187. package/src/lib/vectors/constants.ts +5 -0
  188. package/src/lib/vectors/errors.ts +78 -0
  189. package/src/lib/vectors/fetch.ts +218 -0
  190. package/src/lib/vectors/helpers.ts +79 -0
  191. package/src/lib/vectors/index.ts +66 -0
  192. package/src/lib/vectors/types.ts +299 -0
  193. package/src/lib/version.ts +1 -1
  194. package/src/packages/BlobDownloadBuilder.ts +22 -2
  195. package/src/packages/StorageAnalyticsApi.ts +199 -0
  196. package/src/packages/StorageBucketApi.ts +29 -4
  197. package/src/packages/StorageFileApi.ts +15 -2
@@ -0,0 +1,217 @@
1
+ import { DEFAULT_HEADERS } from './constants'
2
+ import { isStorageVectorsError } from './errors'
3
+ import { Fetch, post } from './fetch'
4
+ import { resolveFetch } from './helpers'
5
+ import {
6
+ ApiResponse,
7
+ VectorBucket,
8
+ ListVectorBucketsOptions,
9
+ ListVectorBucketsResponse,
10
+ } from './types'
11
+
12
+ /**
13
+ * API class for managing Vector Buckets
14
+ * Provides methods for creating, reading, listing, and deleting vector buckets
15
+ */
16
+ export default class VectorBucketApi {
17
+ protected url: string
18
+ protected headers: { [key: string]: string }
19
+ protected fetch: Fetch
20
+ protected shouldThrowOnError = false
21
+
22
+ /**
23
+ * Creates a new VectorBucketApi instance
24
+ * @param url - The base URL for the storage vectors API
25
+ * @param headers - HTTP headers to include in requests
26
+ * @param fetch - Optional custom fetch implementation
27
+ */
28
+ constructor(url: string, headers: { [key: string]: string } = {}, fetch?: Fetch) {
29
+ this.url = url.replace(/\/$/, '')
30
+ this.headers = { ...DEFAULT_HEADERS, ...headers }
31
+ this.fetch = resolveFetch(fetch)
32
+ }
33
+
34
+ /**
35
+ * Enable throwing errors instead of returning them in the response
36
+ * When enabled, failed operations will throw instead of returning { data: null, error }
37
+ *
38
+ * @returns This instance for method chaining
39
+ * @example
40
+ * ```typescript
41
+ * const client = new VectorBucketApi(url, headers)
42
+ * client.throwOnError()
43
+ * const { data } = await client.createBucket('my-bucket') // throws on error
44
+ * ```
45
+ */
46
+ public throwOnError(): this {
47
+ this.shouldThrowOnError = true
48
+ return this
49
+ }
50
+
51
+ /**
52
+ * Creates a new vector bucket
53
+ * Vector buckets are containers for vector indexes and their data
54
+ *
55
+ * @param vectorBucketName - Unique name for the vector bucket
56
+ * @returns Promise with empty response on success or error
57
+ *
58
+ * @throws {StorageVectorsApiError} With code:
59
+ * - `S3VectorConflictException` if bucket already exists (HTTP 409)
60
+ * - `S3VectorMaxBucketsExceeded` if quota exceeded (HTTP 400)
61
+ * - `InternalError` for server errors (HTTP 500)
62
+ *
63
+ * @example
64
+ * ```typescript
65
+ * const { data, error } = await client.createBucket('embeddings-prod')
66
+ * if (error) {
67
+ * console.error('Failed to create bucket:', error.message)
68
+ * }
69
+ * ```
70
+ */
71
+ async createBucket(vectorBucketName: string): Promise<ApiResponse<undefined>> {
72
+ try {
73
+ const data = await post(
74
+ this.fetch,
75
+ `${this.url}/CreateVectorBucket`,
76
+ { vectorBucketName },
77
+ { headers: this.headers }
78
+ )
79
+ return { data: data || {}, error: null }
80
+ } catch (error) {
81
+ if (this.shouldThrowOnError) {
82
+ throw error
83
+ }
84
+ if (isStorageVectorsError(error)) {
85
+ return { data: null, error }
86
+ }
87
+ throw error
88
+ }
89
+ }
90
+
91
+ /**
92
+ * Retrieves metadata for a specific vector bucket
93
+ * Returns bucket configuration including encryption settings and creation time
94
+ *
95
+ * @param vectorBucketName - Name of the vector bucket to retrieve
96
+ * @returns Promise with bucket metadata or error
97
+ *
98
+ * @throws {StorageVectorsApiError} With code:
99
+ * - `S3VectorNotFoundException` if bucket doesn't exist (HTTP 404)
100
+ * - `InternalError` for server errors (HTTP 500)
101
+ *
102
+ * @example
103
+ * ```typescript
104
+ * const { data, error } = await client.getBucket('embeddings-prod')
105
+ * if (data) {
106
+ * console.log('Bucket created at:', new Date(data.vectorBucket.creationTime! * 1000))
107
+ * }
108
+ * ```
109
+ */
110
+ async getBucket(
111
+ vectorBucketName: string
112
+ ): Promise<ApiResponse<{ vectorBucket: VectorBucket }>> {
113
+ try {
114
+ const data = await post(
115
+ this.fetch,
116
+ `${this.url}/GetVectorBucket`,
117
+ { vectorBucketName },
118
+ { headers: this.headers }
119
+ )
120
+ return { data, error: null }
121
+ } catch (error) {
122
+ if (this.shouldThrowOnError) {
123
+ throw error
124
+ }
125
+ if (isStorageVectorsError(error)) {
126
+ return { data: null, error }
127
+ }
128
+ throw error
129
+ }
130
+ }
131
+
132
+ /**
133
+ * Lists vector buckets with optional filtering and pagination
134
+ * Supports prefix-based filtering and paginated results
135
+ *
136
+ * @param options - Listing options
137
+ * @param options.prefix - Filter buckets by name prefix
138
+ * @param options.maxResults - Maximum results per page (default: 100)
139
+ * @param options.nextToken - Pagination token from previous response
140
+ * @returns Promise with list of buckets and pagination token
141
+ *
142
+ * @throws {StorageVectorsApiError} With code:
143
+ * - `InternalError` for server errors (HTTP 500)
144
+ *
145
+ * @example
146
+ * ```typescript
147
+ * // List all buckets with prefix 'prod-'
148
+ * const { data, error } = await client.listBuckets({ prefix: 'prod-' })
149
+ * if (data) {
150
+ * console.log('Found buckets:', data.buckets.length)
151
+ * // Fetch next page if available
152
+ * if (data.nextToken) {
153
+ * const next = await client.listBuckets({ nextToken: data.nextToken })
154
+ * }
155
+ * }
156
+ * ```
157
+ */
158
+ async listBuckets(
159
+ options: ListVectorBucketsOptions = {}
160
+ ): Promise<ApiResponse<ListVectorBucketsResponse>> {
161
+ try {
162
+ const data = await post(this.fetch, `${this.url}/ListVectorBuckets`, options, {
163
+ headers: this.headers,
164
+ })
165
+ return { data, error: null }
166
+ } catch (error) {
167
+ if (this.shouldThrowOnError) {
168
+ throw error
169
+ }
170
+ if (isStorageVectorsError(error)) {
171
+ return { data: null, error }
172
+ }
173
+ throw error
174
+ }
175
+ }
176
+
177
+ /**
178
+ * Deletes a vector bucket
179
+ * Bucket must be empty before deletion (all indexes must be removed first)
180
+ *
181
+ * @param vectorBucketName - Name of the vector bucket to delete
182
+ * @returns Promise with empty response on success or error
183
+ *
184
+ * @throws {StorageVectorsApiError} With code:
185
+ * - `S3VectorBucketNotEmpty` if bucket contains indexes (HTTP 400)
186
+ * - `S3VectorNotFoundException` if bucket doesn't exist (HTTP 404)
187
+ * - `InternalError` for server errors (HTTP 500)
188
+ *
189
+ * @example
190
+ * ```typescript
191
+ * // Delete all indexes first, then delete bucket
192
+ * const { error } = await client.deleteBucket('old-bucket')
193
+ * if (error?.statusCode === 'S3VectorBucketNotEmpty') {
194
+ * console.error('Must delete all indexes first')
195
+ * }
196
+ * ```
197
+ */
198
+ async deleteBucket(vectorBucketName: string): Promise<ApiResponse<undefined>> {
199
+ try {
200
+ const data = await post(
201
+ this.fetch,
202
+ `${this.url}/DeleteVectorBucket`,
203
+ { vectorBucketName },
204
+ { headers: this.headers }
205
+ )
206
+ return { data: data || {}, error: null }
207
+ } catch (error) {
208
+ if (this.shouldThrowOnError) {
209
+ throw error
210
+ }
211
+ if (isStorageVectorsError(error)) {
212
+ return { data: null, error }
213
+ }
214
+ throw error
215
+ }
216
+ }
217
+ }
@@ -0,0 +1,341 @@
1
+ import { DEFAULT_HEADERS } from './constants'
2
+ import { isStorageVectorsError } from './errors'
3
+ import { Fetch, post } from './fetch'
4
+ import { resolveFetch } from './helpers'
5
+ import {
6
+ ApiResponse,
7
+ PutVectorsOptions,
8
+ GetVectorsOptions,
9
+ GetVectorsResponse,
10
+ DeleteVectorsOptions,
11
+ ListVectorsOptions,
12
+ ListVectorsResponse,
13
+ QueryVectorsOptions,
14
+ QueryVectorsResponse,
15
+ } from './types'
16
+
17
+ /**
18
+ * API class for managing Vector Data within Vector Indexes
19
+ * Provides methods for inserting, querying, listing, and deleting vector embeddings
20
+ */
21
+ export default class VectorDataApi {
22
+ protected url: string
23
+ protected headers: { [key: string]: string }
24
+ protected fetch: Fetch
25
+ protected shouldThrowOnError = false
26
+
27
+ constructor(url: string, headers: { [key: string]: string } = {}, fetch?: Fetch) {
28
+ this.url = url.replace(/\/$/, '')
29
+ this.headers = { ...DEFAULT_HEADERS, ...headers }
30
+ this.fetch = resolveFetch(fetch)
31
+ }
32
+
33
+ /**
34
+ * Enable throwing errors instead of returning them in the response
35
+ * When enabled, failed operations will throw instead of returning { data: null, error }
36
+ *
37
+ * @returns This instance for method chaining
38
+ * @example
39
+ * ```typescript
40
+ * const client = new VectorDataApi(url, headers)
41
+ * client.throwOnError()
42
+ * const { data } = await client.putVectors(options) // throws on error
43
+ * ```
44
+ */
45
+ public throwOnError(): this {
46
+ this.shouldThrowOnError = true
47
+ return this
48
+ }
49
+
50
+ /**
51
+ * Inserts or updates vectors in batch (upsert operation)
52
+ * Accepts 1-500 vectors per request. Larger batches should be split
53
+ *
54
+ * @param options - Vector insertion options
55
+ * @param options.vectorBucketName - Name of the parent vector bucket
56
+ * @param options.indexName - Name of the target index
57
+ * @param options.vectors - Array of vectors to insert/update (1-500 items)
58
+ * @returns Promise with empty response on success or error
59
+ *
60
+ * @throws {StorageVectorsApiError} With code:
61
+ * - `S3VectorConflictException` if duplicate key conflict occurs (HTTP 409)
62
+ * - `S3VectorNotFoundException` if bucket or index doesn't exist (HTTP 404)
63
+ * - `InternalError` for server errors (HTTP 500)
64
+ *
65
+ * @example
66
+ * ```typescript
67
+ * const { data, error } = await client.putVectors({
68
+ * vectorBucketName: 'embeddings-prod',
69
+ * indexName: 'documents-openai-small',
70
+ * vectors: [
71
+ * {
72
+ * key: 'doc-1',
73
+ * data: { float32: [0.1, 0.2, 0.3, ...] }, // 1536 dimensions
74
+ * metadata: { title: 'Introduction', page: 1 }
75
+ * },
76
+ * {
77
+ * key: 'doc-2',
78
+ * data: { float32: [0.4, 0.5, 0.6, ...] },
79
+ * metadata: { title: 'Conclusion', page: 42 }
80
+ * }
81
+ * ]
82
+ * })
83
+ * ```
84
+ */
85
+ async putVectors(options: PutVectorsOptions): Promise<ApiResponse<undefined>> {
86
+ try {
87
+ // Validate batch size
88
+ if (options.vectors.length < 1 || options.vectors.length > 500) {
89
+ throw new Error('Vector batch size must be between 1 and 500 items')
90
+ }
91
+
92
+ const data = await post(this.fetch, `${this.url}/PutVectors`, options, {
93
+ headers: this.headers,
94
+ })
95
+ return { data: data || {}, error: null }
96
+ } catch (error) {
97
+ if (this.shouldThrowOnError) {
98
+ throw error
99
+ }
100
+ if (isStorageVectorsError(error)) {
101
+ return { data: null, error }
102
+ }
103
+ throw error
104
+ }
105
+ }
106
+
107
+ /**
108
+ * Retrieves vectors by their keys in batch
109
+ * Optionally includes vector data and/or metadata in response
110
+ * Additional permissions required when returning data or metadata
111
+ *
112
+ * @param options - Vector retrieval options
113
+ * @param options.vectorBucketName - Name of the parent vector bucket
114
+ * @param options.indexName - Name of the index
115
+ * @param options.keys - Array of vector keys to retrieve
116
+ * @param options.returnData - Whether to include vector embeddings (requires permission)
117
+ * @param options.returnMetadata - Whether to include metadata (requires permission)
118
+ * @returns Promise with array of vectors or error
119
+ *
120
+ * @throws {StorageVectorsApiError} With code:
121
+ * - `S3VectorNotFoundException` if bucket or index doesn't exist (HTTP 404)
122
+ * - `InternalError` for server errors (HTTP 500)
123
+ *
124
+ * @example
125
+ * ```typescript
126
+ * const { data, error } = await client.getVectors({
127
+ * vectorBucketName: 'embeddings-prod',
128
+ * indexName: 'documents-openai-small',
129
+ * keys: ['doc-1', 'doc-2', 'doc-3'],
130
+ * returnData: false, // Don't return embeddings
131
+ * returnMetadata: true // Return metadata only
132
+ * })
133
+ * if (data) {
134
+ * data.vectors.forEach(v => console.log(v.key, v.metadata))
135
+ * }
136
+ * ```
137
+ */
138
+ async getVectors(options: GetVectorsOptions): Promise<ApiResponse<GetVectorsResponse>> {
139
+ try {
140
+ const data = await post(this.fetch, `${this.url}/GetVectors`, options, {
141
+ headers: this.headers,
142
+ })
143
+ return { data, error: null }
144
+ } catch (error) {
145
+ if (this.shouldThrowOnError) {
146
+ throw error
147
+ }
148
+ if (isStorageVectorsError(error)) {
149
+ return { data: null, error }
150
+ }
151
+ throw error
152
+ }
153
+ }
154
+
155
+ /**
156
+ * Lists/scans vectors in an index with pagination
157
+ * Supports parallel scanning via segment configuration for high-throughput scenarios
158
+ * Additional permissions required when returning data or metadata
159
+ *
160
+ * @param options - Vector listing options
161
+ * @param options.vectorBucketName - Name of the parent vector bucket
162
+ * @param options.indexName - Name of the index
163
+ * @param options.maxResults - Maximum results per page (default: 500, max: 1000)
164
+ * @param options.nextToken - Pagination token from previous response
165
+ * @param options.returnData - Whether to include vector embeddings (requires permission)
166
+ * @param options.returnMetadata - Whether to include metadata (requires permission)
167
+ * @param options.segmentCount - Total parallel segments (1-16) for distributed scanning
168
+ * @param options.segmentIndex - Zero-based segment index (0 to segmentCount-1)
169
+ * @returns Promise with array of vectors, pagination token, or error
170
+ *
171
+ * @throws {StorageVectorsApiError} With code:
172
+ * - `S3VectorNotFoundException` if bucket or index doesn't exist (HTTP 404)
173
+ * - `InternalError` for server errors (HTTP 500)
174
+ *
175
+ * @example
176
+ * ```typescript
177
+ * // Simple pagination
178
+ * let nextToken: string | undefined
179
+ * do {
180
+ * const { data, error } = await client.listVectors({
181
+ * vectorBucketName: 'embeddings-prod',
182
+ * indexName: 'documents-openai-small',
183
+ * maxResults: 500,
184
+ * nextToken,
185
+ * returnMetadata: true
186
+ * })
187
+ * if (error) break
188
+ * console.log('Batch:', data.vectors.length)
189
+ * nextToken = data.nextToken
190
+ * } while (nextToken)
191
+ *
192
+ * // Parallel scanning (4 concurrent workers)
193
+ * const workers = [0, 1, 2, 3].map(async (segmentIndex) => {
194
+ * const { data } = await client.listVectors({
195
+ * vectorBucketName: 'embeddings-prod',
196
+ * indexName: 'documents-openai-small',
197
+ * segmentCount: 4,
198
+ * segmentIndex,
199
+ * returnMetadata: true
200
+ * })
201
+ * return data?.vectors || []
202
+ * })
203
+ * const results = await Promise.all(workers)
204
+ * ```
205
+ */
206
+ async listVectors(options: ListVectorsOptions): Promise<ApiResponse<ListVectorsResponse>> {
207
+ try {
208
+ // Validate segment configuration
209
+ if (options.segmentCount !== undefined) {
210
+ if (options.segmentCount < 1 || options.segmentCount > 16) {
211
+ throw new Error('segmentCount must be between 1 and 16')
212
+ }
213
+ if (options.segmentIndex !== undefined) {
214
+ if (options.segmentIndex < 0 || options.segmentIndex >= options.segmentCount) {
215
+ throw new Error(`segmentIndex must be between 0 and ${options.segmentCount - 1}`)
216
+ }
217
+ }
218
+ }
219
+
220
+ const data = await post(this.fetch, `${this.url}/ListVectors`, options, {
221
+ headers: this.headers,
222
+ })
223
+ return { data, error: null }
224
+ } catch (error) {
225
+ if (this.shouldThrowOnError) {
226
+ throw error
227
+ }
228
+ if (isStorageVectorsError(error)) {
229
+ return { data: null, error }
230
+ }
231
+ throw error
232
+ }
233
+ }
234
+
235
+ /**
236
+ * Queries for similar vectors using approximate nearest neighbor (ANN) search
237
+ * Returns top-K most similar vectors based on the configured distance metric
238
+ * Supports optional metadata filtering (requires GetVectors permission)
239
+ *
240
+ * @param options - Query options
241
+ * @param options.vectorBucketName - Name of the parent vector bucket
242
+ * @param options.indexName - Name of the index
243
+ * @param options.queryVector - Query embedding to find similar vectors
244
+ * @param options.topK - Number of nearest neighbors to return (default: 10)
245
+ * @param options.filter - Optional JSON filter for metadata (requires GetVectors permission)
246
+ * @param options.returnDistance - Whether to include similarity distances
247
+ * @param options.returnMetadata - Whether to include metadata (requires GetVectors permission)
248
+ * @returns Promise with array of similar vectors ordered by distance
249
+ *
250
+ * @throws {StorageVectorsApiError} With code:
251
+ * - `S3VectorNotFoundException` if bucket or index doesn't exist (HTTP 404)
252
+ * - `InternalError` for server errors (HTTP 500)
253
+ *
254
+ * @example
255
+ * ```typescript
256
+ * // Semantic search with filtering
257
+ * const { data, error } = await client.queryVectors({
258
+ * vectorBucketName: 'embeddings-prod',
259
+ * indexName: 'documents-openai-small',
260
+ * queryVector: { float32: [0.1, 0.2, 0.3, ...] }, // 1536 dimensions
261
+ * topK: 5,
262
+ * filter: {
263
+ * category: 'technical',
264
+ * published: true
265
+ * },
266
+ * returnDistance: true,
267
+ * returnMetadata: true
268
+ * })
269
+ * if (data) {
270
+ * data.matches.forEach(match => {
271
+ * console.log(`${match.key}: distance=${match.distance}`)
272
+ * console.log('Metadata:', match.metadata)
273
+ * })
274
+ * }
275
+ * ```
276
+ */
277
+ async queryVectors(options: QueryVectorsOptions): Promise<ApiResponse<QueryVectorsResponse>> {
278
+ try {
279
+ const data = await post(this.fetch, `${this.url}/QueryVectors`, options, {
280
+ headers: this.headers,
281
+ })
282
+ return { data, error: null }
283
+ } catch (error) {
284
+ if (this.shouldThrowOnError) {
285
+ throw error
286
+ }
287
+ if (isStorageVectorsError(error)) {
288
+ return { data: null, error }
289
+ }
290
+ throw error
291
+ }
292
+ }
293
+
294
+ /**
295
+ * Deletes vectors by their keys in batch
296
+ * Accepts 1-500 keys per request
297
+ *
298
+ * @param options - Vector deletion options
299
+ * @param options.vectorBucketName - Name of the parent vector bucket
300
+ * @param options.indexName - Name of the index
301
+ * @param options.keys - Array of vector keys to delete (1-500 items)
302
+ * @returns Promise with empty response on success or error
303
+ *
304
+ * @throws {StorageVectorsApiError} With code:
305
+ * - `S3VectorNotFoundException` if bucket or index doesn't exist (HTTP 404)
306
+ * - `InternalError` for server errors (HTTP 500)
307
+ *
308
+ * @example
309
+ * ```typescript
310
+ * const { error } = await client.deleteVectors({
311
+ * vectorBucketName: 'embeddings-prod',
312
+ * indexName: 'documents-openai-small',
313
+ * keys: ['doc-1', 'doc-2', 'doc-3']
314
+ * })
315
+ * if (!error) {
316
+ * console.log('Vectors deleted successfully')
317
+ * }
318
+ * ```
319
+ */
320
+ async deleteVectors(options: DeleteVectorsOptions): Promise<ApiResponse<undefined>> {
321
+ try {
322
+ // Validate batch size
323
+ if (options.keys.length < 1 || options.keys.length > 500) {
324
+ throw new Error('Keys batch size must be between 1 and 500 items')
325
+ }
326
+
327
+ const data = await post(this.fetch, `${this.url}/DeleteVectors`, options, {
328
+ headers: this.headers,
329
+ })
330
+ return { data: data || {}, error: null }
331
+ } catch (error) {
332
+ if (this.shouldThrowOnError) {
333
+ throw error
334
+ }
335
+ if (isStorageVectorsError(error)) {
336
+ return { data: null, error }
337
+ }
338
+ throw error
339
+ }
340
+ }
341
+ }