@karmaniverous/get-dotenv 6.2.2 → 6.2.4
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/chunks/AwsRestJsonProtocol-Bq1HE-Ln.mjs +932 -0
- package/dist/chunks/createCli-BY6_cfZr.mjs +439 -0
- package/dist/chunks/externalDataInterceptor-CbsdEYa-.mjs +19 -0
- package/dist/chunks/getSSOTokenFromFile-hUSpR7Wf.mjs +22 -0
- package/dist/chunks/helpConfig-CGejgwWW.mjs +12 -0
- package/dist/chunks/index-B5JKTBOL.mjs +443 -0
- package/dist/chunks/index-BEJFiHMX.mjs +522 -0
- package/dist/chunks/index-BPYF6K_G.mjs +82 -0
- package/dist/chunks/index-Bc3h0a95.mjs +374 -0
- package/dist/chunks/index-BpCF5UKx.mjs +272 -0
- package/dist/chunks/index-C_wqbTwI.mjs +187 -0
- package/dist/chunks/index-CeCufHlm.mjs +9374 -0
- package/dist/chunks/index-Cu7rdyqN.mjs +102 -0
- package/dist/chunks/index-DWAtHEA-.mjs +379 -0
- package/dist/chunks/index-Dp1Ip6Ra.mjs +354 -0
- package/dist/chunks/index-DyU5pKKi.mjs +24 -0
- package/dist/chunks/index-c7zKtEuy.mjs +578 -0
- package/dist/chunks/index-cIunyiUQ.mjs +702 -0
- package/dist/chunks/invoke-DuRPU1oC.mjs +60 -0
- package/dist/chunks/loadModuleDefault-Dj8B3Stt.mjs +123 -0
- package/dist/chunks/loadSso-w1eTVg0O.mjs +412 -0
- package/dist/chunks/loader-DnhPeGfq.mjs +346 -0
- package/dist/chunks/overlayEnv-Bs2kVayG.mjs +234 -0
- package/dist/chunks/package-boo9EyYs.mjs +5 -0
- package/dist/chunks/parseKnownFiles-B9cDK21V.mjs +23 -0
- package/dist/chunks/readMergedOptions-Nt0TR7dX.mjs +1626 -0
- package/dist/chunks/resolveCliOptions-TFRzhB2c.mjs +138 -0
- package/dist/chunks/sdk-stream-mixin-BZoJ5jy9.mjs +167 -0
- package/dist/chunks/spawnEnv-CN8a7cNR.mjs +306 -0
- package/dist/chunks/types-DJ-BGABd.mjs +59 -0
- package/dist/chunks/validate-CDl0rE6k.mjs +61 -0
- package/dist/cli.mjs +39 -19307
- package/dist/cliHost.mjs +20 -2800
- package/dist/config.mjs +10 -509
- package/dist/env-overlay.mjs +6 -337
- package/dist/getdotenv.cli.mjs +39 -19305
- package/dist/index.mjs +39 -19396
- package/dist/plugins-aws.d.ts +1 -4
- package/dist/plugins-aws.mjs +65 -2568
- package/dist/plugins-batch.mjs +16 -2573
- package/dist/plugins-cmd.mjs +19 -3094
- package/dist/plugins-init.d.ts +8 -0
- package/dist/plugins-init.mjs +85 -2297
- package/dist/plugins.mjs +36 -18817
- package/package.json +1 -2
- package/dist/templates/cli/index.ts +0 -25
- package/dist/templates/cli/plugins/hello/defaultAction.ts +0 -27
- package/dist/templates/cli/plugins/hello/index.ts +0 -26
- package/dist/templates/cli/plugins/hello/options.ts +0 -31
- package/dist/templates/cli/plugins/hello/strangerAction.ts +0 -20
- package/dist/templates/cli/plugins/hello/types.ts +0 -13
- package/dist/templates/config/js/getdotenv.config.js +0 -20
- package/dist/templates/config/json/local/getdotenv.config.local.json +0 -7
- package/dist/templates/config/json/public/getdotenv.config.json +0 -9
- package/dist/templates/config/public/getdotenv.config.json +0 -8
- package/dist/templates/config/ts/getdotenv.config.ts +0 -28
- package/dist/templates/config/yaml/local/getdotenv.config.local.yaml +0 -7
- package/dist/templates/config/yaml/public/getdotenv.config.yaml +0 -7
- package/dist/templates/defaultAction.ts +0 -27
- package/dist/templates/getdotenv.config.js +0 -20
- package/dist/templates/getdotenv.config.json +0 -9
- package/dist/templates/getdotenv.config.local.json +0 -7
- package/dist/templates/getdotenv.config.local.yaml +0 -7
- package/dist/templates/getdotenv.config.ts +0 -28
- package/dist/templates/getdotenv.config.yaml +0 -7
- package/dist/templates/hello/defaultAction.ts +0 -27
- package/dist/templates/hello/index.ts +0 -26
- package/dist/templates/hello/options.ts +0 -31
- package/dist/templates/hello/strangerAction.ts +0 -20
- package/dist/templates/hello/types.ts +0 -13
- package/dist/templates/index.ts +0 -26
- package/dist/templates/js/getdotenv.config.js +0 -20
- package/dist/templates/json/local/getdotenv.config.local.json +0 -7
- package/dist/templates/json/public/getdotenv.config.json +0 -9
- package/dist/templates/local/getdotenv.config.local.json +0 -7
- package/dist/templates/local/getdotenv.config.local.yaml +0 -7
- package/dist/templates/options.ts +0 -31
- package/dist/templates/plugins/hello/defaultAction.ts +0 -27
- package/dist/templates/plugins/hello/index.ts +0 -26
- package/dist/templates/plugins/hello/options.ts +0 -31
- package/dist/templates/plugins/hello/strangerAction.ts +0 -20
- package/dist/templates/plugins/hello/types.ts +0 -13
- package/dist/templates/public/getdotenv.config.json +0 -9
- package/dist/templates/public/getdotenv.config.yaml +0 -7
- package/dist/templates/strangerAction.ts +0 -20
- package/dist/templates/ts/getdotenv.config.ts +0 -28
- package/dist/templates/types.ts +0 -13
- package/dist/templates/yaml/local/getdotenv.config.local.yaml +0 -7
- package/dist/templates/yaml/public/getdotenv.config.yaml +0 -7
|
@@ -0,0 +1,932 @@
|
|
|
1
|
+
import { av as HttpProtocol, aw as NormalizedSchema, H as HttpRequest, ax as translateTraits, ay as extendedEncodeURIComponent, az as collectBody, aA as splitHeader, aB as SerdeContext, aC as FromStringShapeDeserializer, t as toUtf8, i as fromUtf8, aD as v4, aE as LazyJsonString, n as toBase64, aF as determineTimestampFormat, aG as dateToUtcString, aH as NumericValue, aI as SerdeContextConfig, aJ as deserializingStructIterator, m as fromBase64, aK as parseEpochTimestamp, aL as parseRfc7231DateTime, aM as parseRfc3339DateTimeWithOffset, aN as serializingStructIterator, aO as ProtocolLib, an as TypeRegistry } from './index-CeCufHlm.mjs';
|
|
2
|
+
import { s as sdkStreamMixin } from './sdk-stream-mixin-BZoJ5jy9.mjs';
|
|
3
|
+
|
|
4
|
+
function quoteHeader(part) {
|
|
5
|
+
if (part.includes(",") || part.includes('"')) {
|
|
6
|
+
part = `"${part.replace(/"/g, '\\"')}"`;
|
|
7
|
+
}
|
|
8
|
+
return part;
|
|
9
|
+
}
|
|
10
|
+
|
|
11
|
+
function splitEvery(value, delimiter, numDelimiters) {
|
|
12
|
+
if (!Number.isInteger(numDelimiters)) {
|
|
13
|
+
throw new Error("Invalid number of delimiters (" + numDelimiters + ") for splitEvery.");
|
|
14
|
+
}
|
|
15
|
+
const segments = value.split(delimiter);
|
|
16
|
+
const compoundSegments = [];
|
|
17
|
+
let currentSegment = "";
|
|
18
|
+
for (let i = 0; i < segments.length; i++) {
|
|
19
|
+
if (currentSegment === "") {
|
|
20
|
+
currentSegment = segments[i];
|
|
21
|
+
}
|
|
22
|
+
else {
|
|
23
|
+
currentSegment += delimiter + segments[i];
|
|
24
|
+
}
|
|
25
|
+
if ((i + 1) % numDelimiters === 0) {
|
|
26
|
+
compoundSegments.push(currentSegment);
|
|
27
|
+
currentSegment = "";
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
if (currentSegment !== "") {
|
|
31
|
+
compoundSegments.push(currentSegment);
|
|
32
|
+
}
|
|
33
|
+
return compoundSegments;
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
class HttpBindingProtocol extends HttpProtocol {
|
|
37
|
+
async serializeRequest(operationSchema, _input, context) {
|
|
38
|
+
const input = {
|
|
39
|
+
...(_input ?? {}),
|
|
40
|
+
};
|
|
41
|
+
const serializer = this.serializer;
|
|
42
|
+
const query = {};
|
|
43
|
+
const headers = {};
|
|
44
|
+
const endpoint = await context.endpoint();
|
|
45
|
+
const ns = NormalizedSchema.of(operationSchema?.input);
|
|
46
|
+
const schema = ns.getSchema();
|
|
47
|
+
let hasNonHttpBindingMember = false;
|
|
48
|
+
let payload;
|
|
49
|
+
const request = new HttpRequest({
|
|
50
|
+
protocol: "",
|
|
51
|
+
hostname: "",
|
|
52
|
+
port: undefined,
|
|
53
|
+
path: "",
|
|
54
|
+
fragment: undefined,
|
|
55
|
+
query: query,
|
|
56
|
+
headers: headers,
|
|
57
|
+
body: undefined,
|
|
58
|
+
});
|
|
59
|
+
if (endpoint) {
|
|
60
|
+
this.updateServiceEndpoint(request, endpoint);
|
|
61
|
+
this.setHostPrefix(request, operationSchema, input);
|
|
62
|
+
const opTraits = translateTraits(operationSchema.traits);
|
|
63
|
+
if (opTraits.http) {
|
|
64
|
+
request.method = opTraits.http[0];
|
|
65
|
+
const [path, search] = opTraits.http[1].split("?");
|
|
66
|
+
if (request.path == "/") {
|
|
67
|
+
request.path = path;
|
|
68
|
+
}
|
|
69
|
+
else {
|
|
70
|
+
request.path += path;
|
|
71
|
+
}
|
|
72
|
+
const traitSearchParams = new URLSearchParams(search ?? "");
|
|
73
|
+
Object.assign(query, Object.fromEntries(traitSearchParams));
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
for (const [memberName, memberNs] of ns.structIterator()) {
|
|
77
|
+
const memberTraits = memberNs.getMergedTraits() ?? {};
|
|
78
|
+
const inputMemberValue = input[memberName];
|
|
79
|
+
if (inputMemberValue == null && !memberNs.isIdempotencyToken()) {
|
|
80
|
+
continue;
|
|
81
|
+
}
|
|
82
|
+
if (memberTraits.httpPayload) {
|
|
83
|
+
const isStreaming = memberNs.isStreaming();
|
|
84
|
+
if (isStreaming) {
|
|
85
|
+
const isEventStream = memberNs.isStructSchema();
|
|
86
|
+
if (isEventStream) {
|
|
87
|
+
if (input[memberName]) {
|
|
88
|
+
payload = await this.serializeEventStream({
|
|
89
|
+
eventStream: input[memberName],
|
|
90
|
+
requestSchema: ns,
|
|
91
|
+
});
|
|
92
|
+
}
|
|
93
|
+
}
|
|
94
|
+
else {
|
|
95
|
+
payload = inputMemberValue;
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
else {
|
|
99
|
+
serializer.write(memberNs, inputMemberValue);
|
|
100
|
+
payload = serializer.flush();
|
|
101
|
+
}
|
|
102
|
+
delete input[memberName];
|
|
103
|
+
}
|
|
104
|
+
else if (memberTraits.httpLabel) {
|
|
105
|
+
serializer.write(memberNs, inputMemberValue);
|
|
106
|
+
const replacement = serializer.flush();
|
|
107
|
+
if (request.path.includes(`{${memberName}+}`)) {
|
|
108
|
+
request.path = request.path.replace(`{${memberName}+}`, replacement.split("/").map(extendedEncodeURIComponent).join("/"));
|
|
109
|
+
}
|
|
110
|
+
else if (request.path.includes(`{${memberName}}`)) {
|
|
111
|
+
request.path = request.path.replace(`{${memberName}}`, extendedEncodeURIComponent(replacement));
|
|
112
|
+
}
|
|
113
|
+
delete input[memberName];
|
|
114
|
+
}
|
|
115
|
+
else if (memberTraits.httpHeader) {
|
|
116
|
+
serializer.write(memberNs, inputMemberValue);
|
|
117
|
+
headers[memberTraits.httpHeader.toLowerCase()] = String(serializer.flush());
|
|
118
|
+
delete input[memberName];
|
|
119
|
+
}
|
|
120
|
+
else if (typeof memberTraits.httpPrefixHeaders === "string") {
|
|
121
|
+
for (const [key, val] of Object.entries(inputMemberValue)) {
|
|
122
|
+
const amalgam = memberTraits.httpPrefixHeaders + key;
|
|
123
|
+
serializer.write([memberNs.getValueSchema(), { httpHeader: amalgam }], val);
|
|
124
|
+
headers[amalgam.toLowerCase()] = serializer.flush();
|
|
125
|
+
}
|
|
126
|
+
delete input[memberName];
|
|
127
|
+
}
|
|
128
|
+
else if (memberTraits.httpQuery || memberTraits.httpQueryParams) {
|
|
129
|
+
this.serializeQuery(memberNs, inputMemberValue, query);
|
|
130
|
+
delete input[memberName];
|
|
131
|
+
}
|
|
132
|
+
else {
|
|
133
|
+
hasNonHttpBindingMember = true;
|
|
134
|
+
}
|
|
135
|
+
}
|
|
136
|
+
if (hasNonHttpBindingMember && input) {
|
|
137
|
+
serializer.write(schema, input);
|
|
138
|
+
payload = serializer.flush();
|
|
139
|
+
}
|
|
140
|
+
request.headers = headers;
|
|
141
|
+
request.query = query;
|
|
142
|
+
request.body = payload;
|
|
143
|
+
return request;
|
|
144
|
+
}
|
|
145
|
+
serializeQuery(ns, data, query) {
|
|
146
|
+
const serializer = this.serializer;
|
|
147
|
+
const traits = ns.getMergedTraits();
|
|
148
|
+
if (traits.httpQueryParams) {
|
|
149
|
+
for (const [key, val] of Object.entries(data)) {
|
|
150
|
+
if (!(key in query)) {
|
|
151
|
+
const valueSchema = ns.getValueSchema();
|
|
152
|
+
Object.assign(valueSchema.getMergedTraits(), {
|
|
153
|
+
...traits,
|
|
154
|
+
httpQuery: key,
|
|
155
|
+
httpQueryParams: undefined,
|
|
156
|
+
});
|
|
157
|
+
this.serializeQuery(valueSchema, val, query);
|
|
158
|
+
}
|
|
159
|
+
}
|
|
160
|
+
return;
|
|
161
|
+
}
|
|
162
|
+
if (ns.isListSchema()) {
|
|
163
|
+
const sparse = !!ns.getMergedTraits().sparse;
|
|
164
|
+
const buffer = [];
|
|
165
|
+
for (const item of data) {
|
|
166
|
+
serializer.write([ns.getValueSchema(), traits], item);
|
|
167
|
+
const serializable = serializer.flush();
|
|
168
|
+
if (sparse || serializable !== undefined) {
|
|
169
|
+
buffer.push(serializable);
|
|
170
|
+
}
|
|
171
|
+
}
|
|
172
|
+
query[traits.httpQuery] = buffer;
|
|
173
|
+
}
|
|
174
|
+
else {
|
|
175
|
+
serializer.write([ns, traits], data);
|
|
176
|
+
query[traits.httpQuery] = serializer.flush();
|
|
177
|
+
}
|
|
178
|
+
}
|
|
179
|
+
async deserializeResponse(operationSchema, context, response) {
|
|
180
|
+
const deserializer = this.deserializer;
|
|
181
|
+
const ns = NormalizedSchema.of(operationSchema.output);
|
|
182
|
+
const dataObject = {};
|
|
183
|
+
if (response.statusCode >= 300) {
|
|
184
|
+
const bytes = await collectBody(response.body, context);
|
|
185
|
+
if (bytes.byteLength > 0) {
|
|
186
|
+
Object.assign(dataObject, await deserializer.read(15, bytes));
|
|
187
|
+
}
|
|
188
|
+
await this.handleError(operationSchema, context, response, dataObject, this.deserializeMetadata(response));
|
|
189
|
+
throw new Error("@smithy/core/protocols - HTTP Protocol error handler failed to throw.");
|
|
190
|
+
}
|
|
191
|
+
for (const header in response.headers) {
|
|
192
|
+
const value = response.headers[header];
|
|
193
|
+
delete response.headers[header];
|
|
194
|
+
response.headers[header.toLowerCase()] = value;
|
|
195
|
+
}
|
|
196
|
+
const nonHttpBindingMembers = await this.deserializeHttpMessage(ns, context, response, dataObject);
|
|
197
|
+
if (nonHttpBindingMembers.length) {
|
|
198
|
+
const bytes = await collectBody(response.body, context);
|
|
199
|
+
if (bytes.byteLength > 0) {
|
|
200
|
+
const dataFromBody = await deserializer.read(ns, bytes);
|
|
201
|
+
for (const member of nonHttpBindingMembers) {
|
|
202
|
+
dataObject[member] = dataFromBody[member];
|
|
203
|
+
}
|
|
204
|
+
}
|
|
205
|
+
}
|
|
206
|
+
else if (nonHttpBindingMembers.discardResponseBody) {
|
|
207
|
+
await collectBody(response.body, context);
|
|
208
|
+
}
|
|
209
|
+
dataObject.$metadata = this.deserializeMetadata(response);
|
|
210
|
+
return dataObject;
|
|
211
|
+
}
|
|
212
|
+
async deserializeHttpMessage(schema, context, response, arg4, arg5) {
|
|
213
|
+
let dataObject;
|
|
214
|
+
if (arg4 instanceof Set) {
|
|
215
|
+
dataObject = arg5;
|
|
216
|
+
}
|
|
217
|
+
else {
|
|
218
|
+
dataObject = arg4;
|
|
219
|
+
}
|
|
220
|
+
let discardResponseBody = true;
|
|
221
|
+
const deserializer = this.deserializer;
|
|
222
|
+
const ns = NormalizedSchema.of(schema);
|
|
223
|
+
const nonHttpBindingMembers = [];
|
|
224
|
+
for (const [memberName, memberSchema] of ns.structIterator()) {
|
|
225
|
+
const memberTraits = memberSchema.getMemberTraits();
|
|
226
|
+
if (memberTraits.httpPayload) {
|
|
227
|
+
discardResponseBody = false;
|
|
228
|
+
const isStreaming = memberSchema.isStreaming();
|
|
229
|
+
if (isStreaming) {
|
|
230
|
+
const isEventStream = memberSchema.isStructSchema();
|
|
231
|
+
if (isEventStream) {
|
|
232
|
+
dataObject[memberName] = await this.deserializeEventStream({
|
|
233
|
+
response,
|
|
234
|
+
responseSchema: ns,
|
|
235
|
+
});
|
|
236
|
+
}
|
|
237
|
+
else {
|
|
238
|
+
dataObject[memberName] = sdkStreamMixin(response.body);
|
|
239
|
+
}
|
|
240
|
+
}
|
|
241
|
+
else if (response.body) {
|
|
242
|
+
const bytes = await collectBody(response.body, context);
|
|
243
|
+
if (bytes.byteLength > 0) {
|
|
244
|
+
dataObject[memberName] = await deserializer.read(memberSchema, bytes);
|
|
245
|
+
}
|
|
246
|
+
}
|
|
247
|
+
}
|
|
248
|
+
else if (memberTraits.httpHeader) {
|
|
249
|
+
const key = String(memberTraits.httpHeader).toLowerCase();
|
|
250
|
+
const value = response.headers[key];
|
|
251
|
+
if (null != value) {
|
|
252
|
+
if (memberSchema.isListSchema()) {
|
|
253
|
+
const headerListValueSchema = memberSchema.getValueSchema();
|
|
254
|
+
headerListValueSchema.getMergedTraits().httpHeader = key;
|
|
255
|
+
let sections;
|
|
256
|
+
if (headerListValueSchema.isTimestampSchema() &&
|
|
257
|
+
headerListValueSchema.getSchema() === 4) {
|
|
258
|
+
sections = splitEvery(value, ",", 2);
|
|
259
|
+
}
|
|
260
|
+
else {
|
|
261
|
+
sections = splitHeader(value);
|
|
262
|
+
}
|
|
263
|
+
const list = [];
|
|
264
|
+
for (const section of sections) {
|
|
265
|
+
list.push(await deserializer.read(headerListValueSchema, section.trim()));
|
|
266
|
+
}
|
|
267
|
+
dataObject[memberName] = list;
|
|
268
|
+
}
|
|
269
|
+
else {
|
|
270
|
+
dataObject[memberName] = await deserializer.read(memberSchema, value);
|
|
271
|
+
}
|
|
272
|
+
}
|
|
273
|
+
}
|
|
274
|
+
else if (memberTraits.httpPrefixHeaders !== undefined) {
|
|
275
|
+
dataObject[memberName] = {};
|
|
276
|
+
for (const [header, value] of Object.entries(response.headers)) {
|
|
277
|
+
if (header.startsWith(memberTraits.httpPrefixHeaders)) {
|
|
278
|
+
const valueSchema = memberSchema.getValueSchema();
|
|
279
|
+
valueSchema.getMergedTraits().httpHeader = header;
|
|
280
|
+
dataObject[memberName][header.slice(memberTraits.httpPrefixHeaders.length)] = await deserializer.read(valueSchema, value);
|
|
281
|
+
}
|
|
282
|
+
}
|
|
283
|
+
}
|
|
284
|
+
else if (memberTraits.httpResponseCode) {
|
|
285
|
+
dataObject[memberName] = response.statusCode;
|
|
286
|
+
}
|
|
287
|
+
else {
|
|
288
|
+
nonHttpBindingMembers.push(memberName);
|
|
289
|
+
}
|
|
290
|
+
}
|
|
291
|
+
nonHttpBindingMembers.discardResponseBody = discardResponseBody;
|
|
292
|
+
return nonHttpBindingMembers;
|
|
293
|
+
}
|
|
294
|
+
}
|
|
295
|
+
|
|
296
|
+
class HttpInterceptingShapeDeserializer extends SerdeContext {
|
|
297
|
+
codecDeserializer;
|
|
298
|
+
stringDeserializer;
|
|
299
|
+
constructor(codecDeserializer, codecSettings) {
|
|
300
|
+
super();
|
|
301
|
+
this.codecDeserializer = codecDeserializer;
|
|
302
|
+
this.stringDeserializer = new FromStringShapeDeserializer(codecSettings);
|
|
303
|
+
}
|
|
304
|
+
setSerdeContext(serdeContext) {
|
|
305
|
+
this.stringDeserializer.setSerdeContext(serdeContext);
|
|
306
|
+
this.codecDeserializer.setSerdeContext(serdeContext);
|
|
307
|
+
this.serdeContext = serdeContext;
|
|
308
|
+
}
|
|
309
|
+
read(schema, data) {
|
|
310
|
+
const ns = NormalizedSchema.of(schema);
|
|
311
|
+
const traits = ns.getMergedTraits();
|
|
312
|
+
const toString = this.serdeContext?.utf8Encoder ?? toUtf8;
|
|
313
|
+
if (traits.httpHeader || traits.httpResponseCode) {
|
|
314
|
+
return this.stringDeserializer.read(ns, toString(data));
|
|
315
|
+
}
|
|
316
|
+
if (traits.httpPayload) {
|
|
317
|
+
if (ns.isBlobSchema()) {
|
|
318
|
+
const toBytes = this.serdeContext?.utf8Decoder ?? fromUtf8;
|
|
319
|
+
if (typeof data === "string") {
|
|
320
|
+
return toBytes(data);
|
|
321
|
+
}
|
|
322
|
+
return data;
|
|
323
|
+
}
|
|
324
|
+
else if (ns.isStringSchema()) {
|
|
325
|
+
if ("byteLength" in data) {
|
|
326
|
+
return toString(data);
|
|
327
|
+
}
|
|
328
|
+
return data;
|
|
329
|
+
}
|
|
330
|
+
}
|
|
331
|
+
return this.codecDeserializer.read(ns, data);
|
|
332
|
+
}
|
|
333
|
+
}
|
|
334
|
+
|
|
335
|
+
class ToStringShapeSerializer extends SerdeContext {
|
|
336
|
+
settings;
|
|
337
|
+
stringBuffer = "";
|
|
338
|
+
constructor(settings) {
|
|
339
|
+
super();
|
|
340
|
+
this.settings = settings;
|
|
341
|
+
}
|
|
342
|
+
write(schema, value) {
|
|
343
|
+
const ns = NormalizedSchema.of(schema);
|
|
344
|
+
switch (typeof value) {
|
|
345
|
+
case "object":
|
|
346
|
+
if (value === null) {
|
|
347
|
+
this.stringBuffer = "null";
|
|
348
|
+
return;
|
|
349
|
+
}
|
|
350
|
+
if (ns.isTimestampSchema()) {
|
|
351
|
+
if (!(value instanceof Date)) {
|
|
352
|
+
throw new Error(`@smithy/core/protocols - received non-Date value ${value} when schema expected Date in ${ns.getName(true)}`);
|
|
353
|
+
}
|
|
354
|
+
const format = determineTimestampFormat(ns, this.settings);
|
|
355
|
+
switch (format) {
|
|
356
|
+
case 5:
|
|
357
|
+
this.stringBuffer = value.toISOString().replace(".000Z", "Z");
|
|
358
|
+
break;
|
|
359
|
+
case 6:
|
|
360
|
+
this.stringBuffer = dateToUtcString(value);
|
|
361
|
+
break;
|
|
362
|
+
case 7:
|
|
363
|
+
this.stringBuffer = String(value.getTime() / 1000);
|
|
364
|
+
break;
|
|
365
|
+
default:
|
|
366
|
+
console.warn("Missing timestamp format, using epoch seconds", value);
|
|
367
|
+
this.stringBuffer = String(value.getTime() / 1000);
|
|
368
|
+
}
|
|
369
|
+
return;
|
|
370
|
+
}
|
|
371
|
+
if (ns.isBlobSchema() && "byteLength" in value) {
|
|
372
|
+
this.stringBuffer = (this.serdeContext?.base64Encoder ?? toBase64)(value);
|
|
373
|
+
return;
|
|
374
|
+
}
|
|
375
|
+
if (ns.isListSchema() && Array.isArray(value)) {
|
|
376
|
+
let buffer = "";
|
|
377
|
+
for (const item of value) {
|
|
378
|
+
this.write([ns.getValueSchema(), ns.getMergedTraits()], item);
|
|
379
|
+
const headerItem = this.flush();
|
|
380
|
+
const serialized = ns.getValueSchema().isTimestampSchema() ? headerItem : quoteHeader(headerItem);
|
|
381
|
+
if (buffer !== "") {
|
|
382
|
+
buffer += ", ";
|
|
383
|
+
}
|
|
384
|
+
buffer += serialized;
|
|
385
|
+
}
|
|
386
|
+
this.stringBuffer = buffer;
|
|
387
|
+
return;
|
|
388
|
+
}
|
|
389
|
+
this.stringBuffer = JSON.stringify(value, null, 2);
|
|
390
|
+
break;
|
|
391
|
+
case "string":
|
|
392
|
+
const mediaType = ns.getMergedTraits().mediaType;
|
|
393
|
+
let intermediateValue = value;
|
|
394
|
+
if (mediaType) {
|
|
395
|
+
const isJson = mediaType === "application/json" || mediaType.endsWith("+json");
|
|
396
|
+
if (isJson) {
|
|
397
|
+
intermediateValue = LazyJsonString.from(intermediateValue);
|
|
398
|
+
}
|
|
399
|
+
if (ns.getMergedTraits().httpHeader) {
|
|
400
|
+
this.stringBuffer = (this.serdeContext?.base64Encoder ?? toBase64)(intermediateValue.toString());
|
|
401
|
+
return;
|
|
402
|
+
}
|
|
403
|
+
}
|
|
404
|
+
this.stringBuffer = value;
|
|
405
|
+
break;
|
|
406
|
+
default:
|
|
407
|
+
if (ns.isIdempotencyToken()) {
|
|
408
|
+
this.stringBuffer = v4();
|
|
409
|
+
}
|
|
410
|
+
else {
|
|
411
|
+
this.stringBuffer = String(value);
|
|
412
|
+
}
|
|
413
|
+
}
|
|
414
|
+
}
|
|
415
|
+
flush() {
|
|
416
|
+
const buffer = this.stringBuffer;
|
|
417
|
+
this.stringBuffer = "";
|
|
418
|
+
return buffer;
|
|
419
|
+
}
|
|
420
|
+
}
|
|
421
|
+
|
|
422
|
+
class HttpInterceptingShapeSerializer {
|
|
423
|
+
codecSerializer;
|
|
424
|
+
stringSerializer;
|
|
425
|
+
buffer;
|
|
426
|
+
constructor(codecSerializer, codecSettings, stringSerializer = new ToStringShapeSerializer(codecSettings)) {
|
|
427
|
+
this.codecSerializer = codecSerializer;
|
|
428
|
+
this.stringSerializer = stringSerializer;
|
|
429
|
+
}
|
|
430
|
+
setSerdeContext(serdeContext) {
|
|
431
|
+
this.codecSerializer.setSerdeContext(serdeContext);
|
|
432
|
+
this.stringSerializer.setSerdeContext(serdeContext);
|
|
433
|
+
}
|
|
434
|
+
write(schema, value) {
|
|
435
|
+
const ns = NormalizedSchema.of(schema);
|
|
436
|
+
const traits = ns.getMergedTraits();
|
|
437
|
+
if (traits.httpHeader || traits.httpLabel || traits.httpQuery) {
|
|
438
|
+
this.stringSerializer.write(ns, value);
|
|
439
|
+
this.buffer = this.stringSerializer.flush();
|
|
440
|
+
return;
|
|
441
|
+
}
|
|
442
|
+
return this.codecSerializer.write(ns, value);
|
|
443
|
+
}
|
|
444
|
+
flush() {
|
|
445
|
+
if (this.buffer !== undefined) {
|
|
446
|
+
const buffer = this.buffer;
|
|
447
|
+
this.buffer = undefined;
|
|
448
|
+
return buffer;
|
|
449
|
+
}
|
|
450
|
+
return this.codecSerializer.flush();
|
|
451
|
+
}
|
|
452
|
+
}
|
|
453
|
+
|
|
454
|
+
function jsonReviver(key, value, context) {
|
|
455
|
+
if (context?.source) {
|
|
456
|
+
const numericString = context.source;
|
|
457
|
+
if (typeof value === "number") {
|
|
458
|
+
if (value > Number.MAX_SAFE_INTEGER || value < Number.MIN_SAFE_INTEGER || numericString !== String(value)) {
|
|
459
|
+
const isFractional = numericString.includes(".");
|
|
460
|
+
if (isFractional) {
|
|
461
|
+
return new NumericValue(numericString, "bigDecimal");
|
|
462
|
+
}
|
|
463
|
+
else {
|
|
464
|
+
return BigInt(numericString);
|
|
465
|
+
}
|
|
466
|
+
}
|
|
467
|
+
}
|
|
468
|
+
}
|
|
469
|
+
return value;
|
|
470
|
+
}
|
|
471
|
+
|
|
472
|
+
const collectBodyString = (streamBody, context) => collectBody(streamBody, context).then((body) => (context?.utf8Encoder ?? toUtf8)(body));
|
|
473
|
+
|
|
474
|
+
const parseJsonBody = (streamBody, context) => collectBodyString(streamBody, context).then((encoded) => {
|
|
475
|
+
if (encoded.length) {
|
|
476
|
+
try {
|
|
477
|
+
return JSON.parse(encoded);
|
|
478
|
+
}
|
|
479
|
+
catch (e) {
|
|
480
|
+
if (e?.name === "SyntaxError") {
|
|
481
|
+
Object.defineProperty(e, "$responseBodyText", {
|
|
482
|
+
value: encoded,
|
|
483
|
+
});
|
|
484
|
+
}
|
|
485
|
+
throw e;
|
|
486
|
+
}
|
|
487
|
+
}
|
|
488
|
+
return {};
|
|
489
|
+
});
|
|
490
|
+
const loadRestJsonErrorCode = (output, data) => {
|
|
491
|
+
const findKey = (object, key) => Object.keys(object).find((k) => k.toLowerCase() === key.toLowerCase());
|
|
492
|
+
const sanitizeErrorCode = (rawValue) => {
|
|
493
|
+
let cleanValue = rawValue;
|
|
494
|
+
if (typeof cleanValue === "number") {
|
|
495
|
+
cleanValue = cleanValue.toString();
|
|
496
|
+
}
|
|
497
|
+
if (cleanValue.indexOf(",") >= 0) {
|
|
498
|
+
cleanValue = cleanValue.split(",")[0];
|
|
499
|
+
}
|
|
500
|
+
if (cleanValue.indexOf(":") >= 0) {
|
|
501
|
+
cleanValue = cleanValue.split(":")[0];
|
|
502
|
+
}
|
|
503
|
+
if (cleanValue.indexOf("#") >= 0) {
|
|
504
|
+
cleanValue = cleanValue.split("#")[1];
|
|
505
|
+
}
|
|
506
|
+
return cleanValue;
|
|
507
|
+
};
|
|
508
|
+
const headerKey = findKey(output.headers, "x-amzn-errortype");
|
|
509
|
+
if (headerKey !== undefined) {
|
|
510
|
+
return sanitizeErrorCode(output.headers[headerKey]);
|
|
511
|
+
}
|
|
512
|
+
if (data && typeof data === "object") {
|
|
513
|
+
const codeKey = findKey(data, "code");
|
|
514
|
+
if (codeKey && data[codeKey] !== undefined) {
|
|
515
|
+
return sanitizeErrorCode(data[codeKey]);
|
|
516
|
+
}
|
|
517
|
+
if (data["__type"] !== undefined) {
|
|
518
|
+
return sanitizeErrorCode(data["__type"]);
|
|
519
|
+
}
|
|
520
|
+
}
|
|
521
|
+
};
|
|
522
|
+
|
|
523
|
+
class JsonShapeDeserializer extends SerdeContextConfig {
|
|
524
|
+
settings;
|
|
525
|
+
constructor(settings) {
|
|
526
|
+
super();
|
|
527
|
+
this.settings = settings;
|
|
528
|
+
}
|
|
529
|
+
async read(schema, data) {
|
|
530
|
+
return this._read(schema, typeof data === "string" ? JSON.parse(data, jsonReviver) : await parseJsonBody(data, this.serdeContext));
|
|
531
|
+
}
|
|
532
|
+
readObject(schema, data) {
|
|
533
|
+
return this._read(schema, data);
|
|
534
|
+
}
|
|
535
|
+
_read(schema, value) {
|
|
536
|
+
const isObject = value !== null && typeof value === "object";
|
|
537
|
+
const ns = NormalizedSchema.of(schema);
|
|
538
|
+
if (isObject) {
|
|
539
|
+
if (ns.isStructSchema()) {
|
|
540
|
+
const out = {};
|
|
541
|
+
for (const [memberName, memberSchema] of deserializingStructIterator(ns, value, this.settings.jsonName ? "jsonName" : false)) {
|
|
542
|
+
const fromKey = this.settings.jsonName ? memberSchema.getMergedTraits().jsonName ?? memberName : memberName;
|
|
543
|
+
const deserializedValue = this._read(memberSchema, value[fromKey]);
|
|
544
|
+
if (deserializedValue != null) {
|
|
545
|
+
out[memberName] = deserializedValue;
|
|
546
|
+
}
|
|
547
|
+
}
|
|
548
|
+
return out;
|
|
549
|
+
}
|
|
550
|
+
if (Array.isArray(value) && ns.isListSchema()) {
|
|
551
|
+
const listMember = ns.getValueSchema();
|
|
552
|
+
const out = [];
|
|
553
|
+
const sparse = !!ns.getMergedTraits().sparse;
|
|
554
|
+
for (const item of value) {
|
|
555
|
+
if (sparse || item != null) {
|
|
556
|
+
out.push(this._read(listMember, item));
|
|
557
|
+
}
|
|
558
|
+
}
|
|
559
|
+
return out;
|
|
560
|
+
}
|
|
561
|
+
if (ns.isMapSchema()) {
|
|
562
|
+
const mapMember = ns.getValueSchema();
|
|
563
|
+
const out = {};
|
|
564
|
+
const sparse = !!ns.getMergedTraits().sparse;
|
|
565
|
+
for (const [_k, _v] of Object.entries(value)) {
|
|
566
|
+
if (sparse || _v != null) {
|
|
567
|
+
out[_k] = this._read(mapMember, _v);
|
|
568
|
+
}
|
|
569
|
+
}
|
|
570
|
+
return out;
|
|
571
|
+
}
|
|
572
|
+
}
|
|
573
|
+
if (ns.isBlobSchema() && typeof value === "string") {
|
|
574
|
+
return fromBase64(value);
|
|
575
|
+
}
|
|
576
|
+
const mediaType = ns.getMergedTraits().mediaType;
|
|
577
|
+
if (ns.isStringSchema() && typeof value === "string" && mediaType) {
|
|
578
|
+
const isJson = mediaType === "application/json" || mediaType.endsWith("+json");
|
|
579
|
+
if (isJson) {
|
|
580
|
+
return LazyJsonString.from(value);
|
|
581
|
+
}
|
|
582
|
+
return value;
|
|
583
|
+
}
|
|
584
|
+
if (ns.isTimestampSchema() && value != null) {
|
|
585
|
+
const format = determineTimestampFormat(ns, this.settings);
|
|
586
|
+
switch (format) {
|
|
587
|
+
case 5:
|
|
588
|
+
return parseRfc3339DateTimeWithOffset(value);
|
|
589
|
+
case 6:
|
|
590
|
+
return parseRfc7231DateTime(value);
|
|
591
|
+
case 7:
|
|
592
|
+
return parseEpochTimestamp(value);
|
|
593
|
+
default:
|
|
594
|
+
console.warn("Missing timestamp format, parsing value with Date constructor:", value);
|
|
595
|
+
return new Date(value);
|
|
596
|
+
}
|
|
597
|
+
}
|
|
598
|
+
if (ns.isBigIntegerSchema() && (typeof value === "number" || typeof value === "string")) {
|
|
599
|
+
return BigInt(value);
|
|
600
|
+
}
|
|
601
|
+
if (ns.isBigDecimalSchema() && value != undefined) {
|
|
602
|
+
if (value instanceof NumericValue) {
|
|
603
|
+
return value;
|
|
604
|
+
}
|
|
605
|
+
const untyped = value;
|
|
606
|
+
if (untyped.type === "bigDecimal" && "string" in untyped) {
|
|
607
|
+
return new NumericValue(untyped.string, untyped.type);
|
|
608
|
+
}
|
|
609
|
+
return new NumericValue(String(value), "bigDecimal");
|
|
610
|
+
}
|
|
611
|
+
if (ns.isNumericSchema() && typeof value === "string") {
|
|
612
|
+
switch (value) {
|
|
613
|
+
case "Infinity":
|
|
614
|
+
return Infinity;
|
|
615
|
+
case "-Infinity":
|
|
616
|
+
return -Infinity;
|
|
617
|
+
case "NaN":
|
|
618
|
+
return NaN;
|
|
619
|
+
}
|
|
620
|
+
return value;
|
|
621
|
+
}
|
|
622
|
+
if (ns.isDocumentSchema()) {
|
|
623
|
+
if (isObject) {
|
|
624
|
+
const out = Array.isArray(value) ? [] : {};
|
|
625
|
+
for (const [k, v] of Object.entries(value)) {
|
|
626
|
+
if (v instanceof NumericValue) {
|
|
627
|
+
out[k] = v;
|
|
628
|
+
}
|
|
629
|
+
else {
|
|
630
|
+
out[k] = this._read(ns, v);
|
|
631
|
+
}
|
|
632
|
+
}
|
|
633
|
+
return out;
|
|
634
|
+
}
|
|
635
|
+
else {
|
|
636
|
+
return structuredClone(value);
|
|
637
|
+
}
|
|
638
|
+
}
|
|
639
|
+
return value;
|
|
640
|
+
}
|
|
641
|
+
}
|
|
642
|
+
|
|
643
|
+
const NUMERIC_CONTROL_CHAR = String.fromCharCode(925);
|
|
644
|
+
class JsonReplacer {
|
|
645
|
+
values = new Map();
|
|
646
|
+
counter = 0;
|
|
647
|
+
stage = 0;
|
|
648
|
+
createReplacer() {
|
|
649
|
+
if (this.stage === 1) {
|
|
650
|
+
throw new Error("@aws-sdk/core/protocols - JsonReplacer already created.");
|
|
651
|
+
}
|
|
652
|
+
if (this.stage === 2) {
|
|
653
|
+
throw new Error("@aws-sdk/core/protocols - JsonReplacer exhausted.");
|
|
654
|
+
}
|
|
655
|
+
this.stage = 1;
|
|
656
|
+
return (key, value) => {
|
|
657
|
+
if (value instanceof NumericValue) {
|
|
658
|
+
const v = `${NUMERIC_CONTROL_CHAR + "nv" + this.counter++}_` + value.string;
|
|
659
|
+
this.values.set(`"${v}"`, value.string);
|
|
660
|
+
return v;
|
|
661
|
+
}
|
|
662
|
+
if (typeof value === "bigint") {
|
|
663
|
+
const s = value.toString();
|
|
664
|
+
const v = `${NUMERIC_CONTROL_CHAR + "b" + this.counter++}_` + s;
|
|
665
|
+
this.values.set(`"${v}"`, s);
|
|
666
|
+
return v;
|
|
667
|
+
}
|
|
668
|
+
return value;
|
|
669
|
+
};
|
|
670
|
+
}
|
|
671
|
+
replaceInJson(json) {
|
|
672
|
+
if (this.stage === 0) {
|
|
673
|
+
throw new Error("@aws-sdk/core/protocols - JsonReplacer not created yet.");
|
|
674
|
+
}
|
|
675
|
+
if (this.stage === 2) {
|
|
676
|
+
throw new Error("@aws-sdk/core/protocols - JsonReplacer exhausted.");
|
|
677
|
+
}
|
|
678
|
+
this.stage = 2;
|
|
679
|
+
if (this.counter === 0) {
|
|
680
|
+
return json;
|
|
681
|
+
}
|
|
682
|
+
for (const [key, value] of this.values) {
|
|
683
|
+
json = json.replace(key, value);
|
|
684
|
+
}
|
|
685
|
+
return json;
|
|
686
|
+
}
|
|
687
|
+
}
|
|
688
|
+
|
|
689
|
+
class JsonShapeSerializer extends SerdeContextConfig {
|
|
690
|
+
settings;
|
|
691
|
+
buffer;
|
|
692
|
+
useReplacer = false;
|
|
693
|
+
rootSchema;
|
|
694
|
+
constructor(settings) {
|
|
695
|
+
super();
|
|
696
|
+
this.settings = settings;
|
|
697
|
+
}
|
|
698
|
+
write(schema, value) {
|
|
699
|
+
this.rootSchema = NormalizedSchema.of(schema);
|
|
700
|
+
this.buffer = this._write(this.rootSchema, value);
|
|
701
|
+
}
|
|
702
|
+
writeDiscriminatedDocument(schema, value) {
|
|
703
|
+
this.write(schema, value);
|
|
704
|
+
if (typeof this.buffer === "object") {
|
|
705
|
+
this.buffer.__type = NormalizedSchema.of(schema).getName(true);
|
|
706
|
+
}
|
|
707
|
+
}
|
|
708
|
+
flush() {
|
|
709
|
+
const { rootSchema, useReplacer } = this;
|
|
710
|
+
this.rootSchema = undefined;
|
|
711
|
+
this.useReplacer = false;
|
|
712
|
+
if (rootSchema?.isStructSchema() || rootSchema?.isDocumentSchema()) {
|
|
713
|
+
if (!useReplacer) {
|
|
714
|
+
return JSON.stringify(this.buffer);
|
|
715
|
+
}
|
|
716
|
+
const replacer = new JsonReplacer();
|
|
717
|
+
return replacer.replaceInJson(JSON.stringify(this.buffer, replacer.createReplacer(), 0));
|
|
718
|
+
}
|
|
719
|
+
return this.buffer;
|
|
720
|
+
}
|
|
721
|
+
_write(schema, value, container) {
|
|
722
|
+
const isObject = value !== null && typeof value === "object";
|
|
723
|
+
const ns = NormalizedSchema.of(schema);
|
|
724
|
+
if (isObject) {
|
|
725
|
+
if (ns.isStructSchema()) {
|
|
726
|
+
const out = {};
|
|
727
|
+
for (const [memberName, memberSchema] of serializingStructIterator(ns, value)) {
|
|
728
|
+
const serializableValue = this._write(memberSchema, value[memberName], ns);
|
|
729
|
+
if (serializableValue !== undefined) {
|
|
730
|
+
const jsonName = memberSchema.getMergedTraits().jsonName;
|
|
731
|
+
const targetKey = this.settings.jsonName ? jsonName ?? memberName : memberName;
|
|
732
|
+
out[targetKey] = serializableValue;
|
|
733
|
+
}
|
|
734
|
+
}
|
|
735
|
+
return out;
|
|
736
|
+
}
|
|
737
|
+
if (Array.isArray(value) && ns.isListSchema()) {
|
|
738
|
+
const listMember = ns.getValueSchema();
|
|
739
|
+
const out = [];
|
|
740
|
+
const sparse = !!ns.getMergedTraits().sparse;
|
|
741
|
+
for (const item of value) {
|
|
742
|
+
if (sparse || item != null) {
|
|
743
|
+
out.push(this._write(listMember, item));
|
|
744
|
+
}
|
|
745
|
+
}
|
|
746
|
+
return out;
|
|
747
|
+
}
|
|
748
|
+
if (ns.isMapSchema()) {
|
|
749
|
+
const mapMember = ns.getValueSchema();
|
|
750
|
+
const out = {};
|
|
751
|
+
const sparse = !!ns.getMergedTraits().sparse;
|
|
752
|
+
for (const [_k, _v] of Object.entries(value)) {
|
|
753
|
+
if (sparse || _v != null) {
|
|
754
|
+
out[_k] = this._write(mapMember, _v);
|
|
755
|
+
}
|
|
756
|
+
}
|
|
757
|
+
return out;
|
|
758
|
+
}
|
|
759
|
+
if (value instanceof Uint8Array && (ns.isBlobSchema() || ns.isDocumentSchema())) {
|
|
760
|
+
if (ns === this.rootSchema) {
|
|
761
|
+
return value;
|
|
762
|
+
}
|
|
763
|
+
return (this.serdeContext?.base64Encoder ?? toBase64)(value);
|
|
764
|
+
}
|
|
765
|
+
if (value instanceof Date && (ns.isTimestampSchema() || ns.isDocumentSchema())) {
|
|
766
|
+
const format = determineTimestampFormat(ns, this.settings);
|
|
767
|
+
switch (format) {
|
|
768
|
+
case 5:
|
|
769
|
+
return value.toISOString().replace(".000Z", "Z");
|
|
770
|
+
case 6:
|
|
771
|
+
return dateToUtcString(value);
|
|
772
|
+
case 7:
|
|
773
|
+
return value.getTime() / 1000;
|
|
774
|
+
default:
|
|
775
|
+
console.warn("Missing timestamp format, using epoch seconds", value);
|
|
776
|
+
return value.getTime() / 1000;
|
|
777
|
+
}
|
|
778
|
+
}
|
|
779
|
+
if (value instanceof NumericValue) {
|
|
780
|
+
this.useReplacer = true;
|
|
781
|
+
}
|
|
782
|
+
}
|
|
783
|
+
if (value === null && container?.isStructSchema()) {
|
|
784
|
+
return void 0;
|
|
785
|
+
}
|
|
786
|
+
if (ns.isStringSchema()) {
|
|
787
|
+
if (typeof value === "undefined" && ns.isIdempotencyToken()) {
|
|
788
|
+
return v4();
|
|
789
|
+
}
|
|
790
|
+
const mediaType = ns.getMergedTraits().mediaType;
|
|
791
|
+
if (value != null && mediaType) {
|
|
792
|
+
const isJson = mediaType === "application/json" || mediaType.endsWith("+json");
|
|
793
|
+
if (isJson) {
|
|
794
|
+
return LazyJsonString.from(value);
|
|
795
|
+
}
|
|
796
|
+
}
|
|
797
|
+
return value;
|
|
798
|
+
}
|
|
799
|
+
if (typeof value === "number" && ns.isNumericSchema()) {
|
|
800
|
+
if (Math.abs(value) === Infinity || isNaN(value)) {
|
|
801
|
+
return String(value);
|
|
802
|
+
}
|
|
803
|
+
return value;
|
|
804
|
+
}
|
|
805
|
+
if (typeof value === "string" && ns.isBlobSchema()) {
|
|
806
|
+
if (ns === this.rootSchema) {
|
|
807
|
+
return value;
|
|
808
|
+
}
|
|
809
|
+
return (this.serdeContext?.base64Encoder ?? toBase64)(value);
|
|
810
|
+
}
|
|
811
|
+
if (typeof value === "bigint") {
|
|
812
|
+
this.useReplacer = true;
|
|
813
|
+
}
|
|
814
|
+
if (ns.isDocumentSchema()) {
|
|
815
|
+
if (isObject) {
|
|
816
|
+
const out = Array.isArray(value) ? [] : {};
|
|
817
|
+
for (const [k, v] of Object.entries(value)) {
|
|
818
|
+
if (v instanceof NumericValue) {
|
|
819
|
+
this.useReplacer = true;
|
|
820
|
+
out[k] = v;
|
|
821
|
+
}
|
|
822
|
+
else {
|
|
823
|
+
out[k] = this._write(ns, v);
|
|
824
|
+
}
|
|
825
|
+
}
|
|
826
|
+
return out;
|
|
827
|
+
}
|
|
828
|
+
else {
|
|
829
|
+
return structuredClone(value);
|
|
830
|
+
}
|
|
831
|
+
}
|
|
832
|
+
return value;
|
|
833
|
+
}
|
|
834
|
+
}
|
|
835
|
+
|
|
836
|
+
class JsonCodec extends SerdeContextConfig {
|
|
837
|
+
settings;
|
|
838
|
+
constructor(settings) {
|
|
839
|
+
super();
|
|
840
|
+
this.settings = settings;
|
|
841
|
+
}
|
|
842
|
+
createSerializer() {
|
|
843
|
+
const serializer = new JsonShapeSerializer(this.settings);
|
|
844
|
+
serializer.setSerdeContext(this.serdeContext);
|
|
845
|
+
return serializer;
|
|
846
|
+
}
|
|
847
|
+
createDeserializer() {
|
|
848
|
+
const deserializer = new JsonShapeDeserializer(this.settings);
|
|
849
|
+
deserializer.setSerdeContext(this.serdeContext);
|
|
850
|
+
return deserializer;
|
|
851
|
+
}
|
|
852
|
+
}
|
|
853
|
+
|
|
854
|
+
class AwsRestJsonProtocol extends HttpBindingProtocol {
|
|
855
|
+
serializer;
|
|
856
|
+
deserializer;
|
|
857
|
+
codec;
|
|
858
|
+
mixin = new ProtocolLib();
|
|
859
|
+
constructor({ defaultNamespace }) {
|
|
860
|
+
super({
|
|
861
|
+
defaultNamespace,
|
|
862
|
+
});
|
|
863
|
+
const settings = {
|
|
864
|
+
timestampFormat: {
|
|
865
|
+
useTrait: true,
|
|
866
|
+
default: 7,
|
|
867
|
+
},
|
|
868
|
+
httpBindings: true,
|
|
869
|
+
jsonName: true,
|
|
870
|
+
};
|
|
871
|
+
this.codec = new JsonCodec(settings);
|
|
872
|
+
this.serializer = new HttpInterceptingShapeSerializer(this.codec.createSerializer(), settings);
|
|
873
|
+
this.deserializer = new HttpInterceptingShapeDeserializer(this.codec.createDeserializer(), settings);
|
|
874
|
+
}
|
|
875
|
+
getShapeId() {
|
|
876
|
+
return "aws.protocols#restJson1";
|
|
877
|
+
}
|
|
878
|
+
getPayloadCodec() {
|
|
879
|
+
return this.codec;
|
|
880
|
+
}
|
|
881
|
+
setSerdeContext(serdeContext) {
|
|
882
|
+
this.codec.setSerdeContext(serdeContext);
|
|
883
|
+
super.setSerdeContext(serdeContext);
|
|
884
|
+
}
|
|
885
|
+
async serializeRequest(operationSchema, input, context) {
|
|
886
|
+
const request = await super.serializeRequest(operationSchema, input, context);
|
|
887
|
+
const inputSchema = NormalizedSchema.of(operationSchema.input);
|
|
888
|
+
if (!request.headers["content-type"]) {
|
|
889
|
+
const contentType = this.mixin.resolveRestContentType(this.getDefaultContentType(), inputSchema);
|
|
890
|
+
if (contentType) {
|
|
891
|
+
request.headers["content-type"] = contentType;
|
|
892
|
+
}
|
|
893
|
+
}
|
|
894
|
+
if (request.body == null && request.headers["content-type"] === this.getDefaultContentType()) {
|
|
895
|
+
request.body = "{}";
|
|
896
|
+
}
|
|
897
|
+
return request;
|
|
898
|
+
}
|
|
899
|
+
async deserializeResponse(operationSchema, context, response) {
|
|
900
|
+
const output = await super.deserializeResponse(operationSchema, context, response);
|
|
901
|
+
const outputSchema = NormalizedSchema.of(operationSchema.output);
|
|
902
|
+
for (const [name, member] of outputSchema.structIterator()) {
|
|
903
|
+
if (member.getMemberTraits().httpPayload && !(name in output)) {
|
|
904
|
+
output[name] = null;
|
|
905
|
+
}
|
|
906
|
+
}
|
|
907
|
+
return output;
|
|
908
|
+
}
|
|
909
|
+
async handleError(operationSchema, context, response, dataObject, metadata) {
|
|
910
|
+
const errorIdentifier = loadRestJsonErrorCode(response, dataObject) ?? "Unknown";
|
|
911
|
+
const { errorSchema, errorMetadata } = await this.mixin.getErrorSchemaOrThrowBaseException(errorIdentifier, this.options.defaultNamespace, response, dataObject, metadata);
|
|
912
|
+
const ns = NormalizedSchema.of(errorSchema);
|
|
913
|
+
const message = dataObject.message ?? dataObject.Message ?? "Unknown";
|
|
914
|
+
const ErrorCtor = TypeRegistry.for(errorSchema[1]).getErrorCtor(errorSchema) ?? Error;
|
|
915
|
+
const exception = new ErrorCtor(message);
|
|
916
|
+
await this.deserializeHttpMessage(errorSchema, context, response, dataObject);
|
|
917
|
+
const output = {};
|
|
918
|
+
for (const [name, member] of ns.structIterator()) {
|
|
919
|
+
const target = member.getMergedTraits().jsonName ?? name;
|
|
920
|
+
output[name] = this.codec.createDeserializer().readObject(member, dataObject[target]);
|
|
921
|
+
}
|
|
922
|
+
throw this.mixin.decorateServiceException(Object.assign(exception, errorMetadata, {
|
|
923
|
+
$fault: ns.getMergedTraits().error,
|
|
924
|
+
message,
|
|
925
|
+
}, output), dataObject);
|
|
926
|
+
}
|
|
927
|
+
getDefaultContentType() {
|
|
928
|
+
return "application/json";
|
|
929
|
+
}
|
|
930
|
+
}
|
|
931
|
+
|
|
932
|
+
export { AwsRestJsonProtocol as A };
|