@rebasepro/server-core 0.0.1-canary.4d4fb3e → 0.0.1-canary.ca2cb6e

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 (176) hide show
  1. package/dist/common/src/collections/CollectionRegistry.d.ts +8 -0
  2. package/dist/common/src/util/entities.d.ts +22 -0
  3. package/dist/common/src/util/relations.d.ts +14 -4
  4. package/dist/common/src/util/resolutions.d.ts +1 -1
  5. package/dist/index-DXVBFp5V.js +37 -0
  6. package/dist/index-DXVBFp5V.js.map +1 -0
  7. package/dist/index.es.js +49931 -55
  8. package/dist/index.es.js.map +1 -1
  9. package/dist/index.umd.js +28475 -34569
  10. package/dist/index.umd.js.map +1 -1
  11. package/dist/server-core/src/api/openapi-generator.d.ts +15 -1
  12. package/dist/server-core/src/api/types.d.ts +1 -1
  13. package/dist/server-core/src/auth/admin-routes.d.ts +10 -1
  14. package/dist/server-core/src/auth/apple-oauth.d.ts +30 -0
  15. package/dist/server-core/src/auth/bitbucket-oauth.d.ts +11 -0
  16. package/dist/server-core/src/auth/discord-oauth.d.ts +14 -0
  17. package/dist/server-core/src/auth/facebook-oauth.d.ts +14 -0
  18. package/dist/server-core/src/auth/github-oauth.d.ts +15 -0
  19. package/dist/server-core/src/auth/gitlab-oauth.d.ts +13 -0
  20. package/dist/server-core/src/auth/google-oauth.d.ts +5 -11
  21. package/dist/server-core/src/auth/index.d.ts +13 -2
  22. package/dist/server-core/src/auth/interfaces.d.ts +45 -6
  23. package/dist/server-core/src/auth/jwt.d.ts +1 -0
  24. package/dist/server-core/src/auth/linkedin-oauth.d.ts +18 -0
  25. package/dist/server-core/src/auth/microsoft-oauth.d.ts +16 -0
  26. package/dist/server-core/src/auth/middleware.d.ts +36 -11
  27. package/dist/server-core/src/auth/rate-limiter.d.ts +2 -2
  28. package/dist/server-core/src/auth/routes.d.ts +13 -3
  29. package/dist/server-core/src/auth/slack-oauth.d.ts +12 -0
  30. package/dist/server-core/src/auth/spotify-oauth.d.ts +12 -0
  31. package/dist/server-core/src/auth/twitter-oauth.d.ts +18 -0
  32. package/dist/server-core/src/cron/cron-loader.d.ts +17 -0
  33. package/dist/server-core/src/cron/cron-routes.d.ts +14 -0
  34. package/dist/server-core/src/cron/cron-scheduler.d.ts +61 -0
  35. package/dist/server-core/src/cron/cron-store.d.ts +32 -0
  36. package/dist/server-core/src/cron/index.d.ts +6 -0
  37. package/dist/server-core/src/email/index.d.ts +2 -2
  38. package/dist/server-core/src/email/templates.d.ts +9 -0
  39. package/dist/server-core/src/email/types.d.ts +20 -23
  40. package/dist/server-core/src/history/history-routes.d.ts +2 -2
  41. package/dist/server-core/src/index.d.ts +5 -0
  42. package/dist/server-core/src/init.d.ts +112 -2
  43. package/dist/server-core/src/singleton.d.ts +35 -0
  44. package/dist/server-core/src/storage/LocalStorageController.d.ts +9 -9
  45. package/dist/server-core/src/storage/S3StorageController.d.ts +8 -8
  46. package/dist/server-core/src/storage/index.d.ts +18 -11
  47. package/dist/server-core/src/storage/routes.d.ts +3 -3
  48. package/dist/server-core/src/storage/types.d.ts +28 -16
  49. package/dist/server-core/src/utils/dev-port.d.ts +35 -0
  50. package/dist/server-core/src/utils/logger.d.ts +31 -0
  51. package/dist/server-core/src/utils/request-logger.d.ts +19 -0
  52. package/dist/types/src/controllers/auth.d.ts +2 -0
  53. package/dist/types/src/controllers/client.d.ts +119 -7
  54. package/dist/types/src/controllers/collection_registry.d.ts +4 -3
  55. package/dist/types/src/controllers/customization_controller.d.ts +7 -1
  56. package/dist/types/src/controllers/data.d.ts +34 -7
  57. package/dist/types/src/controllers/data_driver.d.ts +20 -28
  58. package/dist/types/src/controllers/database_admin.d.ts +2 -2
  59. package/dist/types/src/controllers/email.d.ts +34 -0
  60. package/dist/types/src/controllers/index.d.ts +1 -0
  61. package/dist/types/src/controllers/local_config_persistence.d.ts +4 -4
  62. package/dist/types/src/controllers/navigation.d.ts +5 -5
  63. package/dist/types/src/controllers/registry.d.ts +6 -3
  64. package/dist/types/src/controllers/side_entity_controller.d.ts +7 -6
  65. package/dist/types/src/controllers/storage.d.ts +24 -26
  66. package/dist/types/src/rebase_context.d.ts +8 -4
  67. package/dist/types/src/types/backend.d.ts +4 -1
  68. package/dist/types/src/types/builders.d.ts +5 -4
  69. package/dist/types/src/types/chips.d.ts +1 -1
  70. package/dist/types/src/types/collections.d.ts +169 -125
  71. package/dist/types/src/types/cron.d.ts +102 -0
  72. package/dist/types/src/types/data_source.d.ts +1 -1
  73. package/dist/types/src/types/entity_actions.d.ts +8 -8
  74. package/dist/types/src/types/entity_callbacks.d.ts +15 -15
  75. package/dist/types/src/types/entity_link_builder.d.ts +1 -1
  76. package/dist/types/src/types/entity_overrides.d.ts +2 -1
  77. package/dist/types/src/types/entity_views.d.ts +8 -8
  78. package/dist/types/src/types/export_import.d.ts +3 -3
  79. package/dist/types/src/types/index.d.ts +1 -0
  80. package/dist/types/src/types/plugins.d.ts +72 -18
  81. package/dist/types/src/types/properties.d.ts +118 -33
  82. package/dist/types/src/types/relations.d.ts +1 -1
  83. package/dist/types/src/types/slots.d.ts +30 -6
  84. package/dist/types/src/types/translations.d.ts +44 -0
  85. package/dist/types/src/types/user_management_delegate.d.ts +1 -0
  86. package/package.json +84 -84
  87. package/scratch.ts +6 -5
  88. package/src/api/ast-schema-editor.ts +11 -11
  89. package/src/api/collections_for_test/callbacks_test_collection.ts +5 -2
  90. package/src/api/errors.ts +38 -14
  91. package/src/api/graphql/graphql-schema-generator.ts +5 -3
  92. package/src/api/openapi-generator.ts +613 -58
  93. package/src/api/rest/api-generator.ts +17 -11
  94. package/src/api/rest/query-parser.ts +1 -1
  95. package/src/api/schema-editor-routes.ts +2 -0
  96. package/src/api/server.ts +8 -5
  97. package/src/api/types.ts +1 -1
  98. package/src/auth/admin-routes.ts +58 -17
  99. package/src/auth/apple-oauth.ts +130 -0
  100. package/src/auth/bitbucket-oauth.ts +82 -0
  101. package/src/auth/discord-oauth.ts +83 -0
  102. package/src/auth/facebook-oauth.ts +72 -0
  103. package/src/auth/github-oauth.ts +110 -0
  104. package/src/auth/gitlab-oauth.ts +70 -0
  105. package/src/auth/google-oauth.ts +34 -46
  106. package/src/auth/index.ts +15 -2
  107. package/src/auth/interfaces.ts +54 -7
  108. package/src/auth/jwt.ts +22 -5
  109. package/src/auth/linkedin-oauth.ts +81 -0
  110. package/src/auth/microsoft-oauth.ts +88 -0
  111. package/src/auth/middleware.ts +194 -45
  112. package/src/auth/password.ts +3 -1
  113. package/src/auth/rate-limiter.ts +4 -4
  114. package/src/auth/routes.ts +197 -139
  115. package/src/auth/slack-oauth.ts +71 -0
  116. package/src/auth/spotify-oauth.ts +67 -0
  117. package/src/auth/twitter-oauth.ts +120 -0
  118. package/src/collections/loader.ts +6 -6
  119. package/src/cron/cron-loader.ts +89 -0
  120. package/src/cron/cron-routes.test.ts +265 -0
  121. package/src/cron/cron-routes.ts +85 -0
  122. package/src/cron/cron-scheduler.test.ts +421 -0
  123. package/src/cron/cron-scheduler.ts +413 -0
  124. package/src/cron/cron-store.ts +163 -0
  125. package/src/cron/index.ts +6 -0
  126. package/src/db/interfaces.ts +2 -2
  127. package/src/email/index.ts +3 -2
  128. package/src/email/smtp-email-service.ts +5 -2
  129. package/src/email/templates.ts +93 -6
  130. package/src/email/types.ts +17 -24
  131. package/src/functions/function-loader.ts +34 -6
  132. package/src/functions/function-routes.ts +2 -2
  133. package/src/history/history-routes.ts +4 -3
  134. package/src/index.ts +10 -0
  135. package/src/init.ts +475 -57
  136. package/src/services/driver-registry.ts +1 -1
  137. package/src/singleton.test.ts +28 -0
  138. package/src/singleton.ts +70 -0
  139. package/src/storage/LocalStorageController.ts +50 -53
  140. package/src/storage/S3StorageController.ts +49 -46
  141. package/src/storage/index.ts +27 -16
  142. package/src/storage/routes.ts +76 -59
  143. package/src/storage/storage-registry.ts +5 -5
  144. package/src/storage/types.ts +44 -32
  145. package/src/types/index.ts +4 -4
  146. package/src/utils/dev-port.ts +176 -0
  147. package/src/utils/logger.ts +143 -0
  148. package/src/utils/logging.ts +5 -2
  149. package/src/utils/request-logger.ts +66 -0
  150. package/test/admin-routes.test.ts +114 -65
  151. package/test/api-generator.test.ts +73 -30
  152. package/test/ast-schema-editor.test.ts +5 -3
  153. package/test/auth-middleware-hono.test.ts +268 -33
  154. package/test/auth-routes.test.ts +325 -146
  155. package/test/driver-registry.test.ts +4 -2
  156. package/test/error-propagation.test.ts +226 -0
  157. package/test/errors.test.ts +12 -7
  158. package/test/jwt-security.test.ts +18 -9
  159. package/test/jwt.test.ts +26 -13
  160. package/test/middleware.test.ts +13 -8
  161. package/test/query-parser.test.ts +13 -8
  162. package/test/rate-limiter.test.ts +7 -7
  163. package/test/safe-compare.test.ts +66 -0
  164. package/test/singleton.test.ts +59 -0
  165. package/test/storage-local.test.ts +36 -43
  166. package/test/storage-registry.test.ts +38 -36
  167. package/test/storage-routes.test.ts +9 -5
  168. package/test/storage-s3.test.ts +51 -48
  169. package/test.ts +6 -0
  170. package/tsconfig.json +1 -1
  171. package/vite.config.ts +7 -5
  172. package/dist/index-BeMqpmfQ.js +0 -239
  173. package/dist/index-BeMqpmfQ.js.map +0 -1
  174. package/dist/index-bl4J3lNb.js +0 -55823
  175. package/dist/index-bl4J3lNb.js.map +0 -1
  176. package/vite.config.ts.timestamp-1775065397568-8a853255edf6e.mjs +0 -46
