@typespec/ts-http-runtime 1.0.0-alpha.20231023.3

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 (181) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +159 -0
  3. package/dist/index.js +3509 -0
  4. package/dist/index.js.map +1 -0
  5. package/dist-esm/src/abort-controller/AbortError.js +27 -0
  6. package/dist-esm/src/abort-controller/AbortError.js.map +1 -0
  7. package/dist-esm/src/abort-controller/AbortSignalLike.js +4 -0
  8. package/dist-esm/src/abort-controller/AbortSignalLike.js.map +1 -0
  9. package/dist-esm/src/accessTokenCache.js +32 -0
  10. package/dist-esm/src/accessTokenCache.js.map +1 -0
  11. package/dist-esm/src/auth/keyCredential.js +4 -0
  12. package/dist-esm/src/auth/keyCredential.js.map +1 -0
  13. package/dist-esm/src/auth/tokenCredential.js +19 -0
  14. package/dist-esm/src/auth/tokenCredential.js.map +1 -0
  15. package/dist-esm/src/client/apiVersionPolicy.js +23 -0
  16. package/dist-esm/src/client/apiVersionPolicy.js.map +1 -0
  17. package/dist-esm/src/client/clientHelpers.js +52 -0
  18. package/dist-esm/src/client/clientHelpers.js.map +1 -0
  19. package/dist-esm/src/client/common.js +4 -0
  20. package/dist-esm/src/client/common.js.map +1 -0
  21. package/dist-esm/src/client/getClient.js +86 -0
  22. package/dist-esm/src/client/getClient.js.map +1 -0
  23. package/dist-esm/src/client/helpers/getBinaryBody.js +13 -0
  24. package/dist-esm/src/client/helpers/getBinaryBody.js.map +1 -0
  25. package/dist-esm/src/client/helpers/isReadableStream.browser.js +12 -0
  26. package/dist-esm/src/client/helpers/isReadableStream.browser.js.map +1 -0
  27. package/dist-esm/src/client/helpers/isReadableStream.js +10 -0
  28. package/dist-esm/src/client/helpers/isReadableStream.js.map +1 -0
  29. package/dist-esm/src/client/keyCredentialAuthenticationPolicy.js +16 -0
  30. package/dist-esm/src/client/keyCredentialAuthenticationPolicy.js.map +1 -0
  31. package/dist-esm/src/client/operationOptionHelpers.js +22 -0
  32. package/dist-esm/src/client/operationOptionHelpers.js.map +1 -0
  33. package/dist-esm/src/client/restError.js +27 -0
  34. package/dist-esm/src/client/restError.js.map +1 -0
  35. package/dist-esm/src/client/sendRequest.js +195 -0
  36. package/dist-esm/src/client/sendRequest.js.map +1 -0
  37. package/dist-esm/src/client/urlHelpers.js +100 -0
  38. package/dist-esm/src/client/urlHelpers.js.map +1 -0
  39. package/dist-esm/src/constants.js +5 -0
  40. package/dist-esm/src/constants.js.map +1 -0
  41. package/dist-esm/src/createPipelineFromOptions.js +39 -0
  42. package/dist-esm/src/createPipelineFromOptions.js.map +1 -0
  43. package/dist-esm/src/defaultHttpClient.browser.js +10 -0
  44. package/dist-esm/src/defaultHttpClient.browser.js.map +1 -0
  45. package/dist-esm/src/defaultHttpClient.js +10 -0
  46. package/dist-esm/src/defaultHttpClient.js.map +1 -0
  47. package/dist-esm/src/defaultHttpClient.native.js +10 -0
  48. package/dist-esm/src/defaultHttpClient.native.js.map +1 -0
  49. package/dist-esm/src/fetchHttpClient.js +268 -0
  50. package/dist-esm/src/fetchHttpClient.js.map +1 -0
  51. package/dist-esm/src/httpHeaders.js +89 -0
  52. package/dist-esm/src/httpHeaders.js.map +1 -0
  53. package/dist-esm/src/index.js +41 -0
  54. package/dist-esm/src/index.js.map +1 -0
  55. package/dist-esm/src/interfaces.js +4 -0
  56. package/dist-esm/src/interfaces.js.map +1 -0
  57. package/dist-esm/src/log.js +5 -0
  58. package/dist-esm/src/log.js.map +1 -0
  59. package/dist-esm/src/logger/debug.js +93 -0
  60. package/dist-esm/src/logger/debug.js.map +1 -0
  61. package/dist-esm/src/logger/log.browser.js +23 -0
  62. package/dist-esm/src/logger/log.browser.js.map +1 -0
  63. package/dist-esm/src/logger/log.js +8 -0
  64. package/dist-esm/src/logger/log.js.map +1 -0
  65. package/dist-esm/src/logger/logger.js +99 -0
  66. package/dist-esm/src/logger/logger.js.map +1 -0
  67. package/dist-esm/src/nodeHttpClient.js +332 -0
  68. package/dist-esm/src/nodeHttpClient.js.map +1 -0
  69. package/dist-esm/src/pipeline.js +262 -0
  70. package/dist-esm/src/pipeline.js.map +1 -0
  71. package/dist-esm/src/pipelineRequest.js +35 -0
  72. package/dist-esm/src/pipelineRequest.js.map +1 -0
  73. package/dist-esm/src/policies/bearerTokenAuthenticationPolicy.js +108 -0
  74. package/dist-esm/src/policies/bearerTokenAuthenticationPolicy.js.map +1 -0
  75. package/dist-esm/src/policies/decompressResponsePolicy.browser.js +14 -0
  76. package/dist-esm/src/policies/decompressResponsePolicy.browser.js.map +1 -0
  77. package/dist-esm/src/policies/decompressResponsePolicy.js +23 -0
  78. package/dist-esm/src/policies/decompressResponsePolicy.js.map +1 -0
  79. package/dist-esm/src/policies/defaultRetryPolicy.js +26 -0
  80. package/dist-esm/src/policies/defaultRetryPolicy.js.map +1 -0
  81. package/dist-esm/src/policies/exponentialRetryPolicy.js +22 -0
  82. package/dist-esm/src/policies/exponentialRetryPolicy.js.map +1 -0
  83. package/dist-esm/src/policies/formDataPolicy.browser.js +43 -0
  84. package/dist-esm/src/policies/formDataPolicy.browser.js.map +1 -0
  85. package/dist-esm/src/policies/formDataPolicy.js +79 -0
  86. package/dist-esm/src/policies/formDataPolicy.js.map +1 -0
  87. package/dist-esm/src/policies/logPolicy.js +34 -0
  88. package/dist-esm/src/policies/logPolicy.js.map +1 -0
  89. package/dist-esm/src/policies/proxyPolicy.browser.js +27 -0
  90. package/dist-esm/src/policies/proxyPolicy.browser.js.map +1 -0
  91. package/dist-esm/src/policies/proxyPolicy.js +190 -0
  92. package/dist-esm/src/policies/proxyPolicy.js.map +1 -0
  93. package/dist-esm/src/policies/redirectPolicy.js +52 -0
  94. package/dist-esm/src/policies/redirectPolicy.js.map +1 -0
  95. package/dist-esm/src/policies/retryPolicy.js +106 -0
  96. package/dist-esm/src/policies/retryPolicy.js.map +1 -0
  97. package/dist-esm/src/policies/systemErrorRetryPolicy.js +27 -0
  98. package/dist-esm/src/policies/systemErrorRetryPolicy.js.map +1 -0
  99. package/dist-esm/src/policies/throttlingRetryPolicy.js +29 -0
  100. package/dist-esm/src/policies/throttlingRetryPolicy.js.map +1 -0
  101. package/dist-esm/src/policies/tlsPolicy.js +22 -0
  102. package/dist-esm/src/policies/tlsPolicy.js.map +1 -0
  103. package/dist-esm/src/policies/tracingPolicy.js +120 -0
  104. package/dist-esm/src/policies/tracingPolicy.js.map +1 -0
  105. package/dist-esm/src/policies/userAgentPolicy.js +26 -0
  106. package/dist-esm/src/policies/userAgentPolicy.js.map +1 -0
  107. package/dist-esm/src/restError.js +48 -0
  108. package/dist-esm/src/restError.js.map +1 -0
  109. package/dist-esm/src/retryStrategies/exponentialRetryStrategy.js +70 -0
  110. package/dist-esm/src/retryStrategies/exponentialRetryStrategy.js.map +1 -0
  111. package/dist-esm/src/retryStrategies/retryStrategy.js +4 -0
  112. package/dist-esm/src/retryStrategies/retryStrategy.js.map +1 -0
  113. package/dist-esm/src/retryStrategies/throttlingRetryStrategy.js +74 -0
  114. package/dist-esm/src/retryStrategies/throttlingRetryStrategy.js.map +1 -0
  115. package/dist-esm/src/tracing/instrumenter.js +61 -0
  116. package/dist-esm/src/tracing/instrumenter.js.map +1 -0
  117. package/dist-esm/src/tracing/interfaces.js +4 -0
  118. package/dist-esm/src/tracing/interfaces.js.map +1 -0
  119. package/dist-esm/src/tracing/tracingClient.js +74 -0
  120. package/dist-esm/src/tracing/tracingClient.js.map +1 -0
  121. package/dist-esm/src/tracing/tracingContext.js +47 -0
  122. package/dist-esm/src/tracing/tracingContext.js.map +1 -0
  123. package/dist-esm/src/util/aborterUtils.js +21 -0
  124. package/dist-esm/src/util/aborterUtils.js.map +1 -0
  125. package/dist-esm/src/util/base64.browser.js +35 -0
  126. package/dist-esm/src/util/base64.browser.js.map +1 -0
  127. package/dist-esm/src/util/bytesEncoding.browser.js +82 -0
  128. package/dist-esm/src/util/bytesEncoding.browser.js.map +1 -0
  129. package/dist-esm/src/util/bytesEncoding.js +77 -0
  130. package/dist-esm/src/util/bytesEncoding.js.map +1 -0
  131. package/dist-esm/src/util/checkEnvironment.js +36 -0
  132. package/dist-esm/src/util/checkEnvironment.js.map +1 -0
  133. package/dist-esm/src/util/createAbortablePromise.js +42 -0
  134. package/dist-esm/src/util/createAbortablePromise.js.map +1 -0
  135. package/dist-esm/src/util/delay.js +22 -0
  136. package/dist-esm/src/util/delay.js.map +1 -0
  137. package/dist-esm/src/util/error.js +42 -0
  138. package/dist-esm/src/util/error.js.map +1 -0
  139. package/dist-esm/src/util/helpers.js +58 -0
  140. package/dist-esm/src/util/helpers.js.map +1 -0
  141. package/dist-esm/src/util/hex.js +21 -0
  142. package/dist-esm/src/util/hex.js.map +1 -0
  143. package/dist-esm/src/util/inspect.browser.js +4 -0
  144. package/dist-esm/src/util/inspect.browser.js.map +1 -0
  145. package/dist-esm/src/util/inspect.js +5 -0
  146. package/dist-esm/src/util/inspect.js.map +1 -0
  147. package/dist-esm/src/util/object.js +14 -0
  148. package/dist-esm/src/util/object.js.map +1 -0
  149. package/dist-esm/src/util/random.js +21 -0
  150. package/dist-esm/src/util/random.js.map +1 -0
  151. package/dist-esm/src/util/sanitizer.js +139 -0
  152. package/dist-esm/src/util/sanitizer.js.map +1 -0
  153. package/dist-esm/src/util/sha256.browser.js +61 -0
  154. package/dist-esm/src/util/sha256.browser.js.map +1 -0
  155. package/dist-esm/src/util/sha256.js +22 -0
  156. package/dist-esm/src/util/sha256.js.map +1 -0
  157. package/dist-esm/src/util/tokenCycler.js +149 -0
  158. package/dist-esm/src/util/tokenCycler.js.map +1 -0
  159. package/dist-esm/src/util/typeGuards.js +34 -0
  160. package/dist-esm/src/util/typeGuards.js.map +1 -0
  161. package/dist-esm/src/util/userAgent.js +30 -0
  162. package/dist-esm/src/util/userAgent.js.map +1 -0
  163. package/dist-esm/src/util/userAgentPlatform.browser.js +20 -0
  164. package/dist-esm/src/util/userAgentPlatform.browser.js.map +1 -0
  165. package/dist-esm/src/util/userAgentPlatform.js +17 -0
  166. package/dist-esm/src/util/userAgentPlatform.js.map +1 -0
  167. package/dist-esm/src/util/userAgentPlatform.native.js +24 -0
  168. package/dist-esm/src/util/userAgentPlatform.native.js.map +1 -0
  169. package/dist-esm/src/util/utf8.browser.js +26 -0
  170. package/dist-esm/src/util/utf8.browser.js.map +1 -0
  171. package/dist-esm/src/util/uuidUtils.browser.js +17 -0
  172. package/dist-esm/src/util/uuidUtils.browser.js.map +1 -0
  173. package/dist-esm/src/util/uuidUtils.js +22 -0
  174. package/dist-esm/src/util/uuidUtils.js.map +1 -0
  175. package/dist-esm/src/util/uuidUtils.native.js +43 -0
  176. package/dist-esm/src/util/uuidUtils.native.js.map +1 -0
  177. package/dist-esm/src/xhrHttpClient.js +177 -0
  178. package/dist-esm/src/xhrHttpClient.js.map +1 -0
  179. package/package.json +134 -0
  180. package/ts-http-runtime.shims.d.ts +12 -0
  181. package/types/ts-http-runtime.d.ts +2062 -0
@@ -0,0 +1,23 @@
1
+ // Copyright (c) Microsoft Corporation.
2
+ // Licensed under the MIT license.
3
+ export function log(...args) {
4
+ if (args.length > 0) {
5
+ const firstArg = String(args[0]);
6
+ if (firstArg.includes(":error")) {
7
+ console.error(...args);
8
+ }
9
+ else if (firstArg.includes(":warning")) {
10
+ console.warn(...args);
11
+ }
12
+ else if (firstArg.includes(":info")) {
13
+ console.info(...args);
14
+ }
15
+ else if (firstArg.includes(":verbose")) {
16
+ console.debug(...args);
17
+ }
18
+ else {
19
+ console.debug(...args);
20
+ }
21
+ }
22
+ }
23
+ //# sourceMappingURL=log.browser.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"log.browser.js","sourceRoot":"","sources":["../../../src/logger/log.browser.ts"],"names":[],"mappings":"AAAA,uCAAuC;AACvC,kCAAkC;AAElC,MAAM,UAAU,GAAG,CAAC,GAAG,IAAW;IAChC,IAAI,IAAI,CAAC,MAAM,GAAG,CAAC,EAAE;QACnB,MAAM,QAAQ,GAAG,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC;QACjC,IAAI,QAAQ,CAAC,QAAQ,CAAC,QAAQ,CAAC,EAAE;YAC/B,OAAO,CAAC,KAAK,CAAC,GAAG,IAAI,CAAC,CAAC;SACxB;aAAM,IAAI,QAAQ,CAAC,QAAQ,CAAC,UAAU,CAAC,EAAE;YACxC,OAAO,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC,CAAC;SACvB;aAAM,IAAI,QAAQ,CAAC,QAAQ,CAAC,OAAO,CAAC,EAAE;YACrC,OAAO,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC,CAAC;SACvB;aAAM,IAAI,QAAQ,CAAC,QAAQ,CAAC,UAAU,CAAC,EAAE;YACxC,OAAO,CAAC,KAAK,CAAC,GAAG,IAAI,CAAC,CAAC;SACxB;aAAM;YACL,OAAO,CAAC,KAAK,CAAC,GAAG,IAAI,CAAC,CAAC;SACxB;KACF;AACH,CAAC","sourcesContent":["// Copyright (c) Microsoft Corporation.\n// Licensed under the MIT license.\n\nexport function log(...args: any[]): void {\n if (args.length > 0) {\n const firstArg = String(args[0]);\n if (firstArg.includes(\":error\")) {\n console.error(...args);\n } else if (firstArg.includes(\":warning\")) {\n console.warn(...args);\n } else if (firstArg.includes(\":info\")) {\n console.info(...args);\n } else if (firstArg.includes(\":verbose\")) {\n console.debug(...args);\n } else {\n console.debug(...args);\n }\n }\n}\n"]}
@@ -0,0 +1,8 @@
1
+ // Copyright (c) Microsoft Corporation.
2
+ // Licensed under the MIT license.
3
+ import { EOL } from "os";
4
+ import util from "util";
5
+ export function log(message, ...args) {
6
+ process.stderr.write(`${util.format(message, ...args)}${EOL}`);
7
+ }
8
+ //# sourceMappingURL=log.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"log.js","sourceRoot":"","sources":["../../../src/logger/log.ts"],"names":[],"mappings":"AAAA,uCAAuC;AACvC,kCAAkC;AAElC,OAAO,EAAE,GAAG,EAAE,MAAM,IAAI,CAAC;AACzB,OAAO,IAAI,MAAM,MAAM,CAAC;AAExB,MAAM,UAAU,GAAG,CAAC,OAAgB,EAAE,GAAG,IAAW;IAClD,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,IAAI,CAAC,MAAM,CAAC,OAAO,EAAE,GAAG,IAAI,CAAC,GAAG,GAAG,EAAE,CAAC,CAAC;AACjE,CAAC","sourcesContent":["// Copyright (c) Microsoft Corporation.\n// Licensed under the MIT license.\n\nimport { EOL } from \"os\";\nimport util from \"util\";\n\nexport function log(message: unknown, ...args: any[]): void {\n process.stderr.write(`${util.format(message, ...args)}${EOL}`);\n}\n"]}
@@ -0,0 +1,99 @@
1
+ // Copyright (c) Microsoft Corporation.
2
+ // Licensed under the MIT license.
3
+ import debug from "./debug";
4
+ const registeredLoggers = new Set();
5
+ const logLevelFromEnv = (typeof process !== "undefined" && process.env && process.env.TYPESPEC_RUNTIME_LOG_LEVEL) ||
6
+ undefined;
7
+ let typeSpecRuntimeLogLevel;
8
+ /**
9
+ * The TypeSpecRuntimeLogger provides a mechanism for overriding where logs are output to.
10
+ * By default, logs are sent to stderr.
11
+ * Override the `log` method to redirect logs to another location.
12
+ */
13
+ export const TypeSpecRuntimeLogger = debug("typeSpecRuntime");
14
+ TypeSpecRuntimeLogger.log = (...args) => {
15
+ debug.log(...args);
16
+ };
17
+ const TYPESPEC_RUNTIME_LOG_LEVELS = ["verbose", "info", "warning", "error"];
18
+ if (logLevelFromEnv) {
19
+ // avoid calling setLogLevel because we don't want a mis-set environment variable to crash
20
+ if (isTypeSpecRuntimeLogLevel(logLevelFromEnv)) {
21
+ setLogLevel(logLevelFromEnv);
22
+ }
23
+ else {
24
+ console.error(`TYPESPEC_RUNTIME_LOG_LEVEL set to unknown log level '${logLevelFromEnv}'; logging is not enabled. Acceptable values: ${TYPESPEC_RUNTIME_LOG_LEVELS.join(", ")}.`);
25
+ }
26
+ }
27
+ /**
28
+ * Immediately enables logging at the specified log level. If no level is specified, logging is disabled.
29
+ * @param level - The log level to enable for logging.
30
+ * Options from most verbose to least verbose are:
31
+ * - verbose
32
+ * - info
33
+ * - warning
34
+ * - error
35
+ */
36
+ export function setLogLevel(level) {
37
+ if (level && !isTypeSpecRuntimeLogLevel(level)) {
38
+ throw new Error(`Unknown log level '${level}'. Acceptable values: ${TYPESPEC_RUNTIME_LOG_LEVELS.join(",")}`);
39
+ }
40
+ typeSpecRuntimeLogLevel = level;
41
+ const enabledNamespaces = [];
42
+ for (const logger of registeredLoggers) {
43
+ if (shouldEnable(logger)) {
44
+ enabledNamespaces.push(logger.namespace);
45
+ }
46
+ }
47
+ debug.enable(enabledNamespaces.join(","));
48
+ }
49
+ /**
50
+ * Retrieves the currently specified log level.
51
+ */
52
+ export function getLogLevel() {
53
+ return typeSpecRuntimeLogLevel;
54
+ }
55
+ const levelMap = {
56
+ verbose: 400,
57
+ info: 300,
58
+ warning: 200,
59
+ error: 100,
60
+ };
61
+ /**
62
+ * Creates a logger for use by the SDKs that inherits from `TypeSpecRuntimeLogger`.
63
+ * @param namespace - The name of the SDK package.
64
+ * @hidden
65
+ */
66
+ export function createClientLogger(namespace) {
67
+ const clientRootLogger = TypeSpecRuntimeLogger.extend(namespace);
68
+ patchLogMethod(TypeSpecRuntimeLogger, clientRootLogger);
69
+ return {
70
+ error: createLogger(clientRootLogger, "error"),
71
+ warning: createLogger(clientRootLogger, "warning"),
72
+ info: createLogger(clientRootLogger, "info"),
73
+ verbose: createLogger(clientRootLogger, "verbose"),
74
+ };
75
+ }
76
+ function patchLogMethod(parent, child) {
77
+ child.log = (...args) => {
78
+ parent.log(...args);
79
+ };
80
+ }
81
+ function createLogger(parent, level) {
82
+ const logger = Object.assign(parent.extend(level), {
83
+ level,
84
+ });
85
+ patchLogMethod(parent, logger);
86
+ if (shouldEnable(logger)) {
87
+ const enabledNamespaces = debug.disable();
88
+ debug.enable(enabledNamespaces + "," + logger.namespace);
89
+ }
90
+ registeredLoggers.add(logger);
91
+ return logger;
92
+ }
93
+ function shouldEnable(logger) {
94
+ return Boolean(typeSpecRuntimeLogLevel && levelMap[logger.level] <= levelMap[typeSpecRuntimeLogLevel]);
95
+ }
96
+ function isTypeSpecRuntimeLogLevel(logLevel) {
97
+ return TYPESPEC_RUNTIME_LOG_LEVELS.includes(logLevel);
98
+ }
99
+ //# sourceMappingURL=logger.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"logger.js","sourceRoot":"","sources":["../../../src/logger/logger.ts"],"names":[],"mappings":"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","sourcesContent":["// Copyright (c) Microsoft Corporation.\n// Licensed under the MIT license.\n\nimport debug, { Debugger } from \"./debug\";\nexport { Debugger } from \"./debug\";\n\nconst registeredLoggers = new Set<TypeSpecRuntimeDebugger>();\nconst logLevelFromEnv =\n (typeof process !== \"undefined\" && process.env && process.env.TYPESPEC_RUNTIME_LOG_LEVEL) ||\n undefined;\n\nlet typeSpecRuntimeLogLevel: TypeSpecRuntimeLogLevel | undefined;\n\n/**\n * The TypeSpecRuntimeLogger provides a mechanism for overriding where logs are output to.\n * By default, logs are sent to stderr.\n * Override the `log` method to redirect logs to another location.\n */\nexport const TypeSpecRuntimeLogger: TypeSpecRuntimeClientLogger = debug(\"typeSpecRuntime\");\nTypeSpecRuntimeLogger.log = (...args) => {\n debug.log(...args);\n};\n\n/**\n * The log levels supported by the logger.\n * The log levels in order of most verbose to least verbose are:\n * - verbose\n * - info\n * - warning\n * - error\n */\nexport type TypeSpecRuntimeLogLevel = \"verbose\" | \"info\" | \"warning\" | \"error\";\nconst TYPESPEC_RUNTIME_LOG_LEVELS = [\"verbose\", \"info\", \"warning\", \"error\"];\n\ntype TypeSpecRuntimeDebugger = Debugger & { level: TypeSpecRuntimeLogLevel };\n\n/**\n * An TypeSpecRuntimeClientLogger is a function that can log to an appropriate severity level.\n */\nexport type TypeSpecRuntimeClientLogger = Debugger;\n\nif (logLevelFromEnv) {\n // avoid calling setLogLevel because we don't want a mis-set environment variable to crash\n if (isTypeSpecRuntimeLogLevel(logLevelFromEnv)) {\n setLogLevel(logLevelFromEnv);\n } else {\n console.error(\n `TYPESPEC_RUNTIME_LOG_LEVEL set to unknown log level '${logLevelFromEnv}'; logging is not enabled. Acceptable values: ${TYPESPEC_RUNTIME_LOG_LEVELS.join(\n \", \"\n )}.`\n );\n }\n}\n\n/**\n * Immediately enables logging at the specified log level. If no level is specified, logging is disabled.\n * @param level - The log level to enable for logging.\n * Options from most verbose to least verbose are:\n * - verbose\n * - info\n * - warning\n * - error\n */\nexport function setLogLevel(level?: TypeSpecRuntimeLogLevel): void {\n if (level && !isTypeSpecRuntimeLogLevel(level)) {\n throw new Error(\n `Unknown log level '${level}'. Acceptable values: ${TYPESPEC_RUNTIME_LOG_LEVELS.join(\",\")}`\n );\n }\n typeSpecRuntimeLogLevel = level;\n\n const enabledNamespaces = [];\n for (const logger of registeredLoggers) {\n if (shouldEnable(logger)) {\n enabledNamespaces.push(logger.namespace);\n }\n }\n\n debug.enable(enabledNamespaces.join(\",\"));\n}\n\n/**\n * Retrieves the currently specified log level.\n */\nexport function getLogLevel(): TypeSpecRuntimeLogLevel | undefined {\n return typeSpecRuntimeLogLevel;\n}\n\nconst levelMap = {\n verbose: 400,\n info: 300,\n warning: 200,\n error: 100,\n};\n\n/**\n * Defines the methods available on the SDK-facing logger.\n */\n// eslint-disable-next-line @typescript-eslint/no-redeclare\nexport interface TypeSpecRuntimeLogger {\n /**\n * Used for failures the program is unlikely to recover from,\n * such as Out of Memory.\n */\n error: Debugger;\n /**\n * Used when a function fails to perform its intended task.\n * Usually this means the function will throw an exception.\n * Not used for self-healing events (e.g. automatic retry)\n */\n warning: Debugger;\n /**\n * Used when a function operates normally.\n */\n info: Debugger;\n /**\n * Used for detailed troubleshooting scenarios. This is\n * intended for use by developers / system administrators\n * for diagnosing specific failures.\n */\n verbose: Debugger;\n}\n\n/**\n * Creates a logger for use by the SDKs that inherits from `TypeSpecRuntimeLogger`.\n * @param namespace - The name of the SDK package.\n * @hidden\n */\nexport function createClientLogger(namespace: string): TypeSpecRuntimeLogger {\n const clientRootLogger: TypeSpecRuntimeClientLogger = TypeSpecRuntimeLogger.extend(namespace);\n patchLogMethod(TypeSpecRuntimeLogger, clientRootLogger);\n return {\n error: createLogger(clientRootLogger, \"error\"),\n warning: createLogger(clientRootLogger, \"warning\"),\n info: createLogger(clientRootLogger, \"info\"),\n verbose: createLogger(clientRootLogger, \"verbose\"),\n };\n}\n\nfunction patchLogMethod(\n parent: TypeSpecRuntimeClientLogger,\n child: TypeSpecRuntimeClientLogger | TypeSpecRuntimeDebugger\n): void {\n child.log = (...args) => {\n parent.log(...args);\n };\n}\n\nfunction createLogger(\n parent: TypeSpecRuntimeClientLogger,\n level: TypeSpecRuntimeLogLevel\n): TypeSpecRuntimeDebugger {\n const logger: TypeSpecRuntimeDebugger = Object.assign(parent.extend(level), {\n level,\n });\n\n patchLogMethod(parent, logger);\n\n if (shouldEnable(logger)) {\n const enabledNamespaces = debug.disable();\n debug.enable(enabledNamespaces + \",\" + logger.namespace);\n }\n\n registeredLoggers.add(logger);\n\n return logger;\n}\n\nfunction shouldEnable(logger: TypeSpecRuntimeDebugger): boolean {\n return Boolean(\n typeSpecRuntimeLogLevel && levelMap[logger.level] <= levelMap[typeSpecRuntimeLogLevel]\n );\n}\n\nfunction isTypeSpecRuntimeLogLevel(logLevel: string): logLevel is TypeSpecRuntimeLogLevel {\n return TYPESPEC_RUNTIME_LOG_LEVELS.includes(logLevel as any);\n}\n"]}
@@ -0,0 +1,332 @@
1
+ // Copyright (c) Microsoft Corporation.
2
+ // Licensed under the MIT license.
3
+ import * as http from "http";
4
+ import * as https from "https";
5
+ import * as zlib from "zlib";
6
+ import { Transform } from "stream";
7
+ import { AbortError } from "./abort-controller/AbortError";
8
+ import { createHttpHeaders } from "./httpHeaders";
9
+ import { RestError } from "./restError";
10
+ import { logger } from "./log";
11
+ const DEFAULT_TLS_SETTINGS = {};
12
+ function isReadableStream(body) {
13
+ return body && typeof body.pipe === "function";
14
+ }
15
+ function isStreamComplete(stream) {
16
+ return new Promise((resolve) => {
17
+ stream.on("close", resolve);
18
+ stream.on("end", resolve);
19
+ stream.on("error", resolve);
20
+ });
21
+ }
22
+ function isArrayBuffer(body) {
23
+ return body && typeof body.byteLength === "number";
24
+ }
25
+ class ReportTransform extends Transform {
26
+ // eslint-disable-next-line @typescript-eslint/ban-types
27
+ _transform(chunk, _encoding, callback) {
28
+ this.push(chunk);
29
+ this.loadedBytes += chunk.length;
30
+ try {
31
+ this.progressCallback({ loadedBytes: this.loadedBytes });
32
+ callback();
33
+ }
34
+ catch (e) {
35
+ callback(e);
36
+ }
37
+ }
38
+ constructor(progressCallback) {
39
+ super();
40
+ this.loadedBytes = 0;
41
+ this.progressCallback = progressCallback;
42
+ }
43
+ }
44
+ /**
45
+ * A HttpClient implementation that uses Node's "https" module to send HTTPS requests.
46
+ * @internal
47
+ */
48
+ class NodeHttpClient {
49
+ constructor() {
50
+ this.cachedHttpsAgents = new WeakMap();
51
+ }
52
+ /**
53
+ * Makes a request over an underlying transport layer and returns the response.
54
+ * @param request - The request to be made.
55
+ */
56
+ async sendRequest(request) {
57
+ var _a, _b, _c;
58
+ const abortController = new AbortController();
59
+ let abortListener;
60
+ if (request.abortSignal) {
61
+ if (request.abortSignal.aborted) {
62
+ throw new AbortError("The operation was aborted.");
63
+ }
64
+ abortListener = (event) => {
65
+ if (event.type === "abort") {
66
+ abortController.abort();
67
+ }
68
+ };
69
+ request.abortSignal.addEventListener("abort", abortListener);
70
+ }
71
+ if (request.timeout > 0) {
72
+ setTimeout(() => {
73
+ abortController.abort();
74
+ }, request.timeout);
75
+ }
76
+ const acceptEncoding = request.headers.get("Accept-Encoding");
77
+ const shouldDecompress = (acceptEncoding === null || acceptEncoding === void 0 ? void 0 : acceptEncoding.includes("gzip")) || (acceptEncoding === null || acceptEncoding === void 0 ? void 0 : acceptEncoding.includes("deflate"));
78
+ let body = typeof request.body === "function" ? request.body() : request.body;
79
+ if (body && !request.headers.has("Content-Length")) {
80
+ const bodyLength = getBodyLength(body);
81
+ if (bodyLength !== null) {
82
+ request.headers.set("Content-Length", bodyLength);
83
+ }
84
+ }
85
+ let responseStream;
86
+ try {
87
+ if (body && request.onUploadProgress) {
88
+ const onUploadProgress = request.onUploadProgress;
89
+ const uploadReportStream = new ReportTransform(onUploadProgress);
90
+ uploadReportStream.on("error", (e) => {
91
+ logger.error("Error in upload progress", e);
92
+ });
93
+ if (isReadableStream(body)) {
94
+ body.pipe(uploadReportStream);
95
+ }
96
+ else {
97
+ uploadReportStream.end(body);
98
+ }
99
+ body = uploadReportStream;
100
+ }
101
+ const res = await this.makeRequest(request, abortController, body);
102
+ const headers = getResponseHeaders(res);
103
+ const status = (_a = res.statusCode) !== null && _a !== void 0 ? _a : 0;
104
+ const response = {
105
+ status,
106
+ headers,
107
+ request,
108
+ };
109
+ // Responses to HEAD must not have a body.
110
+ // If they do return a body, that body must be ignored.
111
+ if (request.method === "HEAD") {
112
+ // call resume() and not destroy() to avoid closing the socket
113
+ // and losing keep alive
114
+ res.resume();
115
+ return response;
116
+ }
117
+ responseStream = shouldDecompress ? getDecodedResponseStream(res, headers) : res;
118
+ const onDownloadProgress = request.onDownloadProgress;
119
+ if (onDownloadProgress) {
120
+ const downloadReportStream = new ReportTransform(onDownloadProgress);
121
+ downloadReportStream.on("error", (e) => {
122
+ logger.error("Error in download progress", e);
123
+ });
124
+ responseStream.pipe(downloadReportStream);
125
+ responseStream = downloadReportStream;
126
+ }
127
+ if (
128
+ // Value of POSITIVE_INFINITY in streamResponseStatusCodes is considered as any status code
129
+ ((_b = request.streamResponseStatusCodes) === null || _b === void 0 ? void 0 : _b.has(Number.POSITIVE_INFINITY)) ||
130
+ ((_c = request.streamResponseStatusCodes) === null || _c === void 0 ? void 0 : _c.has(response.status))) {
131
+ response.readableStreamBody = responseStream;
132
+ }
133
+ else {
134
+ response.bodyAsText = await streamToText(responseStream);
135
+ }
136
+ return response;
137
+ }
138
+ finally {
139
+ // clean up event listener
140
+ if (request.abortSignal && abortListener) {
141
+ let uploadStreamDone = Promise.resolve();
142
+ if (isReadableStream(body)) {
143
+ uploadStreamDone = isStreamComplete(body);
144
+ }
145
+ let downloadStreamDone = Promise.resolve();
146
+ if (isReadableStream(responseStream)) {
147
+ downloadStreamDone = isStreamComplete(responseStream);
148
+ }
149
+ Promise.all([uploadStreamDone, downloadStreamDone])
150
+ .then(() => {
151
+ var _a;
152
+ // eslint-disable-next-line promise/always-return
153
+ if (abortListener) {
154
+ (_a = request.abortSignal) === null || _a === void 0 ? void 0 : _a.removeEventListener("abort", abortListener);
155
+ }
156
+ })
157
+ .catch((e) => {
158
+ logger.warning("Error when cleaning up abortListener on httpRequest", e);
159
+ });
160
+ }
161
+ }
162
+ }
163
+ makeRequest(request, abortController, body) {
164
+ var _a;
165
+ const url = new URL(request.url);
166
+ const isInsecure = url.protocol !== "https:";
167
+ if (isInsecure && !request.allowInsecureConnection) {
168
+ throw new Error(`Cannot connect to ${request.url} while allowInsecureConnection is false.`);
169
+ }
170
+ const agent = (_a = request.agent) !== null && _a !== void 0 ? _a : this.getOrCreateAgent(request, isInsecure);
171
+ const options = {
172
+ agent,
173
+ hostname: url.hostname,
174
+ path: `${url.pathname}${url.search}`,
175
+ port: url.port,
176
+ method: request.method,
177
+ headers: request.headers.toJSON({ preserveCase: true }),
178
+ };
179
+ return new Promise((resolve, reject) => {
180
+ const req = isInsecure ? http.request(options, resolve) : https.request(options, resolve);
181
+ req.once("error", (err) => {
182
+ var _a;
183
+ reject(new RestError(err.message, { code: (_a = err.code) !== null && _a !== void 0 ? _a : RestError.REQUEST_SEND_ERROR, request }));
184
+ });
185
+ abortController.signal.addEventListener("abort", () => {
186
+ const abortError = new AbortError("The operation was aborted.");
187
+ req.destroy(abortError);
188
+ reject(abortError);
189
+ });
190
+ if (body && isReadableStream(body)) {
191
+ body.pipe(req);
192
+ }
193
+ else if (body) {
194
+ if (typeof body === "string" || Buffer.isBuffer(body)) {
195
+ req.end(body);
196
+ }
197
+ else if (isArrayBuffer(body)) {
198
+ req.end(ArrayBuffer.isView(body) ? Buffer.from(body.buffer) : Buffer.from(body));
199
+ }
200
+ else {
201
+ logger.error("Unrecognized body type", body);
202
+ reject(new RestError("Unrecognized body type"));
203
+ }
204
+ }
205
+ else {
206
+ // streams don't like "undefined" being passed as data
207
+ req.end();
208
+ }
209
+ });
210
+ }
211
+ getOrCreateAgent(request, isInsecure) {
212
+ var _a;
213
+ const disableKeepAlive = request.disableKeepAlive;
214
+ // Handle Insecure requests first
215
+ if (isInsecure) {
216
+ if (disableKeepAlive) {
217
+ // keepAlive:false is the default so we don't need a custom Agent
218
+ return http.globalAgent;
219
+ }
220
+ if (!this.cachedHttpAgent) {
221
+ // If there is no cached agent create a new one and cache it.
222
+ this.cachedHttpAgent = new http.Agent({ keepAlive: true });
223
+ }
224
+ return this.cachedHttpAgent;
225
+ }
226
+ else {
227
+ if (disableKeepAlive && !request.tlsSettings) {
228
+ // When there are no tlsSettings and keepAlive is false
229
+ // we don't need a custom agent
230
+ return https.globalAgent;
231
+ }
232
+ // We use the tlsSettings to index cached clients
233
+ const tlsSettings = (_a = request.tlsSettings) !== null && _a !== void 0 ? _a : DEFAULT_TLS_SETTINGS;
234
+ // Get the cached agent or create a new one with the
235
+ // provided values for keepAlive and tlsSettings
236
+ let agent = this.cachedHttpsAgents.get(tlsSettings);
237
+ if (agent && agent.options.keepAlive === !disableKeepAlive) {
238
+ return agent;
239
+ }
240
+ logger.info("No cached TLS Agent exist, creating a new Agent");
241
+ agent = new https.Agent(Object.assign({
242
+ // keepAlive is true if disableKeepAlive is false.
243
+ keepAlive: !disableKeepAlive }, tlsSettings));
244
+ this.cachedHttpsAgents.set(tlsSettings, agent);
245
+ return agent;
246
+ }
247
+ }
248
+ }
249
+ function getResponseHeaders(res) {
250
+ const headers = createHttpHeaders();
251
+ for (const header of Object.keys(res.headers)) {
252
+ const value = res.headers[header];
253
+ if (Array.isArray(value)) {
254
+ if (value.length > 0) {
255
+ headers.set(header, value[0]);
256
+ }
257
+ }
258
+ else if (value) {
259
+ headers.set(header, value);
260
+ }
261
+ }
262
+ return headers;
263
+ }
264
+ function getDecodedResponseStream(stream, headers) {
265
+ const contentEncoding = headers.get("Content-Encoding");
266
+ if (contentEncoding === "gzip") {
267
+ const unzip = zlib.createGunzip();
268
+ stream.pipe(unzip);
269
+ return unzip;
270
+ }
271
+ else if (contentEncoding === "deflate") {
272
+ const inflate = zlib.createInflate();
273
+ stream.pipe(inflate);
274
+ return inflate;
275
+ }
276
+ return stream;
277
+ }
278
+ function streamToText(stream) {
279
+ return new Promise((resolve, reject) => {
280
+ const buffer = [];
281
+ stream.on("data", (chunk) => {
282
+ if (Buffer.isBuffer(chunk)) {
283
+ buffer.push(chunk);
284
+ }
285
+ else {
286
+ buffer.push(Buffer.from(chunk));
287
+ }
288
+ });
289
+ stream.on("end", () => {
290
+ resolve(Buffer.concat(buffer).toString("utf8"));
291
+ });
292
+ stream.on("error", (e) => {
293
+ if (e && (e === null || e === void 0 ? void 0 : e.name) === "AbortError") {
294
+ reject(e);
295
+ }
296
+ else {
297
+ reject(new RestError(`Error reading response as text: ${e.message}`, {
298
+ code: RestError.PARSE_ERROR,
299
+ }));
300
+ }
301
+ });
302
+ });
303
+ }
304
+ /** @internal */
305
+ export function getBodyLength(body) {
306
+ if (!body) {
307
+ return 0;
308
+ }
309
+ else if (Buffer.isBuffer(body)) {
310
+ return body.length;
311
+ }
312
+ else if (isReadableStream(body)) {
313
+ return null;
314
+ }
315
+ else if (isArrayBuffer(body)) {
316
+ return body.byteLength;
317
+ }
318
+ else if (typeof body === "string") {
319
+ return Buffer.from(body).length;
320
+ }
321
+ else {
322
+ return null;
323
+ }
324
+ }
325
+ /**
326
+ * Create a new HttpClient instance for the NodeJS environment.
327
+ * @internal
328
+ */
329
+ export function createNodeHttpClient() {
330
+ return new NodeHttpClient();
331
+ }
332
+ //# sourceMappingURL=nodeHttpClient.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"nodeHttpClient.js","sourceRoot":"","sources":["../../src/nodeHttpClient.ts"],"names":[],"mappings":"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","sourcesContent":["// Copyright (c) Microsoft Corporation.\n// Licensed under the MIT license.\n\nimport * as http from \"http\";\nimport * as https from \"https\";\nimport * as zlib from \"zlib\";\nimport { Transform } from \"stream\";\nimport { AbortError } from \"./abort-controller/AbortError\";\nimport {\n HttpClient,\n HttpHeaders,\n PipelineRequest,\n PipelineResponse,\n RequestBodyType,\n TlsSettings,\n TransferProgressEvent,\n} from \"./interfaces\";\nimport { createHttpHeaders } from \"./httpHeaders\";\nimport { RestError } from \"./restError\";\nimport { IncomingMessage } from \"http\";\nimport { logger } from \"./log\";\n\nconst DEFAULT_TLS_SETTINGS = {};\n\nfunction isReadableStream(body: any): body is NodeJS.ReadableStream {\n return body && typeof body.pipe === \"function\";\n}\n\nfunction isStreamComplete(stream: NodeJS.ReadableStream): Promise<void> {\n return new Promise((resolve) => {\n stream.on(\"close\", resolve);\n stream.on(\"end\", resolve);\n stream.on(\"error\", resolve);\n });\n}\n\nfunction isArrayBuffer(body: any): body is ArrayBuffer | ArrayBufferView {\n return body && typeof body.byteLength === \"number\";\n}\n\nclass ReportTransform extends Transform {\n private loadedBytes = 0;\n private progressCallback: (progress: TransferProgressEvent) => void;\n\n // eslint-disable-next-line @typescript-eslint/ban-types\n _transform(chunk: string | Buffer, _encoding: string, callback: Function): void {\n this.push(chunk);\n this.loadedBytes += chunk.length;\n try {\n this.progressCallback({ loadedBytes: this.loadedBytes });\n callback();\n } catch (e: any) {\n callback(e);\n }\n }\n\n constructor(progressCallback: (progress: TransferProgressEvent) => void) {\n super();\n this.progressCallback = progressCallback;\n }\n}\n\n/**\n * A HttpClient implementation that uses Node's \"https\" module to send HTTPS requests.\n * @internal\n */\nclass NodeHttpClient implements HttpClient {\n private cachedHttpAgent?: http.Agent;\n private cachedHttpsAgents: WeakMap<TlsSettings, https.Agent> = new WeakMap();\n\n /**\n * Makes a request over an underlying transport layer and returns the response.\n * @param request - The request to be made.\n */\n public async sendRequest(request: PipelineRequest): Promise<PipelineResponse> {\n const abortController = new AbortController();\n let abortListener: ((event: any) => void) | undefined;\n if (request.abortSignal) {\n if (request.abortSignal.aborted) {\n throw new AbortError(\"The operation was aborted.\");\n }\n\n abortListener = (event: Event) => {\n if (event.type === \"abort\") {\n abortController.abort();\n }\n };\n request.abortSignal.addEventListener(\"abort\", abortListener);\n }\n\n if (request.timeout > 0) {\n setTimeout(() => {\n abortController.abort();\n }, request.timeout);\n }\n\n const acceptEncoding = request.headers.get(\"Accept-Encoding\");\n const shouldDecompress =\n acceptEncoding?.includes(\"gzip\") || acceptEncoding?.includes(\"deflate\");\n\n let body = typeof request.body === \"function\" ? request.body() : request.body;\n if (body && !request.headers.has(\"Content-Length\")) {\n const bodyLength = getBodyLength(body);\n if (bodyLength !== null) {\n request.headers.set(\"Content-Length\", bodyLength);\n }\n }\n\n let responseStream: NodeJS.ReadableStream | undefined;\n try {\n if (body && request.onUploadProgress) {\n const onUploadProgress = request.onUploadProgress;\n const uploadReportStream = new ReportTransform(onUploadProgress);\n uploadReportStream.on(\"error\", (e) => {\n logger.error(\"Error in upload progress\", e);\n });\n if (isReadableStream(body)) {\n body.pipe(uploadReportStream);\n } else {\n uploadReportStream.end(body);\n }\n\n body = uploadReportStream;\n }\n\n const res = await this.makeRequest(request, abortController, body);\n\n const headers = getResponseHeaders(res);\n\n const status = res.statusCode ?? 0;\n const response: PipelineResponse = {\n status,\n headers,\n request,\n };\n\n // Responses to HEAD must not have a body.\n // If they do return a body, that body must be ignored.\n if (request.method === \"HEAD\") {\n // call resume() and not destroy() to avoid closing the socket\n // and losing keep alive\n res.resume();\n return response;\n }\n\n responseStream = shouldDecompress ? getDecodedResponseStream(res, headers) : res;\n\n const onDownloadProgress = request.onDownloadProgress;\n if (onDownloadProgress) {\n const downloadReportStream = new ReportTransform(onDownloadProgress);\n downloadReportStream.on(\"error\", (e) => {\n logger.error(\"Error in download progress\", e);\n });\n responseStream.pipe(downloadReportStream);\n responseStream = downloadReportStream;\n }\n\n if (\n // Value of POSITIVE_INFINITY in streamResponseStatusCodes is considered as any status code\n request.streamResponseStatusCodes?.has(Number.POSITIVE_INFINITY) ||\n request.streamResponseStatusCodes?.has(response.status)\n ) {\n response.readableStreamBody = responseStream;\n } else {\n response.bodyAsText = await streamToText(responseStream);\n }\n\n return response;\n } finally {\n // clean up event listener\n if (request.abortSignal && abortListener) {\n let uploadStreamDone = Promise.resolve();\n if (isReadableStream(body)) {\n uploadStreamDone = isStreamComplete(body as NodeJS.ReadableStream);\n }\n let downloadStreamDone = Promise.resolve();\n if (isReadableStream(responseStream)) {\n downloadStreamDone = isStreamComplete(responseStream);\n }\n\n Promise.all([uploadStreamDone, downloadStreamDone])\n .then(() => {\n // eslint-disable-next-line promise/always-return\n if (abortListener) {\n request.abortSignal?.removeEventListener(\"abort\", abortListener);\n }\n })\n .catch((e) => {\n logger.warning(\"Error when cleaning up abortListener on httpRequest\", e);\n });\n }\n }\n }\n\n private makeRequest(\n request: PipelineRequest,\n abortController: AbortController,\n body?: RequestBodyType\n ): Promise<http.IncomingMessage> {\n const url = new URL(request.url);\n\n const isInsecure = url.protocol !== \"https:\";\n\n if (isInsecure && !request.allowInsecureConnection) {\n throw new Error(`Cannot connect to ${request.url} while allowInsecureConnection is false.`);\n }\n\n const agent = (request.agent as http.Agent) ?? this.getOrCreateAgent(request, isInsecure);\n const options: http.RequestOptions = {\n agent,\n hostname: url.hostname,\n path: `${url.pathname}${url.search}`,\n port: url.port,\n method: request.method,\n headers: request.headers.toJSON({ preserveCase: true }),\n };\n\n return new Promise<http.IncomingMessage>((resolve, reject) => {\n const req = isInsecure ? http.request(options, resolve) : https.request(options, resolve);\n\n req.once(\"error\", (err: Error & { code?: string }) => {\n reject(\n new RestError(err.message, { code: err.code ?? RestError.REQUEST_SEND_ERROR, request })\n );\n });\n\n abortController.signal.addEventListener(\"abort\", () => {\n const abortError = new AbortError(\"The operation was aborted.\");\n req.destroy(abortError);\n reject(abortError);\n });\n if (body && isReadableStream(body)) {\n body.pipe(req);\n } else if (body) {\n if (typeof body === \"string\" || Buffer.isBuffer(body)) {\n req.end(body);\n } else if (isArrayBuffer(body)) {\n req.end(ArrayBuffer.isView(body) ? Buffer.from(body.buffer) : Buffer.from(body));\n } else {\n logger.error(\"Unrecognized body type\", body);\n reject(new RestError(\"Unrecognized body type\"));\n }\n } else {\n // streams don't like \"undefined\" being passed as data\n req.end();\n }\n });\n }\n\n private getOrCreateAgent(request: PipelineRequest, isInsecure: boolean): http.Agent {\n const disableKeepAlive = request.disableKeepAlive;\n\n // Handle Insecure requests first\n if (isInsecure) {\n if (disableKeepAlive) {\n // keepAlive:false is the default so we don't need a custom Agent\n return http.globalAgent;\n }\n\n if (!this.cachedHttpAgent) {\n // If there is no cached agent create a new one and cache it.\n this.cachedHttpAgent = new http.Agent({ keepAlive: true });\n }\n return this.cachedHttpAgent;\n } else {\n if (disableKeepAlive && !request.tlsSettings) {\n // When there are no tlsSettings and keepAlive is false\n // we don't need a custom agent\n return https.globalAgent;\n }\n\n // We use the tlsSettings to index cached clients\n const tlsSettings = request.tlsSettings ?? DEFAULT_TLS_SETTINGS;\n\n // Get the cached agent or create a new one with the\n // provided values for keepAlive and tlsSettings\n let agent = this.cachedHttpsAgents.get(tlsSettings);\n\n if (agent && agent.options.keepAlive === !disableKeepAlive) {\n return agent;\n }\n\n logger.info(\"No cached TLS Agent exist, creating a new Agent\");\n agent = new https.Agent({\n // keepAlive is true if disableKeepAlive is false.\n keepAlive: !disableKeepAlive,\n // Since we are spreading, if no tslSettings were provided, nothing is added to the agent options.\n ...tlsSettings,\n });\n\n this.cachedHttpsAgents.set(tlsSettings, agent);\n return agent;\n }\n }\n}\n\nfunction getResponseHeaders(res: IncomingMessage): HttpHeaders {\n const headers = createHttpHeaders();\n for (const header of Object.keys(res.headers)) {\n const value = res.headers[header];\n if (Array.isArray(value)) {\n if (value.length > 0) {\n headers.set(header, value[0]);\n }\n } else if (value) {\n headers.set(header, value);\n }\n }\n return headers;\n}\n\nfunction getDecodedResponseStream(\n stream: IncomingMessage,\n headers: HttpHeaders\n): NodeJS.ReadableStream {\n const contentEncoding = headers.get(\"Content-Encoding\");\n if (contentEncoding === \"gzip\") {\n const unzip = zlib.createGunzip();\n stream.pipe(unzip);\n return unzip;\n } else if (contentEncoding === \"deflate\") {\n const inflate = zlib.createInflate();\n stream.pipe(inflate);\n return inflate;\n }\n\n return stream;\n}\n\nfunction streamToText(stream: NodeJS.ReadableStream): Promise<string> {\n return new Promise<string>((resolve, reject) => {\n const buffer: Buffer[] = [];\n\n stream.on(\"data\", (chunk) => {\n if (Buffer.isBuffer(chunk)) {\n buffer.push(chunk);\n } else {\n buffer.push(Buffer.from(chunk));\n }\n });\n stream.on(\"end\", () => {\n resolve(Buffer.concat(buffer).toString(\"utf8\"));\n });\n stream.on(\"error\", (e) => {\n if (e && e?.name === \"AbortError\") {\n reject(e);\n } else {\n reject(\n new RestError(`Error reading response as text: ${e.message}`, {\n code: RestError.PARSE_ERROR,\n })\n );\n }\n });\n });\n}\n\n/** @internal */\nexport function getBodyLength(body: RequestBodyType): number | null {\n if (!body) {\n return 0;\n } else if (Buffer.isBuffer(body)) {\n return body.length;\n } else if (isReadableStream(body)) {\n return null;\n } else if (isArrayBuffer(body)) {\n return body.byteLength;\n } else if (typeof body === \"string\") {\n return Buffer.from(body).length;\n } else {\n return null;\n }\n}\n\n/**\n * Create a new HttpClient instance for the NodeJS environment.\n * @internal\n */\nexport function createNodeHttpClient(): HttpClient {\n return new NodeHttpClient();\n}\n"]}