@@ -1,28 +1,28 @@
1
+ import { describe, it, expect, beforeEach, afterEach, jest as vi } from "@jest/globals";
1
2
  import { S3StorageController } from "../src/storage/S3StorageController";
2
3
 
3
4
  // Mock the AWS SDK before importing the controller
4
- jest.mock("@aws-sdk/client-s3", () => ({
5
- S3Client: jest.fn().mockImplementation(() => ({
6
- send: jest.fn()
7
- })),
8
- PutObjectCommand: jest.fn(),
9
- GetObjectCommand: jest.fn(),
10
- DeleteObjectCommand: jest.fn(),
11
- ListObjectsV2Command: jest.fn(),
12
- HeadObjectCommand: jest.fn()
5
+ vi.mock("@aws-sdk/client-s3", () => ({
6
+ S3Client: vi.fn().mockImplementation(function() {
7
+ return { send: vi.fn() };
8
+ }),
9
+ PutObjectCommand: vi.fn(),
10
+ GetObjectCommand: vi.fn(),
11
+ DeleteObjectCommand: vi.fn(),
12
+ ListObjectsV2Command: vi.fn(),
13
+ HeadObjectCommand: vi.fn()
13
14
  }));
14
15
 
15
- jest.mock("@aws-sdk/s3-request-presigner", () => ({
16
- getSignedUrl: jest.fn().mockResolvedValue("https://presigned-url.example.com")
16
+ vi.mock("@aws-sdk/s3-request-presigner", () => ({
17
+ getSignedUrl: vi.fn().mockResolvedValue("https://presigned-url.example.com")
17
18
  }));
18
19
 
19
- // Import the mocked modules
20
- const { S3Client, PutObjectCommand, GetObjectCommand, DeleteObjectCommand, ListObjectsV2Command } = require("@aws-sdk/client-s3");
21
- const { getSignedUrl } = require("@aws-sdk/s3-request-presigner");
20
+ import { S3Client, PutObjectCommand, GetObjectCommand, DeleteObjectCommand, ListObjectsV2Command } from "@aws-sdk/client-s3";
21
+ import { getSignedUrl } from "@aws-sdk/s3-request-presigner";
22
22
 
23
23
  describe("S3StorageController", () => {
24
24
  let controller: S3StorageController;
25
- let mockSend: jest.Mock;
25
+ let mockSend: vi.Mock;
26
26
 
27
27
  const defaultConfig = {
28
28
  bucket: "test-bucket",
@@ -32,11 +32,11 @@ describe("S3StorageController", () => {
32
32
  };
33
33
 
34
34
  beforeEach(() => {
35
- jest.clearAllMocks();
36
- mockSend = jest.fn();
37
- (S3Client as jest.Mock).mockImplementation(() => ({
38
- send: mockSend
39
- }));
35
+ vi.clearAllMocks();
36
+ mockSend = vi.fn();
37
+ vi.mocked(S3Client).mockImplementation(function() {
38
+ return { send: mockSend };
39
+ } as any);
40
40
  controller = new S3StorageController(defaultConfig);
41
41
  });
42
42
 
@@ -52,7 +52,7 @@ describe("S3StorageController", () => {
52
52
  });
53
53
 
54
54
  it("should initialize with endpoint for S3-compatible services", () => {
55
- jest.clearAllMocks();
55
+ vi.clearAllMocks();
56
56
  new S3StorageController({
57
57
  ...defaultConfig,
58
58
  endpoint: "https://minio.example.com",
@@ -70,17 +70,16 @@ describe("S3StorageController", () => {
70
70
  });
71
71
  });
72
72
 
73
- describe("uploadFile", () => {
73
+ describe("putObject", () => {
74
74
  it("should upload file using PutObjectCommand", async () => {
75
75
  const content = Buffer.from("Test content");
76
76
  const file = new File([content], "test.txt", { type: "text/plain" });
77
77
 
78
78
  mockSend.mockResolvedValueOnce({});
79
79
 
80
- const result = await controller.uploadFile({
80
+ const result = await controller.putObject({
81
81
  file,
82
- fileName: "test.txt",
83
- path: "uploads"
82
+ key: "uploads/test.txt"
84
83
  });
85
84
 
86
85
  expect(PutObjectCommand).toHaveBeenCalledWith(expect.objectContaining({
@@ -89,7 +88,7 @@ describe("S3StorageController", () => {
89
88
  ContentType: "text/plain"
90
89
  }));
91
90
  expect(mockSend).toHaveBeenCalled();
92
- expect(result.path).toBe("uploads/test.txt");
91
+ expect(result.key).toBe("uploads/test.txt");
93
92
  });
94
93
 
95
94
  it("should include metadata in upload", async () => {
@@ -97,10 +96,9 @@ describe("S3StorageController", () => {
97
96
 
98
97
  mockSend.mockResolvedValueOnce({});
99
98
 
100
- await controller.uploadFile({
99
+ await controller.putObject({
101
100
  file,
102
- fileName: "test.txt",
103
- path: "uploads",
101
+ key: "uploads/test.txt",
104
102
  metadata: { customKey: "customValue" }
105
103
  });
106
104
 
@@ -116,10 +114,9 @@ describe("S3StorageController", () => {
116
114
 
117
115
  mockSend.mockResolvedValueOnce({});
118
116
 
119
- await controller.uploadFile({
117
+ await controller.putObject({
120
118
  file,
121
- fileName: "test.txt",
122
- path: "uploads",
119
+ key: "uploads/test.txt",
123
120
  bucket: "custom-bucket"
124
121
  });
125
122
 
@@ -129,7 +126,7 @@ describe("S3StorageController", () => {
129
126
  });
130
127
  });
131
128
 
132
- describe("getDownloadURL", () => {
129
+ describe("getSignedUrl", () => {
133
130
  it("should generate presigned URL", async () => {
134
131
  mockSend.mockResolvedValueOnce({
135
132
  ContentType: "text/plain",
@@ -138,7 +135,7 @@ describe("S3StorageController", () => {
138
135
  Metadata: {}
139
136
  });
140
137
 
141
- const result = await controller.getDownloadURL("uploads/test.txt");
138
+ const result = await controller.getSignedUrl("uploads/test.txt");
142
139
 
143
140
  expect(getSignedUrl).toHaveBeenCalled();
144
141
  expect(result.url).toBe("https://presigned-url.example.com");
@@ -153,30 +150,30 @@ describe("S3StorageController", () => {
153
150
  Metadata: { originalName: "photo.png" }
154
151
  });
155
152
 
156
- const result = await controller.getDownloadURL("images/photo.png");
153
+ const result = await controller.getSignedUrl("images/photo.png");
157
154
 
158
155
  expect(result.metadata).toBeDefined();
159
156
  expect(result.metadata?.contentType).toBe("image/png");
160
157
  });
161
158
  });
162
159
 
163
- describe("getFile", () => {
160
+ describe("getObject", () => {
164
161
  it("should return null for non-existent file", async () => {
165
162
  const error = new Error("NoSuchKey");
166
163
  (error as any).name = "NoSuchKey";
167
164
  mockSend.mockRejectedValueOnce(error);
168
165
 
169
- const result = await controller.getFile("nonexistent.txt");
166
+ const result = await controller.getObject("nonexistent.txt");
170
167
 
171
168
  expect(result).toBeNull();
172
169
  });
173
170
  });
174
171
 
175
- describe("deleteFile", () => {
172
+ describe("deleteObject", () => {
176
173
  it("should delete file from S3", async () => {
177
174
  mockSend.mockResolvedValueOnce({});
178
175
 
179
- await controller.deleteFile("uploads/test.txt");
176
+ await controller.deleteObject("uploads/test.txt");
180
177
 
181
178
  expect(DeleteObjectCommand).toHaveBeenCalledWith(expect.objectContaining({
182
179
  Bucket: "test-bucket",
@@ -187,7 +184,7 @@ describe("S3StorageController", () => {
187
184
  it("should not throw for non-existent file", async () => {
188
185
  mockSend.mockResolvedValueOnce({});
189
186
 
190
- await expect(controller.deleteFile("nonexistent.txt")).resolves.not.toThrow();
187
+ await expect(controller.deleteObject("nonexistent.txt")).resolves.not.toThrow();
191
188
  });
192
189
  });
193
190
 
@@ -195,18 +192,22 @@ describe("S3StorageController", () => {
195
192
  it("should list objects in S3 bucket", async () => {
196
193
  mockSend.mockResolvedValueOnce({
197
194
  Contents: [
198
- { Key: "uploads/file1.txt", Size: 100, LastModified: new Date() },
199
- { Key: "uploads/file2.txt", Size: 200, LastModified: new Date() }
195
+ { Key: "uploads/file1.txt",
196
+ Size: 100,
197
+ LastModified: new Date() },
198
+ { Key: "uploads/file2.txt",
199
+ Size: 200,
200
+ LastModified: new Date() }
200
201
  ],
201
202
  CommonPrefixes: [],
202
203
  IsTruncated: false
203
204
  });
204
205
 
205
- const result = await controller.list("uploads");
206
+ const result = await controller.listObjects("uploads");
206
207
 
207
208
  expect(ListObjectsV2Command).toHaveBeenCalledWith(expect.objectContaining({
208
209
  Bucket: "test-bucket",
209
- Prefix: "uploads" // Implementation doesn't add trailing slash
210
+ Prefix: "uploads" // Implementation doesn't add trailing slash
210
211
  }));
211
212
  expect(result.items).toHaveLength(2);
212
213
  });
@@ -214,14 +215,16 @@ describe("S3StorageController", () => {
214
215
  it("should handle pagination with maxResults", async () => {
215
216
  mockSend.mockResolvedValueOnce({
216
217
  Contents: [
217
- { Key: "uploads/file1.txt", Size: 100, LastModified: new Date() }
218
+ { Key: "uploads/file1.txt",
219
+ Size: 100,
220
+ LastModified: new Date() }
218
221
  ],
219
222
  CommonPrefixes: [],
220
223
  IsTruncated: true,
221
224
  NextContinuationToken: "token123"
222
225
  });
223
226
 
224
- const result = await controller.list("uploads", { maxResults: 1 });
227
+ const result = await controller.listObjects("uploads", { maxResults: 1 });
225
228
 
226
229
  expect(ListObjectsV2Command).toHaveBeenCalledWith(expect.objectContaining({
227
230
  MaxKeys: 1
@@ -239,7 +242,7 @@ describe("S3StorageController", () => {
239
242
  IsTruncated: false
240
243
  });
241
244
 
242
- const result = await controller.list("uploads");
245
+ const result = await controller.listObjects("uploads");
243
246
 
244
247
  expect(result.prefixes).toHaveLength(2);
245
248
  });
@@ -251,7 +254,7 @@ describe("S3StorageController", () => {
251
254
  IsTruncated: false
252
255
  });
253
256
 
254
- await controller.list("uploads", { pageToken: "continue-token" });
257
+ await controller.listObjects("uploads", { pageToken: "continue-token" });
255
258
 
256
259
  expect(ListObjectsV2Command).toHaveBeenCalledWith(expect.objectContaining({
257
260
  ContinuationToken: "continue-token"
package/test.ts ADDED
@@ -0,0 +1,6 @@
1
+ interface I {
2
+ verify: (payload: any) => void;
3
+ }
4
+ const obj: I = {
5
+ verify: (payload: { code: string }) => {}
6
+ };
package/tsconfig.json CHANGED
@@ -30,7 +30,7 @@
30
30
  "@rebasepro/types": [
31
31
  "../types/src"
32
32
  ],
33
- "@rebasepro/cms": [
33
+ "@rebasepro/admin": [
34
34
  "../types/src/cms"
35
35
  ],
36
36
  "@rebasepro/common": [
package/vite.config.ts CHANGED
@@ -17,17 +17,19 @@ const CONSUMER_EXTERNALS = [
17
17
  "hono",
18
18
  "drizzle-orm",
19
19
  "@hono/node-server",
20
+ "@aws-sdk/client-s3",
21
+ "@aws-sdk/s3-request-presigner",
20
22
  "dotenv",
21
23
  "pg",
22
24
  "chokidar",
23
25
  "fsevents",
24
26
  "ws",
25
- "ts-morph",
27
+ "ts-morph"
26
28
  ];
27
29
  const isExternal = (id: string) => {
28
30
  if (id.startsWith(".") || path.isAbsolute(id)) return false;
29
31
  // Inline all @rebasepro/* packages
30
-
32
+
31
33
  // Externalize only deps the consumer app explicitly installs
32
34
  if (CONSUMER_EXTERNALS.some(ext => id === ext || id.startsWith(ext + "/"))) return true;
33
35
  // Externalize Node built-ins
@@ -63,15 +65,15 @@ export default defineConfig(() => ({
63
65
  resolve: {
64
66
  alias: {
65
67
  "@rebasepro/common": path.resolve(__dirname, "../common/src"),
66
- "@rebasepro/types": path.resolve(__dirname, "../types/src"),
68
+ "@rebasepro/types": path.resolve(__dirname, "../types/src")
67
69
  }
68
70
  },
69
71
  plugins: [
70
72
  react({
71
73
  babel: {
72
74
  plugins: [
73
- ["babel-plugin-react-compiler", ReactCompilerConfig],
74
- ],
75
+ ["babel-plugin-react-compiler", ReactCompilerConfig]
76
+ ]
75
77
  }
76
78
  })
77
79
  ]
@@ -1,239 +0,0 @@
1
- import { t as toUtf8, f as fromUtf8 } from "./index-bl4J3lNb.js";
2
- class EventStreamSerde {
3
- marshaller;
4
- serializer;
5
- deserializer;
6
- serdeContext;
7
- defaultContentType;
8
- constructor({ marshaller, serializer, deserializer, serdeContext, defaultContentType }) {
9
- this.marshaller = marshaller;
10
- this.serializer = serializer;
11
- this.deserializer = deserializer;
12
- this.serdeContext = serdeContext;
13
- this.defaultContentType = defaultContentType;
14
- }
15
- async serializeEventStream({ eventStream, requestSchema, initialRequest }) {
16
- const marshaller = this.marshaller;
17
- const eventStreamMember = requestSchema.getEventStreamMember();
18
- const unionSchema = requestSchema.getMemberSchema(eventStreamMember);
19
- const serializer = this.serializer;
20
- const defaultContentType = this.defaultContentType;
21
- const initialRequestMarker = Symbol("initialRequestMarker");
22
- const eventStreamIterable = {
23
- async *[Symbol.asyncIterator]() {
24
- if (initialRequest) {
25
- const headers = {
26
- ":event-type": { type: "string", value: "initial-request" },
27
- ":message-type": { type: "string", value: "event" },
28
- ":content-type": { type: "string", value: defaultContentType }
29
- };
30
- serializer.write(requestSchema, initialRequest);
31
- const body = serializer.flush();
32
- yield {
33
- [initialRequestMarker]: true,
34
- headers,
35
- body
36
- };
37
- }
38
- for await (const page of eventStream) {
39
- yield page;
40
- }
41
- }
42
- };
43
- return marshaller.serialize(eventStreamIterable, (event) => {
44
- if (event[initialRequestMarker]) {
45
- return {
46
- headers: event.headers,
47
- body: event.body
48
- };
49
- }
50
- const unionMember = Object.keys(event).find((key) => {
51
- return key !== "__type";
52
- }) ?? "";
53
- const { additionalHeaders, body, eventType, explicitPayloadContentType } = this.writeEventBody(unionMember, unionSchema, event);
54
- const headers = {
55
- ":event-type": { type: "string", value: eventType },
56
- ":message-type": { type: "string", value: "event" },
57
- ":content-type": { type: "string", value: explicitPayloadContentType ?? defaultContentType },
58
- ...additionalHeaders
59
- };
60
- return {
61
- headers,
62
- body
63
- };
64
- });
65
- }
66
- async deserializeEventStream({ response, responseSchema, initialResponseContainer }) {
67
- const marshaller = this.marshaller;
68
- const eventStreamMember = responseSchema.getEventStreamMember();
69
- const unionSchema = responseSchema.getMemberSchema(eventStreamMember);
70
- const memberSchemas = unionSchema.getMemberSchemas();
71
- const initialResponseMarker = Symbol("initialResponseMarker");
72
- const asyncIterable = marshaller.deserialize(response.body, async (event) => {
73
- const unionMember = Object.keys(event).find((key) => {
74
- return key !== "__type";
75
- }) ?? "";
76
- const body = event[unionMember].body;
77
- if (unionMember === "initial-response") {
78
- const dataObject = await this.deserializer.read(responseSchema, body);
79
- delete dataObject[eventStreamMember];
80
- return {
81
- [initialResponseMarker]: true,
82
- ...dataObject
83
- };
84
- } else if (unionMember in memberSchemas) {
85
- const eventStreamSchema = memberSchemas[unionMember];
86
- if (eventStreamSchema.isStructSchema()) {
87
- const out = {};
88
- let hasBindings = false;
89
- for (const [name, member] of eventStreamSchema.structIterator()) {
90
- const { eventHeader, eventPayload } = member.getMergedTraits();
91
- hasBindings = hasBindings || Boolean(eventHeader || eventPayload);
92
- if (eventPayload) {
93
- if (member.isBlobSchema()) {
94
- out[name] = body;
95
- } else if (member.isStringSchema()) {
96
- out[name] = (this.serdeContext?.utf8Encoder ?? toUtf8)(body);
97
- } else if (member.isStructSchema()) {
98
- out[name] = await this.deserializer.read(member, body);
99
- }
100
- } else if (eventHeader) {
101
- const value = event[unionMember].headers[name]?.value;
102
- if (value != null) {
103
- if (member.isNumericSchema()) {
104
- if (value && typeof value === "object" && "bytes" in value) {
105
- out[name] = BigInt(value.toString());
106
- } else {
107
- out[name] = Number(value);
108
- }
109
- } else {
110
- out[name] = value;
111
- }
112
- }
113
- }
114
- }
115
- if (hasBindings) {
116
- return {
117
- [unionMember]: out
118
- };
119
- }
120
- if (body.byteLength === 0) {
121
- return {
122
- [unionMember]: {}
123
- };
124
- }
125
- }
126
- return {
127
- [unionMember]: await this.deserializer.read(eventStreamSchema, body)
128
- };
129
- } else {
130
- return {
131
- $unknown: event
132
- };
133
- }
134
- });
135
- const asyncIterator = asyncIterable[Symbol.asyncIterator]();
136
- const firstEvent = await asyncIterator.next();
137
- if (firstEvent.done) {
138
- return asyncIterable;
139
- }
140
- if (firstEvent.value?.[initialResponseMarker]) {
141
- if (!responseSchema) {
142
- throw new Error("@smithy::core/protocols - initial-response event encountered in event stream but no response schema given.");
143
- }
144
- for (const [key, value] of Object.entries(firstEvent.value)) {
145
- initialResponseContainer[key] = value;
146
- }
147
- }
148
- return {
149
- async *[Symbol.asyncIterator]() {
150
- if (!firstEvent?.value?.[initialResponseMarker]) {
151
- yield firstEvent.value;
152
- }
153
- while (true) {
154
- const { done, value } = await asyncIterator.next();
155
- if (done) {
156
- break;
157
- }
158
- yield value;
159
- }
160
- }
161
- };
162
- }
163
- writeEventBody(unionMember, unionSchema, event) {
164
- const serializer = this.serializer;
165
- let eventType = unionMember;
166
- let explicitPayloadMember = null;
167
- let explicitPayloadContentType;
168
- const isKnownSchema = (() => {
169
- const struct = unionSchema.getSchema();
170
- return struct[4].includes(unionMember);
171
- })();
172
- const additionalHeaders = {};
173
- if (!isKnownSchema) {
174
- const [type, value] = event[unionMember];
175
- eventType = type;
176
- serializer.write(15, value);
177
- } else {
178
- const eventSchema = unionSchema.getMemberSchema(unionMember);
179
- if (eventSchema.isStructSchema()) {
180
- for (const [memberName, memberSchema] of eventSchema.structIterator()) {
181
- const { eventHeader, eventPayload } = memberSchema.getMergedTraits();
182
- if (eventPayload) {
183
- explicitPayloadMember = memberName;
184
- } else if (eventHeader) {
185
- const value = event[unionMember][memberName];
186
- let type = "binary";
187
- if (memberSchema.isNumericSchema()) {
188
- if ((-2) ** 31 <= value && value <= 2 ** 31 - 1) {
189
- type = "integer";
190
- } else {
191
- type = "long";
192
- }
193
- } else if (memberSchema.isTimestampSchema()) {
194
- type = "timestamp";
195
- } else if (memberSchema.isStringSchema()) {
196
- type = "string";
197
- } else if (memberSchema.isBooleanSchema()) {
198
- type = "boolean";
199
- }
200
- if (value != null) {
201
- additionalHeaders[memberName] = {
202
- type,
203
- value
204
- };
205
- delete event[unionMember][memberName];
206
- }
207
- }
208
- }
209
- if (explicitPayloadMember !== null) {
210
- const payloadSchema = eventSchema.getMemberSchema(explicitPayloadMember);
211
- if (payloadSchema.isBlobSchema()) {
212
- explicitPayloadContentType = "application/octet-stream";
213
- } else if (payloadSchema.isStringSchema()) {
214
- explicitPayloadContentType = "text/plain";
215
- }
216
- serializer.write(payloadSchema, event[unionMember][explicitPayloadMember]);
217
- } else {
218
- serializer.write(eventSchema, event[unionMember]);
219
- }
220
- } else if (eventSchema.isUnitSchema()) {
221
- serializer.write(eventSchema, {});
222
- } else {
223
- throw new Error("@smithy/core/event-streams - non-struct member not supported in event stream union.");
224
- }
225
- }
226
- const messageSerialization = serializer.flush() ?? new Uint8Array();
227
- const body = typeof messageSerialization === "string" ? (this.serdeContext?.utf8Decoder ?? fromUtf8)(messageSerialization) : messageSerialization;
228
- return {
229
- body,
230
- eventType,
231
- explicitPayloadContentType,
232
- additionalHeaders
233
- };
234
- }
235
- }
236
- export {
237
- EventStreamSerde
238
- };
239
- //# sourceMappingURL=index-BeMqpmfQ.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"index-BeMqpmfQ.js","sources":["../../../node_modules/@smithy/core/dist-es/submodules/event-streams/EventStreamSerde.js"],"sourcesContent":["import { fromUtf8, toUtf8 } from \"@smithy/util-utf8\";\nexport class EventStreamSerde {\n marshaller;\n serializer;\n deserializer;\n serdeContext;\n defaultContentType;\n constructor({ marshaller, serializer, deserializer, serdeContext, defaultContentType, }) {\n this.marshaller = marshaller;\n this.serializer = serializer;\n this.deserializer = deserializer;\n this.serdeContext = serdeContext;\n this.defaultContentType = defaultContentType;\n }\n async serializeEventStream({ eventStream, requestSchema, initialRequest, }) {\n const marshaller = this.marshaller;\n const eventStreamMember = requestSchema.getEventStreamMember();\n const unionSchema = requestSchema.getMemberSchema(eventStreamMember);\n const serializer = this.serializer;\n const defaultContentType = this.defaultContentType;\n const initialRequestMarker = Symbol(\"initialRequestMarker\");\n const eventStreamIterable = {\n async *[Symbol.asyncIterator]() {\n if (initialRequest) {\n const headers = {\n \":event-type\": { type: \"string\", value: \"initial-request\" },\n \":message-type\": { type: \"string\", value: \"event\" },\n \":content-type\": { type: \"string\", value: defaultContentType },\n };\n serializer.write(requestSchema, initialRequest);\n const body = serializer.flush();\n yield {\n [initialRequestMarker]: true,\n headers,\n body,\n };\n }\n for await (const page of eventStream) {\n yield page;\n }\n },\n };\n return marshaller.serialize(eventStreamIterable, (event) => {\n if (event[initialRequestMarker]) {\n return {\n headers: event.headers,\n body: event.body,\n };\n }\n const unionMember = Object.keys(event).find((key) => {\n return key !== \"__type\";\n }) ?? \"\";\n const { additionalHeaders, body, eventType, explicitPayloadContentType } = this.writeEventBody(unionMember, unionSchema, event);\n const headers = {\n \":event-type\": { type: \"string\", value: eventType },\n \":message-type\": { type: \"string\", value: \"event\" },\n \":content-type\": { type: \"string\", value: explicitPayloadContentType ?? defaultContentType },\n ...additionalHeaders,\n };\n return {\n headers,\n body,\n };\n });\n }\n async deserializeEventStream({ response, responseSchema, initialResponseContainer, }) {\n const marshaller = this.marshaller;\n const eventStreamMember = responseSchema.getEventStreamMember();\n const unionSchema = responseSchema.getMemberSchema(eventStreamMember);\n const memberSchemas = unionSchema.getMemberSchemas();\n const initialResponseMarker = Symbol(\"initialResponseMarker\");\n const asyncIterable = marshaller.deserialize(response.body, async (event) => {\n const unionMember = Object.keys(event).find((key) => {\n return key !== \"__type\";\n }) ?? \"\";\n const body = event[unionMember].body;\n if (unionMember === \"initial-response\") {\n const dataObject = await this.deserializer.read(responseSchema, body);\n delete dataObject[eventStreamMember];\n return {\n [initialResponseMarker]: true,\n ...dataObject,\n };\n }\n else if (unionMember in memberSchemas) {\n const eventStreamSchema = memberSchemas[unionMember];\n if (eventStreamSchema.isStructSchema()) {\n const out = {};\n let hasBindings = false;\n for (const [name, member] of eventStreamSchema.structIterator()) {\n const { eventHeader, eventPayload } = member.getMergedTraits();\n hasBindings = hasBindings || Boolean(eventHeader || eventPayload);\n if (eventPayload) {\n if (member.isBlobSchema()) {\n out[name] = body;\n }\n else if (member.isStringSchema()) {\n out[name] = (this.serdeContext?.utf8Encoder ?? toUtf8)(body);\n }\n else if (member.isStructSchema()) {\n out[name] = await this.deserializer.read(member, body);\n }\n }\n else if (eventHeader) {\n const value = event[unionMember].headers[name]?.value;\n if (value != null) {\n if (member.isNumericSchema()) {\n if (value && typeof value === \"object\" && \"bytes\" in value) {\n out[name] = BigInt(value.toString());\n }\n else {\n out[name] = Number(value);\n }\n }\n else {\n out[name] = value;\n }\n }\n }\n }\n if (hasBindings) {\n return {\n [unionMember]: out,\n };\n }\n if (body.byteLength === 0) {\n return {\n [unionMember]: {},\n };\n }\n }\n return {\n [unionMember]: await this.deserializer.read(eventStreamSchema, body),\n };\n }\n else {\n return {\n $unknown: event,\n };\n }\n });\n const asyncIterator = asyncIterable[Symbol.asyncIterator]();\n const firstEvent = await asyncIterator.next();\n if (firstEvent.done) {\n return asyncIterable;\n }\n if (firstEvent.value?.[initialResponseMarker]) {\n if (!responseSchema) {\n throw new Error(\"@smithy::core/protocols - initial-response event encountered in event stream but no response schema given.\");\n }\n for (const [key, value] of Object.entries(firstEvent.value)) {\n initialResponseContainer[key] = value;\n }\n }\n return {\n async *[Symbol.asyncIterator]() {\n if (!firstEvent?.value?.[initialResponseMarker]) {\n yield firstEvent.value;\n }\n while (true) {\n const { done, value } = await asyncIterator.next();\n if (done) {\n break;\n }\n yield value;\n }\n },\n };\n }\n writeEventBody(unionMember, unionSchema, event) {\n const serializer = this.serializer;\n let eventType = unionMember;\n let explicitPayloadMember = null;\n let explicitPayloadContentType;\n const isKnownSchema = (() => {\n const struct = unionSchema.getSchema();\n return struct[4].includes(unionMember);\n })();\n const additionalHeaders = {};\n if (!isKnownSchema) {\n const [type, value] = event[unionMember];\n eventType = type;\n serializer.write(15, value);\n }\n else {\n const eventSchema = unionSchema.getMemberSchema(unionMember);\n if (eventSchema.isStructSchema()) {\n for (const [memberName, memberSchema] of eventSchema.structIterator()) {\n const { eventHeader, eventPayload } = memberSchema.getMergedTraits();\n if (eventPayload) {\n explicitPayloadMember = memberName;\n }\n else if (eventHeader) {\n const value = event[unionMember][memberName];\n let type = \"binary\";\n if (memberSchema.isNumericSchema()) {\n if ((-2) ** 31 <= value && value <= 2 ** 31 - 1) {\n type = \"integer\";\n }\n else {\n type = \"long\";\n }\n }\n else if (memberSchema.isTimestampSchema()) {\n type = \"timestamp\";\n }\n else if (memberSchema.isStringSchema()) {\n type = \"string\";\n }\n else if (memberSchema.isBooleanSchema()) {\n type = \"boolean\";\n }\n if (value != null) {\n additionalHeaders[memberName] = {\n type,\n value,\n };\n delete event[unionMember][memberName];\n }\n }\n }\n if (explicitPayloadMember !== null) {\n const payloadSchema = eventSchema.getMemberSchema(explicitPayloadMember);\n if (payloadSchema.isBlobSchema()) {\n explicitPayloadContentType = \"application/octet-stream\";\n }\n else if (payloadSchema.isStringSchema()) {\n explicitPayloadContentType = \"text/plain\";\n }\n serializer.write(payloadSchema, event[unionMember][explicitPayloadMember]);\n }\n else {\n serializer.write(eventSchema, event[unionMember]);\n }\n }\n else if (eventSchema.isUnitSchema()) {\n serializer.write(eventSchema, {});\n }\n else {\n throw new Error(\"@smithy/core/event-streams - non-struct member not supported in event stream union.\");\n }\n }\n const messageSerialization = serializer.flush() ?? new Uint8Array();\n const body = typeof messageSerialization === \"string\"\n ? (this.serdeContext?.utf8Decoder ?? fromUtf8)(messageSerialization)\n : messageSerialization;\n return {\n body,\n eventType,\n explicitPayloadContentType,\n additionalHeaders,\n };\n }\n}\n"],"names":[],"mappings":"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","x_google_ignoreList":[0]}