velocious 1.0.567 → 1.0.568

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 (108) hide show
  1. package/README.md +29 -1
  2. package/build/database/drivers/base-table.js +4 -3
  3. package/build/database/drivers/base.js +28 -0
  4. package/build/database/drivers/index-metadata.js +28 -0
  5. package/build/database/drivers/mssql/column.js +2 -34
  6. package/build/database/drivers/mssql/columns-index.js +37 -0
  7. package/build/database/drivers/mssql/table.js +55 -11
  8. package/build/database/drivers/mysql/sql/alter-table.js +13 -0
  9. package/build/database/drivers/pgsql/column.js +2 -27
  10. package/build/database/drivers/pgsql/columns-index.js +37 -0
  11. package/build/database/drivers/pgsql/table.js +61 -10
  12. package/build/database/drivers/sqlite/sql/alter-table.js +18 -0
  13. package/build/database/migration/index.js +92 -3
  14. package/build/database/query/alter-table-base.js +20 -1
  15. package/build/database/record/attachments/normalize-input.js +38 -10
  16. package/build/database/record/attachments/storage-drivers/filesystem.js +33 -2
  17. package/build/database/record/attachments/storage-drivers/native.js +17 -2
  18. package/build/database/record/attachments/storage-drivers/s3.js +27 -7
  19. package/build/database/record/attachments/store.js +159 -43
  20. package/build/database/table-data/table-foreign-key.js +9 -1
  21. package/build/environment-handlers/base.js +1 -1
  22. package/build/environment-handlers/node/attachment-path-source.js +144 -0
  23. package/build/environment-handlers/node.js +28 -3
  24. package/build/src/database/drivers/base-table.d.ts.map +1 -1
  25. package/build/src/database/drivers/base-table.js +4 -3
  26. package/build/src/database/drivers/base.d.ts +7 -0
  27. package/build/src/database/drivers/base.d.ts.map +1 -1
  28. package/build/src/database/drivers/base.js +24 -1
  29. package/build/src/database/drivers/index-metadata.d.ts +41 -0
  30. package/build/src/database/drivers/index-metadata.d.ts.map +1 -0
  31. package/build/src/database/drivers/index-metadata.js +26 -0
  32. package/build/src/database/drivers/mssql/column.d.ts.map +1 -1
  33. package/build/src/database/drivers/mssql/column.js +3 -31
  34. package/build/src/database/drivers/mssql/columns-index.d.ts +41 -0
  35. package/build/src/database/drivers/mssql/columns-index.d.ts.map +1 -1
  36. package/build/src/database/drivers/mssql/columns-index.js +35 -1
  37. package/build/src/database/drivers/mssql/table.d.ts +42 -0
  38. package/build/src/database/drivers/mssql/table.d.ts.map +1 -1
  39. package/build/src/database/drivers/mssql/table.js +49 -12
  40. package/build/src/database/drivers/mysql/sql/alter-table.d.ts.map +1 -1
  41. package/build/src/database/drivers/mysql/sql/alter-table.js +12 -1
  42. package/build/src/database/drivers/pgsql/column.d.ts.map +1 -1
  43. package/build/src/database/drivers/pgsql/column.js +3 -24
  44. package/build/src/database/drivers/pgsql/columns-index.d.ts +41 -0
  45. package/build/src/database/drivers/pgsql/columns-index.d.ts.map +1 -1
  46. package/build/src/database/drivers/pgsql/columns-index.js +35 -1
  47. package/build/src/database/drivers/pgsql/table.d.ts +42 -0
  48. package/build/src/database/drivers/pgsql/table.d.ts.map +1 -1
  49. package/build/src/database/drivers/pgsql/table.js +54 -11
  50. package/build/src/database/drivers/sqlite/sql/alter-table.d.ts.map +1 -1
  51. package/build/src/database/drivers/sqlite/sql/alter-table.js +15 -1
  52. package/build/src/database/migration/index.d.ts +35 -1
  53. package/build/src/database/migration/index.d.ts.map +1 -1
  54. package/build/src/database/migration/index.js +78 -4
  55. package/build/src/database/query/alter-table-base.d.ts +6 -0
  56. package/build/src/database/query/alter-table-base.d.ts.map +1 -1
  57. package/build/src/database/query/alter-table-base.js +18 -2
  58. package/build/src/database/record/attachments/normalize-input.d.ts +33 -4
  59. package/build/src/database/record/attachments/normalize-input.d.ts.map +1 -1
  60. package/build/src/database/record/attachments/normalize-input.js +39 -11
  61. package/build/src/database/record/attachments/storage-drivers/filesystem.d.ts +2 -5
  62. package/build/src/database/record/attachments/storage-drivers/filesystem.d.ts.map +1 -1
  63. package/build/src/database/record/attachments/storage-drivers/filesystem.js +28 -3
  64. package/build/src/database/record/attachments/storage-drivers/native.d.ts +2 -6
  65. package/build/src/database/record/attachments/storage-drivers/native.d.ts.map +1 -1
  66. package/build/src/database/record/attachments/storage-drivers/native.js +14 -3
  67. package/build/src/database/record/attachments/storage-drivers/s3.d.ts +2 -6
  68. package/build/src/database/record/attachments/storage-drivers/s3.d.ts.map +1 -1
  69. package/build/src/database/record/attachments/storage-drivers/s3.js +29 -8
  70. package/build/src/database/record/attachments/store.d.ts +27 -0
  71. package/build/src/database/record/attachments/store.d.ts.map +1 -1
  72. package/build/src/database/record/attachments/store.js +144 -44
  73. package/build/src/database/table-data/table-foreign-key.d.ts +9 -1
  74. package/build/src/database/table-data/table-foreign-key.d.ts.map +1 -1
  75. package/build/src/database/table-data/table-foreign-key.js +9 -2
  76. package/build/src/environment-handlers/base.d.ts +2 -5
  77. package/build/src/environment-handlers/base.d.ts.map +1 -1
  78. package/build/src/environment-handlers/base.js +2 -2
  79. package/build/src/environment-handlers/node/attachment-path-source.d.ts +64 -0
  80. package/build/src/environment-handlers/node/attachment-path-source.d.ts.map +1 -0
  81. package/build/src/environment-handlers/node/attachment-path-source.js +116 -0
  82. package/build/src/environment-handlers/node.d.ts +12 -0
  83. package/build/src/environment-handlers/node.d.ts.map +1 -1
  84. package/build/src/environment-handlers/node.js +24 -4
  85. package/build/tsconfig.tsbuildinfo +1 -1
  86. package/package.json +1 -1
  87. package/src/database/drivers/base-table.js +4 -3
  88. package/src/database/drivers/base.js +28 -0
  89. package/src/database/drivers/index-metadata.js +28 -0
  90. package/src/database/drivers/mssql/column.js +2 -34
  91. package/src/database/drivers/mssql/columns-index.js +37 -0
  92. package/src/database/drivers/mssql/table.js +55 -11
  93. package/src/database/drivers/mysql/sql/alter-table.js +13 -0
  94. package/src/database/drivers/pgsql/column.js +2 -27
  95. package/src/database/drivers/pgsql/columns-index.js +37 -0
  96. package/src/database/drivers/pgsql/table.js +61 -10
  97. package/src/database/drivers/sqlite/sql/alter-table.js +18 -0
  98. package/src/database/migration/index.js +92 -3
  99. package/src/database/query/alter-table-base.js +20 -1
  100. package/src/database/record/attachments/normalize-input.js +38 -10
  101. package/src/database/record/attachments/storage-drivers/filesystem.js +33 -2
  102. package/src/database/record/attachments/storage-drivers/native.js +17 -2
  103. package/src/database/record/attachments/storage-drivers/s3.js +27 -7
  104. package/src/database/record/attachments/store.js +159 -43
  105. package/src/database/table-data/table-foreign-key.js +9 -1
  106. package/src/environment-handlers/base.js +1 -1
  107. package/src/environment-handlers/node/attachment-path-source.js +144 -0
  108. package/src/environment-handlers/node.js +28 -3
@@ -1,13 +1,23 @@
1
1
  // @ts-check
2
2
  import UploadedFile from "../../../http-server/client/uploaded-file/uploaded-file.js";
3
+ /**
4
+ * AttachmentPathSource type.
5
+ * @typedef {object} AttachmentPathSource
6
+ * @property {number} byteSize - Opened file snapshot size.
7
+ * @property {string} filePath - Validated source path for metadata only.
8
+ * @property {() => Promise<import("node:stream").Readable>} createReadStream - Creates a bounded snapshot stream.
9
+ * @property {() => Promise<Buffer>} readBuffer - Reads snapshot bytes for compatibility callers.
10
+ * @property {() => Promise<void>} close - Closes the owned source.
11
+ */
3
12
  /**
4
13
  * NormalizedAttachmentInput type.
5
14
  * @typedef {object} NormalizedAttachmentInput
6
15
  * @property {number} byteSize - File size in bytes.
7
- * @property {Buffer} contentBuffer - Raw content bytes.
8
- * @property {string} contentBase64 - Base64 encoded content.
16
+ * @property {Buffer | null} contentBuffer - Raw in-memory content bytes.
17
+ * @property {string | null} contentBase64 - Base64 encoded in-memory content.
9
18
  * @property {string | null} contentType - Content type.
10
19
  * @property {string} filename - Filename.
20
+ * @property {AttachmentPathSource | null} pathSource - Environment-owned opened path source.
11
21
  */
12
22
  /**
13
23
  * Runs base name.
@@ -107,8 +117,16 @@ export default async function normalizeRecordAttachmentInput(input, args = {}) {
107
117
  const environmentHandler = args.environmentHandler;
108
118
  /**
109
119
  * Defines buffer.
110
- * @type {Buffer} */
111
- let buffer;
120
+ * @type {Buffer | null} */
121
+ let buffer = null;
122
+ /**
123
+ * Defines byte size.
124
+ * @type {number | null} */
125
+ let byteSize = null;
126
+ /**
127
+ * Defines path source.
128
+ * @type {AttachmentPathSource | null} */
129
+ let pathSource = null;
112
130
  /**
113
131
  * Content type.
114
132
  * @type {string | null} */
@@ -132,12 +150,14 @@ export default async function normalizeRecordAttachmentInput(input, args = {}) {
132
150
  const allowedPathPrefixes = Array.isArray(args.allowedPathPrefixes)
133
151
  ? args.allowedPathPrefixes.filter((entry) => typeof entry === "string" && entry.length > 0)
134
152
  : [];
135
- const { buffer: fileBuffer, filePath } = await environmentHandler.resolveAttachmentInputPath({
153
+ pathSource = await environmentHandler.resolveAttachmentInputPath({
136
154
  allowedPathPrefixes,
137
155
  inputPath: input.path
138
156
  });
139
- buffer = fileBuffer;
140
- filename = typeof input.filename === "string" && input.filename.length > 0 ? input.filename : baseName(filePath);
157
+ byteSize = pathSource.byteSize;
158
+ filename = typeof input.filename === "string" && input.filename.length > 0
159
+ ? input.filename
160
+ : baseName(pathSource.filePath);
141
161
  contentType = typeof input.contentType === "string" && input.contentType.length > 0 ? input.contentType : null;
142
162
  }
143
163
  else if (isPlainObject(input) && typeof input.contentBase64 === "string") {
@@ -170,12 +190,20 @@ export default async function normalizeRecordAttachmentInput(input, args = {}) {
170
190
  const normalizedFilename = typeof filename === "string" && filename.length > 0
171
191
  ? baseName(filename)
172
192
  : "";
193
+ if (!buffer && !pathSource) {
194
+ throw new Error("Attachment input normalization produced no content");
195
+ }
196
+ if (buffer)
197
+ byteSize = buffer.length;
198
+ if (byteSize === null)
199
+ throw new Error("Attachment input normalization produced no byte size");
173
200
  return {
174
- byteSize: buffer.length,
201
+ byteSize,
175
202
  contentBuffer: buffer,
176
- contentBase64: buffer.toString("base64"),
203
+ contentBase64: buffer ? buffer.toString("base64") : null,
177
204
  contentType,
178
- filename: normalizedFilename || defaultFilename
205
+ filename: normalizedFilename || defaultFilename,
206
+ pathSource
179
207
  };
180
208
  }
181
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibm9ybWFsaXplLWlucHV0LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vc3JjL2RhdGFiYXNlL3JlY29yZC9hdHRhY2htZW50cy9ub3JtYWxpemUtaW5wdXQuanMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsWUFBWTtBQUVaLE9BQU8sWUFBWSxNQUFNLDREQUE0RCxDQUFBO0FBRXJGOzs7Ozs7OztHQVFHO0FBQ0g7Ozs7R0FJRztBQUNILFNBQVMsUUFBUSxDQUFDLEtBQUs7SUFDckIsTUFBTSx5QkFBeUIsR0FBRyxLQUFLLENBQUMsT0FBTyxDQUFDLFNBQVMsRUFBRSxFQUFFLENBQUMsQ0FBQTtJQUU5RCxJQUFJLENBQUMseUJBQXlCO1FBQUUsT0FBTyxFQUFFLENBQUE7SUFFekMsTUFBTSxVQUFVLEdBQUcseUJBQXlCLENBQUMsVUFBVSxDQUFDLElBQUksRUFBRSxHQUFHLENBQUMsQ0FBQTtJQUNsRSxNQUFNLEtBQUssR0FBRyxVQUFVLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFBO0lBRW5DLE9BQU8sS0FBSyxDQUFDLEtBQUssQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDLElBQUksRUFBRSxDQUFBO0FBQ3RDLENBQUM7QUFFRDs7OztHQUlHO0FBQ0gsU0FBUyxhQUFhLENBQUMsS0FBSztJQUMxQixJQUFJLENBQUMsS0FBSyxJQUFJLE9BQU8sS0FBSyxLQUFLLFFBQVEsSUFBSSxLQUFLLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQztRQUFFLE9BQU8sS0FBSyxDQUFBO0lBRTdFLE1BQU0sU0FBUyxHQUFHLE1BQU0sQ0FBQyxjQUFjLENBQUMsS0FBSyxDQUFDLENBQUE7SUFFOUMsT0FBTyxTQUFTLEtBQUssTUFBTSxDQUFDLFNBQVMsSUFBSSxTQUFTLEtBQUssSUFBSSxDQUFBO0FBQzdELENBQUM7QUFFRDs7OztHQUlHO0FBQ0gsU0FBUyxZQUFZLENBQUMsS0FBSztJQUN6QixPQUFPLEtBQUssWUFBWSxVQUFV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R0FBRyxDQUFDO1FBQzVFLENBQUMsQ0FBQyxRQUFRLENBQUMsUUFBUSxDQUFDO1FBQ3BCLENBQUMsQ0FBQyxFQUFFLENBQUE7SUFFTixPQUFPO1FBQ0wsUUFBUSxFQUFFLE1BQU0sQ0FBQyxNQUFNO1FBQ3ZCLGFBQWEsRUFBRSxNQUFNO1FBQ3JCLGFBQWEsRUFBRSxNQUFNLENBQUMsUUFBUSxDQUFDLFFBQVEsQ0FBQztRQUN4QyxXQUFXO1FBQ1gsUUFBUSxFQUFFLGtCQUFrQixJQUFJLGVBQWU7S0FDaEQsQ0FBQTtBQUNILENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvLyBAdHMtY2hlY2tcblxuaW1wb3J0IFVwbG9hZGVkRmlsZSBmcm9tIFwiLi4vLi4vLi4vaHR0cC1zZXJ2ZXIvY2xpZW50L3VwbG9hZGVkLWZpbGUvdXBsb2FkZWQtZmlsZS5qc1wiXG5cbi8qKlxuICogTm9ybWFsaXplZEF0dGFjaG1lbnRJbnB1dCB0eXBlLlxuICogQHR5cGVkZWYge29iamVjdH0gTm9ybWFsaXplZEF0dGFjaG1lbnRJbnB1dFxuICogQHByb3BlcnR5IHtudW1iZXJ9IGJ5dGVTaXplIC0gRmlsZSBzaXplIGluIGJ5dGVzLlxuICogQHByb3BlcnR5IHtCdWZmZXJ9IGNvbnRlbnRCdWZmZXIgLSBSYXcgY29udGVudCBieXRlcy5cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBjb250ZW50QmFzZTY0IC0gQmFzZTY0IGVuY29kZWQgY29udGVudC5cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nIHwgbnVsbH0gY29udGVudFR5cGUgLSBDb250ZW50IHR5cGUuXG4gKiBAcHJvcGVydHkge3N0cmluZ30gZmlsZW5hbWUgLSBGaWxlbmFtZS5cbiAqL1xuLyoqXG4gKiBSdW5zIGJhc2UgbmFtZS5cbiAqIEBwYXJhbSB7c3RyaW5nfSB2YWx1ZSAtIFBhdGgtbGlrZSB2YWx1ZS5cbiAqIEByZXR1cm5zIHtzdHJpbmd9IC0gQmFzZW5hbWUtbGlrZSBmaWxlbmFtZS5cbiAqL1xuZnVuY3Rpb24gYmFzZU5hbWUodmFsdWUpIHtcbiAgY29uc3Qgd2l0aG91dFRyYWlsaW5nU2VwYXJhdG9ycyA9IHZhbHVlLnJlcGxhY2UoL1tcXFxcL10rJC8sIFwiXCIpXG5cbiAgaWYgKCF3aXRob3V0VHJhaWxpbmdTZXBhcmF0b3JzKSByZXR1cm4gXCJcIlxuXG4gIGNvbnN0IG5vcm1hbGl6ZWQgPSB3aXRob3V0VHJhaWxpbmdTZXBhcmF0b3JzLnJlcGxhY2VBbGwoXCJcXFxcXCIsIFwiL1wiKVxuICBjb25zdCBwYXJ0cyA9IG5vcm1hbGl6ZWQuc3BsaXQoXCIvXCIpXG5cbiAgcmV0dXJuIHBhcnRzW3BhcnRzLmxlbmd0aCAtIDFdIHx8IFwiXCJcbn1cblxuLyoqXG4gKiBSdW5zIGlzIHBsYWluIG9iamVjdC5cbiAqIEBwYXJhbSB7P30gdmFsdWUgLSBDYW5kaWRhdGUgdmFsdWUuXG4gKiBAcmV0dXJucyB7dmFsdWUgaXMgUmVjb3JkPHN0cmluZywgPz59IC0gV2hldGhlciB2YWx1ZSBpcyBhIHBsYWluIG9iamVjdC5cbiAqL1xuZnVuY3Rpb24gaXNQbGFpbk9iamVjdCh2YWx1ZSkge1xuICBpZiAoIXZhbHVlIHx8IHR5cGVvZiB2YWx1ZSAhPT0gXCJvYmplY3RcIiB8fCBBcnJheS5pc0FycmF5KHZhbHVlKSkgcmV0dXJuIGZhbHNlXG5cbiAgY29uc3QgcHJvdG90eXBlID0gT2JqZWN0LmdldFByb3RvdHlwZU9mKHZhbHVlKVxuXG4gIHJldHVybiBwcm90b3R5cGUgPT09IE9iamVjdC5wcm90b3R5cGUgfHwgcHJvdG90eXBlID09PSBudWxsXG59XG5cbi8qKlxuICogUnVucyBpcyB1aW50OCBhcnJheS5cbiAqIEBwYXJhbSB7P30gdmFsdWUgLSBDYW5kaWRhdGUgdmFsdWUuXG4gKiBAcmV0dXJucyB7dmFsdWUgaXMgVWludDhBcnJheX0gLSBXaGV0aGVyIHZhbHVlIGlzIGEgYnl0ZSBhcnJheS5cbiAqL1xuZnVuY3Rpb24gaXNVaW50OEFycmF5KHZhbHVlKSB7XG4gIHJldHVybiB2YWx1ZSBpbnN0YW5jZW9mIFVpbnQ4QXJyYXlcbn1cblxuLyoqXG4gKiBSdW5zIGlzIGFycmF5IGJ1ZmZlci5cbiAqIEBwYXJhbSB7P30gdmFsdWUgLSBDYW5kaWRhdGUgdmFsdWUuXG4gKiBAcmV0dXJucyB7dmFsdWUgaXMgQXJyYXlCdWZmZXJ9IC0gV2hldGhlciB2YWx1ZSBpcyBhcnJheSBidWZmZXIuXG4gKi9cbmZ1bmN0aW9uIGlzQXJyYXlCdWZmZXIodmFsdWUpIHtcbiAgcmV0dXJuIHZhbHVlIGluc3RhbmNlb2YgQXJyYXlCdWZmZXJcbn1cblxuLyoqXG4gKiBSdW5zIGlzIGFycmF5IGJ1ZmZlciBsaWtlLlxuICogQHBhcmFtIHs/fSB2YWx1ZSAtIENhbmRpZGF0ZSB2YWx1ZS5cbiAqIEByZXR1cm5zIHt2YWx1ZSBpcyB7YXJyYXlCdWZmZXI6ICgpID0+IFByb21pc2U8QXJyYXlCdWZmZXI+fX0gLSBXaGV0aGVyIHZhbHVlIHN1cHBvcnRzIGFycmF5QnVmZmVyKCkuXG4gKi9cbmZ1bmN0aW9uIGlzQXJyYXlCdWZmZXJMaWtlKHZhbHVlKSB7XG4gIHJldHVybiBCb29sZWFuKHZhbHVlICYmIHR5cGVvZiB2YWx1ZSA9PT0gXCJvYmplY3RcIiAmJiB0eXBlb2YgLyoqIEB0eXBlIHs/fSAqLyAodmFsdWUpLmFycmF5QnVmZmVyID09PSBcImZ1bmN0aW9uXCIpXG59XG5cbi8qKlxuICogUnVucyB0byBidWZmZXIuXG4gKiBAcGFyYW0ge1VpbnQ4QXJyYXkgfCBCdWZmZXIgfCBBcnJheUJ1ZmZlciB8IHN0cmluZ30gdmFsdWUgLSBWYWx1ZS5cbiAqIEByZXR1cm5zIHtCdWZmZXJ9IC0gQnVmZmVyIHZhbHVlLlxuICovXG5mdW5jdGlvbiB0b0J1ZmZlcih2YWx1ZSkge1xuICBpZiAoQnVmZmVyLmlzQnVmZmVyKHZhbHVlKSkgcmV0dXJuIHZhbHVlXG4gIGlmICh0eXBlb2YgdmFsdWUgPT09IFwic3RyaW5nXCIpIHJldHVybiBCdWZmZXIuZnJvbSh2YWx1ZSlcbiAgaWYgKGlzQXJyYXlCdWZmZXIodmFsdWUpKSByZXR1cm4gQnVmZmVyLmZyb20odmFsdWUpXG4gIGlmIChpc1VpbnQ4QXJyYXkodmFsdWUpKSByZXR1cm4gQnVmZmVyLmZyb20odmFsdWUpXG5cbiAgdGhyb3cgbmV3IEVycm9yKFwiVW5zdXBwb3J0ZWQgYXR0YWNobWVudCBjb250ZW50IHR5cGVcIilcbn1cblxuLyoqXG4gKiBSdW5zIHVwbG9hZGVkIGZpbGUgYnVmZmVyLlxuICogQHBhcmFtIHtVcGxvYWRlZEZpbGV9IHVwbG9hZGVkRmlsZSAtIFVwbG9hZGVkIGZpbGUuXG4gKiBAcGFyYW0ge2ltcG9ydChcIi4uLy4uLy4uL2Vudmlyb25tZW50LWhhbmRsZXJzL2Jhc2UuanNcIikuZGVmYXVsdCB8IHVuZGVmaW5lZH0gZW52aXJvbm1lbnRIYW5kbGVyIC0gRW52aXJvbm1lbnQgaGFuZGxlci5cbiAqIEByZXR1cm5zIHtQcm9taXNlPEJ1ZmZlcj59IC0gRmlsZSBjb250ZW50IGJ1ZmZlci5cbiAqL1xuYXN5bmMgZnVuY3Rpb24gdXBsb2FkZWRGaWxlQnVmZmVyKHVwbG9hZGVkRmlsZSwgZW52aXJvbm1lbnRIYW5kbGVyKSB7XG4gIGNvbnN0IG1lbW9yeUJ1ZmZlciA9IC8qKiBAdHlwZSB7e2dldEJ1ZmZlcj86ICgpID0+IEJ1ZmZlcn19ICovICh1cGxvYWRlZEZpbGUpLmdldEJ1ZmZlcj8uKClcblxuICBpZiAoQnVmZmVyLmlzQnVmZmVyKG1lbW9yeUJ1ZmZlcikpIHJldHVybiBtZW1vcnlCdWZmZXJcblxuICBjb25zdCB0ZW1wUGF0aCA9IC8qKiBAdHlwZSB7e2dldFBhdGg/OiAoKSA9PiBzdHJpbmd9fSAqLyAodXBsb2FkZWRGaWxlKS5nZXRQYXRoPy4oKVxuXG4gIGlmICh0eXBlb2YgdGVtcFBhdGggPT09IFwic3RyaW5nXCIgJiYgdGVtcFBhdGgubGVuZ3RoID4gMCkge1xuICAgIGlmICghZW52aXJvbm1lbnRIYW5kbGVyIHx8IHR5cGVvZiBlbnZpcm9ubWVudEhhbmRsZXIucmVhZEF0dGFjaG1lbnRJbnB1dEZpbGUgIT09IFwiZnVuY3Rpb25cIikge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFwiQXR0YWNobWVudCB0ZW1wLXBhdGggaW5wdXQgaXMgdW5zdXBwb3J0ZWQgaW4gdGhpcyBlbnZpcm9ubWVudFwiKVxuICAgIH1cblxuICAgIHJldHVybiBhd2FpdCBlbnZpcm9ubWVudEhhbmRsZXIucmVhZEF0dGFjaG1lbnRJbnB1dEZpbGUodGVtcFBhdGgpXG4gIH1cblxuICB0aHJvdyBuZXcgRXJyb3IoXCJVbnN1cHBvcnRlZCB1cGxvYWRlZCBmaWxlIHR5cGVcIilcbn1cblxuLyoqXG4gKiBSdW5zIG5vcm1hbGl6ZSByZWNvcmQgYXR0YWNobWVudCBpbnB1dC5cbiAqIEBwYXJhbSB7P30gaW5wdXQgLSBBdHRhY2htZW50IGlucHV0LlxuICogQHBhcmFtIHtvYmplY3R9IFthcmdzXSAtIE9wdGlvbnMuXG4gKiBAcGFyYW0ge2Jvb2xlYW59IFthcmdzLmFsbG93UGF0aElucHV0XSAtIFdoZXRoZXIgYHtwYXRoOiAuLi59YCBpbnB1dCBpcyBhbGxvd2VkLlxuICogQHBhcmFtIHtzdHJpbmdbXX0gW2FyZ3MuYWxsb3dlZFBhdGhQcmVmaXhlc10gLSBPcHRpb25hbCBhbGxvd2xpc3QgZm9yIHBhdGggaW5wdXQuXG4gKiBAcGFyYW0ge3N0cmluZ30gW2FyZ3MuZGVmYXVsdEZpbGVuYW1lXSAtIE9wdGlvbmFsIGRlZmF1bHQgZmlsZW5hbWUuXG4gKiBAcGFyYW0ge2ltcG9ydChcIi4uLy4uLy4uL2Vudmlyb25tZW50LWhhbmRsZXJzL2Jhc2UuanNcIikuZGVmYXVsdH0gW2FyZ3MuZW52aXJvbm1lbnRIYW5kbGVyXSAtIE9wdGlvbmFsIGVudmlyb25tZW50IGhhbmRsZXIgZm9yIE5vZGUtb25seSBmaWxlIG9wZXJhdGlvbnMuXG4gKiBAcmV0dXJucyB7UHJvbWlzZTxOb3JtYWxpemVkQXR0YWNobWVudElucHV0Pn0gLSBOb3JtYWxpemVkIGF0dGFjaG1lbnQgaW5wdXQuXG4gKi9cbmV4cG9ydCBkZWZhdWx0IGFzeW5jIGZ1bmN0aW9uIG5vcm1hbGl6ZVJlY29yZEF0dGFjaG1lbnRJbnB1dChpbnB1dCwgYXJncyA9IHt9KSB7XG4gIGNvbnN0IGRlZmF1bHRGaWxlbmFtZSA9IGFyZ3MuZGVmYXVsdEZpbGVuYW1lIHx8IFwiYXR0YWNobWVudC5iaW5cIlxuICBjb25zdCBlbnZpcm9ubWVudEhhbmRsZXIgPSBhcmdzLmVudmlyb25tZW50SGFuZGxlclxuICAvKipcbiAgICogRGVmaW5lcyBidWZmZXIuXG4gICAqIEB0eXBlIHtCdWZmZXJ9ICovXG4gIGxldCBidWZmZXJcbiAgLyoqXG4gICAqIENvbnRlbnQgdHlwZS5cbiAgICogQHR5cGUge3N0cmluZyB8IG51bGx9ICovXG4gIGxldCBjb250ZW50VHlwZSA9IG51bGxcbiAgLyoqXG4gICAqIERlZmluZXMgZmlsZW5hbWUuXG4gICAqIEB0eXBlIHtzdHJpbmcgfCB1bmRlZmluZWR9ICovXG4gIGxldCBmaWxlbmFtZVxuXG4gIGlmIChpbnB1dCBpbnN0YW5jZW9mIFVwbG9hZGVkRmlsZSkge1xuICAgIGJ1ZmZlciA9IGF3YWl0IHVwbG9hZGVkRmlsZUJ1ZmZlcihpbnB1dCwgZW52aXJvbm1lbnRIYW5kbGVyKVxuICAgIGZpbGVuYW1lID0gaW5wdXQuZmlsZW5hbWUoKVxuICAgIGNvbnRlbnRUeXBlID0gaW5wdXQuY29udGVudFR5cGUoKSB8fCBudWxsXG4gIH0gZWxzZSBpZiAoaXNQbGFpbk9iamVjdChpbnB1dCkgJiYgdHlwZW9mIGlucHV0LnBhdGggPT09IFwic3RyaW5nXCIgJiYgaW5wdXQucGF0aC5sZW5ndGggPiAwKSB7XG4gICAgaWYgKGFyZ3MuYWxsb3dQYXRoSW5wdXQgIT09IHRydWUpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcIkF0dGFjaG1lbnQgcGF0aCBpbnB1dCBpcyBkaXNhYmxlZFwiKVxuICAgIH1cblxuICAgIGlmICghZW52aXJvbm1lbnRIYW5kbGVyIHx8IHR5cGVvZiBlbnZpcm9ubWVudEhhbmRsZXIucmVzb2x2ZUF0dGFjaG1lbnRJbnB1dFBhdGggIT09IFwiZnVuY3Rpb25cIikge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFwiQXR0YWNobWVudCBwYXRoIGlucHV0IGlzIHVuc3VwcG9ydGVkIGluIHRoaXMgZW52aXJvbm1lbnRcIilcbiAgICB9XG5cbiAgICBjb25zdCBhbGxvd2VkUGF0aFByZWZpeGVzID0gQXJyYXkuaXNBcnJheShhcmdzLmFsbG93ZWRQYXRoUHJlZml4ZXMpXG4gICAgICA/IGFyZ3MuYWxsb3dlZFBhdGhQcmVmaXhlcy5maWx0ZXIoKGVudHJ5KSA9PiB0eXBlb2YgZW50cnkgPT09IFwic3RyaW5nXCIgJiYgZW50cnkubGVuZ3RoID4gMClcbiAgICAgIDogW11cbiAgICBjb25zdCB7YnVmZmVyOiBmaWxlQnVmZmVyLCBmaWxlUGF0aH0gPSBhd2FpdCBlbnZpcm9ubWVudEhhbmRsZXIucmVzb2x2ZUF0dGFjaG1lbnRJbnB1dFBhdGgoe1xuICAgICAgYWxsb3dlZFBhdGhQcmVmaXhlcyxcbiAgICAgIGlucHV0UGF0aDogaW5wdXQucGF0aFxuICAgIH0pXG5cbiAgICBidWZmZXIgPSBmaWxlQnVmZmVyXG4gICAgZmlsZW5hbWUgPSB0eXBlb2YgaW5wdXQuZmlsZW5hbWUgPT09IFwic3RyaW5nXCIgJiYgaW5wdXQuZmlsZW5hbWUubGVuZ3RoID4gMCA/IGlucHV0LmZpbGVuYW1lIDogYmFzZU5hbWUoZmlsZVBhdGgpXG4gICAgY29udGVudFR5cGUgPSB0eXBlb2YgaW5wdXQuY29udGVudFR5cGUgPT09IFwic3RyaW5nXCIgJiYgaW5wdXQuY29udGVudFR5cGUubGVuZ3RoID4gMCA/IGlucHV0LmNvbnRlbnRUeXBlIDogbnVsbFxuICB9IGVsc2UgaWYgKGlzUGxhaW5PYmplY3QoaW5wdXQpICYmIHR5cGVvZiBpbnB1dC5jb250ZW50QmFzZTY0ID09PSBcInN0cmluZ1wiKSB7XG4gICAgYnVmZmVyID0gQnVmZmVyLmZyb20oaW5wdXQuY29udGVudEJhc2U2NCwgXCJiYXNlNjRcIilcbiAgICBmaWxlbmFtZSA9IHR5cGVvZiBpbnB1dC5maWxlbmFtZSA9PT0gXCJzdHJpbmdcIiAmJiBpbnB1dC5maWxlbmFtZS5sZW5ndGggPiAwID8gaW5wdXQuZmlsZW5hbWUgOiBkZWZhdWx0RmlsZW5hbWVcbiAgICBjb250ZW50VHlwZSA9IHR5cGVvZiBpbnB1dC5jb250ZW50VHlwZSA9PT0gXCJzdHJpbmdcIiAmJiBpbnB1dC5jb250ZW50VHlwZS5sZW5ndGggPiAwID8gaW5wdXQuY29udGVudFR5cGUgOiBudWxsXG4gIH0gZWxzZSBpZiAoaXNQbGFpbk9iamVjdChpbnB1dCkgJiYgXCJjb250ZW50XCIgaW4gaW5wdXQpIHtcbiAgICBidWZmZXIgPSB0b0J1ZmZlcihpbnB1dC5jb250ZW50KVxuICAgIGZpbGVuYW1lID0gdHlwZW9mIGlucHV0LmZpbGVuYW1lID09PSBcInN0cmluZ1wiICYmIGlucHV0LmZpbGVuYW1lLmxlbmd0aCA+IDAgPyBpbnB1dC5maWxlbmFtZSA6IGRlZmF1bHRGaWxlbmFtZVxuICAgIGNvbnRlbnRUeXBlID0gdHlwZW9mIGlucHV0LmNvbnRlbnRUeXBlID09PSBcInN0cmluZ1wiICYmIGlucHV0LmNvbnRlbnRUeXBlLmxlbmd0aCA+IDAgPyBpbnB1dC5jb250ZW50VHlwZSA6IG51bGxcbiAgfSBlbHNlIGlmIChpc0FycmF5QnVmZmVyTGlrZShpbnB1dCkpIHtcbiAgICBjb25zdCBhcnJheUJ1ZmZlciA9IGF3YWl0IGlucHV0LmFycmF5QnVmZmVyKClcblxuICAgIGJ1ZmZlciA9IEJ1ZmZlci5mcm9tKGFycmF5QnVmZmVyKVxuICAgIGZpbGVuYW1lID0gdHlwZW9mIC8qKiBAdHlwZSB7P30gKi8gKGlucHV0KS5uYW1lID09PSBcInN0cmluZ1wiICYmIC8qKiBAdHlwZSB7P30gKi8gKGlucHV0KS5uYW1lLmxlbmd0aCA+IDBcbiAgICAgID8gLyoqIEB0eXBlIHs/fSAqLyAoaW5wdXQpLm5hbWVcbiAgICAgIDogZGVmYXVsdEZpbGVuYW1lXG4gICAgY29udGVudFR5cGUgPSB0eXBlb2YgLyoqIEB0eXBlIHs/fSAqLyAoaW5wdXQpLnR5cGUgPT09IFwic3RyaW5nXCIgJiYgLyoqIEB0eXBlIHs/fSAqLyAoaW5wdXQpLnR5cGUubGVuZ3RoID4gMFxuICAgICAgPyAvKiogQHR5cGUgez99ICovIChpbnB1dCkudHlwZVxuICAgICAgOiBudWxsXG4gIH0gZWxzZSBpZiAodHlwZW9mIGlucHV0ID09PSBcInN0cmluZ1wiIHx8IEJ1ZmZlci5pc0J1ZmZlcihpbnB1dCkgfHwgaXNBcnJheUJ1ZmZlcihpbnB1dCkgfHwgaXNVaW50OEFycmF5KGlucHV0KSkge1xuICAgIGJ1ZmZlciA9IHRvQnVmZmVyKGlucHV0KVxuICAgIGZpbGVuYW1lID0gZGVmYXVsdEZpbGVuYW1lXG4gIH0gZWxzZSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKFwiVW5zdXBwb3J0ZWQgYXR0YWNobWVudCBpbnB1dFwiKVxuICB9XG5cbiAgY29uc3Qgbm9ybWFsaXplZEZpbGVuYW1lID0gdHlwZW9mIGZpbGVuYW1lID09PSBcInN0cmluZ1wiICYmIGZpbGVuYW1lLmxlbmd0aCA+IDBcbiAgICA/IGJhc2VOYW1lKGZpbGVuYW1lKVxuICAgIDogXCJcIlxuXG4gIHJldHVybiB7XG4gICAgYnl0ZVNpemU6IGJ1ZmZlci5sZW5ndGgsXG4gICAgY29udGVudEJ1ZmZlcjogYnVmZmVyLFxuICAgIGNvbnRlbnRCYXNlNjQ6IGJ1ZmZlci50b1N0cmluZyhcImJhc2U2NFwiKSxcbiAgICBjb250ZW50VHlwZSxcbiAgICBmaWxlbmFtZTogbm9ybWFsaXplZEZpbGVuYW1lIHx8IGRlZmF1bHRGaWxlbmFtZVxuICB9XG59XG4iXX0=
209
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibm9ybWFsaXplLWlucHV0LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vc3JjL2RhdGFiYXNlL3JlY29yZC9hdHRhY2htZW50cy9ub3JtYWxpemUtaW5wdXQuanMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsWUFBWTtBQUVaLE9BQU8sWUFBWSxNQUFNLDREQUE0RCxDQUFBO0FBRXJGOzs7Ozs7OztHQVFHO0FBQ0g7Ozs7Ozs7OztHQVNHO0FBQ0g7Ozs7R0FJRztBQUNILFNBQVMsUUFBUSxDQUFDLEtBQUs7SUFDckIsTUFBTSx5QkFBeUIsR0FBRyxLQUFLLENBQUMsT0FBTyxDQUFDLFNBQVMsRUFBRSxFQUFFLENBQUMsQ0FBQTtJQUU5RCxJQUFJLENBQUMseUJBQXlCO1FBQUUsT0FBTyxFQUFFLENBQUE7SUFFekMsTUFBTSxVQUFVLEdBQUcseUJBQXlCLENBQUMsVUFBVSxDQUFDLElBQUksRUFBRSxHQUFHLENBQUMsQ0FBQTtJQUNsRSxNQUFNLEtBQUssR0FBRyxVQUFVLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFBO0lBRW5DLE9BQU8sS0FBSyxDQUFDLEtBQUssQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDLElBQUksRUFBRSxDQUFBO0FBQ3RDLENBQUM7QUFFRDs7OztHQUlHO0FBQ0gsU0FBUyxhQUFhLENBQUMsS0FBSztJQUMxQixJQUFJLENBQUMsS0FBSyxJQUFJLE9BQU8sS0FBSyxLQUFLLFFBQVEsSUFBSSxLQUFLLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQztRQUFFLE9BQU8sS0FBSyxDQUFBO0lBRTdFLE1BQU0sU0FBUyxHQUFHLE1BQU0sQ0FBQyxjQUFjLENBQUMsS0FBSyxDQUFDLENBQUE7SUFFOUMsT0FBTyxTQUFTLEtBQUssTUFBTSxDQUFDLFNBQVMsSUFBSSxTQUFTLEtBQUssSUFBSSxDQUFBO0FBQzdELENBQUM7QUFFRDs7OztHQUlHO0FBQ0gsU0FBUyxZQUFZLENBQUMsS0FBSztJQUN6QixP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LElBQUksS0FBSyxDQUFDLDhCQUE4QixDQUFDLENBQUE7SUFDakQsQ0FBQztJQUVELE1BQU0sa0JBQWtCLEdBQUcsT0FBTyxRQUFRLEtBQUssUUFBUSxJQUFJLFFBQVEsQ0FBQyxNQUFNLEdBQUcsQ0FBQztRQUM1RSxDQUFDLENBQUMsUUFBUSxDQUFDLFFBQVEsQ0FBQztRQUNwQixDQUFDLENBQUMsRUFBRSxDQUFBO0lBRU4sSUFBSSxDQUFDLE1BQU0sSUFBSSxDQUFDLFVBQVUsRUFBRSxDQUFDO1FBQzNCLE1BQU0sSUFBSSxLQUFLLENBQUMsb0RBQW9ELENBQUMsQ0FBQTtJQUN2RSxDQUFDO0lBRUQsSUFBSSxNQUFNO1FBQUUsUUFBUSxHQUFHLE1BQU0sQ0FBQyxNQUFNLENBQUE7SUFDcEMsSUFBSSxRQUFRLEtBQUssSUFBSTtRQUFFLE1BQU0sSUFBSSxLQUFLLENBQUMsc0RBQXNELENBQUMsQ0FBQTtJQUU5RixPQUFPO1FBQ0wsUUFBUTtRQUNSLGFBQWEsRUFBRSxNQUFNO1FBQ3JCLGFBQWEsRUFBRSxNQUFNLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUk7UUFDeEQsV0FBVztRQUNYLFFBQVEsRUFBRSxrQkFBa0IsSUFBSSxlQUFlO1FBQy9DLFVBQVU7S0FDWCxDQUFBO0FBQ0gsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8vIEB0cy1jaGVja1xuXG5pbXBvcnQgVXBsb2FkZWRGaWxlIGZyb20gXCIuLi8uLi8uLi9odHRwLXNlcnZlci9jbGllbnQvdXBsb2FkZWQtZmlsZS91cGxvYWRlZC1maWxlLmpzXCJcblxuLyoqXG4gKiBBdHRhY2htZW50UGF0aFNvdXJjZSB0eXBlLlxuICogQHR5cGVkZWYge29iamVjdH0gQXR0YWNobWVudFBhdGhTb3VyY2VcbiAqIEBwcm9wZXJ0eSB7bnVtYmVyfSBieXRlU2l6ZSAtIE9wZW5lZCBmaWxlIHNuYXBzaG90IHNpemUuXG4gKiBAcHJvcGVydHkge3N0cmluZ30gZmlsZVBhdGggLSBWYWxpZGF0ZWQgc291cmNlIHBhdGggZm9yIG1ldGFkYXRhIG9ubHkuXG4gKiBAcHJvcGVydHkgeygpID0+IFByb21pc2U8aW1wb3J0KFwibm9kZTpzdHJlYW1cIikuUmVhZGFibGU+fSBjcmVhdGVSZWFkU3RyZWFtIC0gQ3JlYXRlcyBhIGJvdW5kZWQgc25hcHNob3Qgc3RyZWFtLlxuICogQHByb3BlcnR5IHsoKSA9PiBQcm9taXNlPEJ1ZmZlcj59IHJlYWRCdWZmZXIgLSBSZWFkcyBzbmFwc2hvdCBieXRlcyBmb3IgY29tcGF0aWJpbGl0eSBjYWxsZXJzLlxuICogQHByb3BlcnR5IHsoKSA9PiBQcm9taXNlPHZvaWQ+fSBjbG9zZSAtIENsb3NlcyB0aGUgb3duZWQgc291cmNlLlxuICovXG4vKipcbiAqIE5vcm1hbGl6ZWRBdHRhY2htZW50SW5wdXQgdHlwZS5cbiAqIEB0eXBlZGVmIHtvYmplY3R9IE5vcm1hbGl6ZWRBdHRhY2htZW50SW5wdXRcbiAqIEBwcm9wZXJ0eSB7bnVtYmVyfSBieXRlU2l6ZSAtIEZpbGUgc2l6ZSBpbiBieXRlcy5cbiAqIEBwcm9wZXJ0eSB7QnVmZmVyIHwgbnVsbH0gY29udGVudEJ1ZmZlciAtIFJhdyBpbi1tZW1vcnkgY29udGVudCBieXRlcy5cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nIHwgbnVsbH0gY29udGVudEJhc2U2NCAtIEJhc2U2NCBlbmNvZGVkIGluLW1lbW9yeSBjb250ZW50LlxuICogQHByb3BlcnR5IHtzdHJpbmcgfCBudWxsfSBjb250ZW50VHlwZSAtIENvbnRlbnQgdHlwZS5cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBmaWxlbmFtZSAtIEZpbGVuYW1lLlxuICogQHByb3BlcnR5IHtBdHRhY2htZW50UGF0aFNvdXJjZSB8IG51bGx9IHBhdGhTb3VyY2UgLSBFbnZpcm9ubWVudC1vd25lZCBvcGVuZWQgcGF0aCBzb3VyY2UuXG4gKi9cbi8qKlxuICogUnVucyBiYXNlIG5hbWUuXG4gKiBAcGFyYW0ge3N0cmluZ30gdmFsdWUgLSBQYXRoLWxpa2UgdmFsdWUuXG4gKiBAcmV0dXJucyB7c3RyaW5nfSAtIEJhc2VuYW1lLWxpa2UgZmlsZW5hbWUuXG4gKi9cbmZ1bmN0aW9uIGJhc2VOYW1lKHZhbHVlKSB7XG4gIGNvbnN0IHdpdGhvdXRUcmFpbGluZ1NlcGFyYXRvcnMgPSB2YWx1ZS5yZXBsYWNlKC9bXFxcXC9dKyQvLCBcIlwiKVxuXG4gIGlmICghd2l0aG91dFRyYWlsaW5nU2VwYXJhdG9ycykgcmV0dXJuIFwiXCJcblxuICBjb25zdCBub3JtYWxpemVkID0gd2l0aG91dFRyYWlsaW5nU2VwYXJhdG9ycy5yZXBsYWNlQWxsKFwiXFxcXFwiLCBcIi9cIilcbiAgY29uc3QgcGFydHMgPSBub3JtYWxpemVkLnNwbGl0KFwiL1wiKVxuXG4gIHJldHVybiBwYXJ0c1twYXJ0cy5sZW5ndGggLSAxXSB8fCBcIlwiXG59XG5cbi8qKlxuICogUnVucyBpcyBwbGFpbiBvYmplY3QuXG4gKiBAcGFyYW0gez99IHZhbHVlIC0gQ2FuZGlkYXRlIHZhbHVlLlxuICogQHJldHVybnMge3ZhbHVlIGlzIFJlY29yZDxzdHJpbmcsID8+fSAtIFdoZXRoZXIgdmFsdWUgaXMgYSBwbGFpbiBvYmplY3QuXG4gKi9cbmZ1bmN0aW9uIGlzUGxhaW5PYmplY3QodmFsdWUpIHtcbiAgaWYgKCF2YWx1ZSB8fCB0eXBlb2YgdmFsdWUgIT09IFwib2JqZWN0XCIgfHwgQXJyYXkuaXNBcnJheSh2YWx1ZSkpIHJldHVybiBmYWxzZVxuXG4gIGNvbnN0IHByb3RvdHlwZSA9IE9iamVjdC5nZXRQcm90b3R5cGVPZih2YWx1ZSlcblxuICByZXR1cm4gcHJvdG90eXBlID09PSBPYmplY3QucHJvdG90eXBlIHx8IHByb3RvdHlwZSA9PT0gbnVsbFxufVxuXG4vKipcbiAqIFJ1bnMgaXMgdWludDggYXJyYXkuXG4gKiBAcGFyYW0gez99IHZhbHVlIC0gQ2FuZGlkYXRlIHZhbHVlLlxuICogQHJldHVybnMge3ZhbHVlIGlzIFVpbnQ4QXJyYXl9IC0gV2hldGhlciB2YWx1ZSBpcyBhIGJ5dGUgYXJyYXkuXG4gKi9cbmZ1bmN0aW9uIGlzVWludDhBcnJheSh2YWx1ZSkge1xuICByZXR1cm4gdmFsdWUgaW5zdGFuY2VvZiBVaW50OEFycmF5XG59XG5cbi8qKlxuICogUnVucyBpcyBhcnJheSBidWZmZXIuXG4gKiBAcGFyYW0gez99IHZhbHVlIC0gQ2FuZGlkYXRlIHZhbHVlLlxuICogQHJldHVybnMge3ZhbHVlIGlzIEFycmF5QnVmZmVyfSAtIFdoZXRoZXIgdmFsdWUgaXMgYXJyYXkgYnVmZmVyLlxuICovXG5mdW5jdGlvbiBpc0FycmF5QnVmZmVyKHZhbHVlKSB7XG4gIHJldHVybiB2YWx1ZSBpbnN0YW5jZW9mIEFycmF5QnVmZmVyXG59XG5cbi8qKlxuICogUnVucyBpcyBhcnJheSBidWZmZXIgbGlrZS5cbiAqIEBwYXJhbSB7P30gdmFsdWUgLSBDYW5kaWRhdGUgdmFsdWUuXG4gKiBAcmV0dXJucyB7dmFsdWUgaXMge2FycmF5QnVmZmVyOiAoKSA9PiBQcm9taXNlPEFycmF5QnVmZmVyPn19IC0gV2hldGhlciB2YWx1ZSBzdXBwb3J0cyBhcnJheUJ1ZmZlcigpLlxuICovXG5mdW5jdGlvbiBpc0FycmF5QnVmZmVyTGlrZSh2YWx1ZSkge1xuICByZXR1cm4gQm9vbGVhbih2YWx1ZSAmJiB0eXBlb2YgdmFsdWUgPT09IFwib2JqZWN0XCIgJiYgdHlwZW9mIC8qKiBAdHlwZSB7P30gKi8gKHZhbHVlKS5hcnJheUJ1ZmZlciA9PT0gXCJmdW5jdGlvblwiKVxufVxuXG4vKipcbiAqIFJ1bnMgdG8gYnVmZmVyLlxuICogQHBhcmFtIHtVaW50OEFycmF5IHwgQnVmZmVyIHwgQXJyYXlCdWZmZXIgfCBzdHJpbmd9IHZhbHVlIC0gVmFsdWUuXG4gKiBAcmV0dXJucyB7QnVmZmVyfSAtIEJ1ZmZlciB2YWx1ZS5cbiAqL1xuZnVuY3Rpb24gdG9CdWZmZXIodmFsdWUpIHtcbiAgaWYgKEJ1ZmZlci5pc0J1ZmZlcih2YWx1ZSkpIHJldHVybiB2YWx1ZVxuICBpZiAodHlwZW9mIHZhbHVlID09PSBcInN0cmluZ1wiKSByZXR1cm4gQnVmZmVyLmZyb20odmFsdWUpXG4gIGlmIChpc0FycmF5QnVmZmVyKHZhbHVlKSkgcmV0dXJuIEJ1ZmZlci5mcm9tKHZhbHVlKVxuICBpZiAoaXNVaW50OEFycmF5KHZhbHVlKSkgcmV0dXJuIEJ1ZmZlci5mcm9tKHZhbHVlKVxuXG4gIHRocm93IG5ldyBFcnJvcihcIlVuc3VwcG9ydGVkIGF0dGFjaG1lbnQgY29udGVudCB0eXBlXCIpXG59XG5cbi8qKlxuICogUnVucyB1cGxvYWRlZCBmaWxlIGJ1ZmZlci5cbiAqIEBwYXJhbSB7VXBsb2FkZWRGaWxlfSB1cGxvYWRlZEZpbGUgLSBVcGxvYWRlZCBmaWxlLlxuICogQHBhcmFtIHtpbXBvcnQoXCIuLi8uLi8uLi9lbnZpcm9ubWVudC1oYW5kbGVycy9iYXNlLmpzXCIpLmRlZmF1bHQgfCB1bmRlZmluZWR9IGVudmlyb25tZW50SGFuZGxlciAtIEVudmlyb25tZW50IGhhbmRsZXIuXG4gKiBAcmV0dXJucyB7UHJvbWlzZTxCdWZmZXI+fSAtIEZpbGUgY29udGVudCBidWZmZXIuXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIHVwbG9hZGVkRmlsZUJ1ZmZlcih1cGxvYWRlZEZpbGUsIGVudmlyb25tZW50SGFuZGxlcikge1xuICBjb25zdCBtZW1vcnlCdWZmZXIgPSAvKiogQHR5cGUge3tnZXRCdWZmZXI/OiAoKSA9PiBCdWZmZXJ9fSAqLyAodXBsb2FkZWRGaWxlKS5nZXRCdWZmZXI/LigpXG5cbiAgaWYgKEJ1ZmZlci5pc0J1ZmZlcihtZW1vcnlCdWZmZXIpKSByZXR1cm4gbWVtb3J5QnVmZmVyXG5cbiAgY29uc3QgdGVtcFBhdGggPSAvKiogQHR5cGUge3tnZXRQYXRoPzogKCkgPT4gc3RyaW5nfX0gKi8gKHVwbG9hZGVkRmlsZSkuZ2V0UGF0aD8uKClcblxuICBpZiAodHlwZW9mIHRlbXBQYXRoID09PSBcInN0cmluZ1wiICYmIHRlbXBQYXRoLmxlbmd0aCA+IDApIHtcbiAgICBpZiAoIWVudmlyb25tZW50SGFuZGxlciB8fCB0eXBlb2YgZW52aXJvbm1lbnRIYW5kbGVyLnJlYWRBdHRhY2htZW50SW5wdXRGaWxlICE9PSBcImZ1bmN0aW9uXCIpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcIkF0dGFjaG1lbnQgdGVtcC1wYXRoIGlucHV0IGlzIHVuc3VwcG9ydGVkIGluIHRoaXMgZW52aXJvbm1lbnRcIilcbiAgICB9XG5cbiAgICByZXR1cm4gYXdhaXQgZW52aXJvbm1lbnRIYW5kbGVyLnJlYWRBdHRhY2htZW50SW5wdXRGaWxlKHRlbXBQYXRoKVxuICB9XG5cbiAgdGhyb3cgbmV3IEVycm9yKFwiVW5zdXBwb3J0ZWQgdXBsb2FkZWQgZmlsZSB0eXBlXCIpXG59XG5cbi8qKlxuICogUnVucyBub3JtYWxpemUgcmVjb3JkIGF0dGFjaG1lbnQgaW5wdXQuXG4gKiBAcGFyYW0gez99IGlucHV0IC0gQXR0YWNobWVudCBpbnB1dC5cbiAqIEBwYXJhbSB7b2JqZWN0fSBbYXJnc10gLSBPcHRpb25zLlxuICogQHBhcmFtIHtib29sZWFufSBbYXJncy5hbGxvd1BhdGhJbnB1dF0gLSBXaGV0aGVyIGB7cGF0aDogLi4ufWAgaW5wdXQgaXMgYWxsb3dlZC5cbiAqIEBwYXJhbSB7c3RyaW5nW119IFthcmdzLmFsbG93ZWRQYXRoUHJlZml4ZXNdIC0gT3B0aW9uYWwgYWxsb3dsaXN0IGZvciBwYXRoIGlucHV0LlxuICogQHBhcmFtIHtzdHJpbmd9IFthcmdzLmRlZmF1bHRGaWxlbmFtZV0gLSBPcHRpb25hbCBkZWZhdWx0IGZpbGVuYW1lLlxuICogQHBhcmFtIHtpbXBvcnQoXCIuLi8uLi8uLi9lbnZpcm9ubWVudC1oYW5kbGVycy9iYXNlLmpzXCIpLmRlZmF1bHR9IFthcmdzLmVudmlyb25tZW50SGFuZGxlcl0gLSBPcHRpb25hbCBlbnZpcm9ubWVudCBoYW5kbGVyIGZvciBOb2RlLW9ubHkgZmlsZSBvcGVyYXRpb25zLlxuICogQHJldHVybnMge1Byb21pc2U8Tm9ybWFsaXplZEF0dGFjaG1lbnRJbnB1dD59IC0gTm9ybWFsaXplZCBhdHRhY2htZW50IGlucHV0LlxuICovXG5leHBvcnQgZGVmYXVsdCBhc3luYyBmdW5jdGlvbiBub3JtYWxpemVSZWNvcmRBdHRhY2htZW50SW5wdXQoaW5wdXQsIGFyZ3MgPSB7fSkge1xuICBjb25zdCBkZWZhdWx0RmlsZW5hbWUgPSBhcmdzLmRlZmF1bHRGaWxlbmFtZSB8fCBcImF0dGFjaG1lbnQuYmluXCJcbiAgY29uc3QgZW52aXJvbm1lbnRIYW5kbGVyID0gYXJncy5lbnZpcm9ubWVudEhhbmRsZXJcbiAgLyoqXG4gICAqIERlZmluZXMgYnVmZmVyLlxuICAgKiBAdHlwZSB7QnVmZmVyIHwgbnVsbH0gKi9cbiAgbGV0IGJ1ZmZlciA9IG51bGxcbiAgLyoqXG4gICAqIERlZmluZXMgYnl0ZSBzaXplLlxuICAgKiBAdHlwZSB7bnVtYmVyIHwgbnVsbH0gKi9cbiAgbGV0IGJ5dGVTaXplID0gbnVsbFxuICAvKipcbiAgICogRGVmaW5lcyBwYXRoIHNvdXJjZS5cbiAgICogQHR5cGUge0F0dGFjaG1lbnRQYXRoU291cmNlIHwgbnVsbH0gKi9cbiAgbGV0IHBhdGhTb3VyY2UgPSBudWxsXG4gIC8qKlxuICAgKiBDb250ZW50IHR5cGUuXG4gICAqIEB0eXBlIHtzdHJpbmcgfCBudWxsfSAqL1xuICBsZXQgY29udGVudFR5cGUgPSBudWxsXG4gIC8qKlxuICAgKiBEZWZpbmVzIGZpbGVuYW1lLlxuICAgKiBAdHlwZSB7c3RyaW5nIHwgdW5kZWZpbmVkfSAqL1xuICBsZXQgZmlsZW5hbWVcblxuICBpZiAoaW5wdXQgaW5zdGFuY2VvZiBVcGxvYWRlZEZpbGUpIHtcbiAgICBidWZmZXIgPSBhd2FpdCB1cGxvYWRlZEZpbGVCdWZmZXIoaW5wdXQsIGVudmlyb25tZW50SGFuZGxlcilcbiAgICBmaWxlbmFtZSA9IGlucHV0LmZpbGVuYW1lKClcbiAgICBjb250ZW50VHlwZSA9IGlucHV0LmNvbnRlbnRUeXBlKCkgfHwgbnVsbFxuICB9IGVsc2UgaWYgKGlzUGxhaW5PYmplY3QoaW5wdXQpICYmIHR5cGVvZiBpbnB1dC5wYXRoID09PSBcInN0cmluZ1wiICYmIGlucHV0LnBhdGgubGVuZ3RoID4gMCkge1xuICAgIGlmIChhcmdzLmFsbG93UGF0aElucHV0ICE9PSB0cnVlKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXCJBdHRhY2htZW50IHBhdGggaW5wdXQgaXMgZGlzYWJsZWRcIilcbiAgICB9XG5cbiAgICBpZiAoIWVudmlyb25tZW50SGFuZGxlciB8fCB0eXBlb2YgZW52aXJvbm1lbnRIYW5kbGVyLnJlc29sdmVBdHRhY2htZW50SW5wdXRQYXRoICE9PSBcImZ1bmN0aW9uXCIpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcIkF0dGFjaG1lbnQgcGF0aCBpbnB1dCBpcyB1bnN1cHBvcnRlZCBpbiB0aGlzIGVudmlyb25tZW50XCIpXG4gICAgfVxuXG4gICAgY29uc3QgYWxsb3dlZFBhdGhQcmVmaXhlcyA9IEFycmF5LmlzQXJyYXkoYXJncy5hbGxvd2VkUGF0aFByZWZpeGVzKVxuICAgICAgPyBhcmdzLmFsbG93ZWRQYXRoUHJlZml4ZXMuZmlsdGVyKChlbnRyeSkgPT4gdHlwZW9mIGVudHJ5ID09PSBcInN0cmluZ1wiICYmIGVudHJ5Lmxlbmd0aCA+IDApXG4gICAgICA6IFtdXG4gICAgcGF0aFNvdXJjZSA9IGF3YWl0IGVudmlyb25tZW50SGFuZGxlci5yZXNvbHZlQXR0YWNobWVudElucHV0UGF0aCh7XG4gICAgICBhbGxvd2VkUGF0aFByZWZpeGVzLFxuICAgICAgaW5wdXRQYXRoOiBpbnB1dC5wYXRoXG4gICAgfSlcblxuICAgIGJ5dGVTaXplID0gcGF0aFNvdXJjZS5ieXRlU2l6ZVxuICAgIGZpbGVuYW1lID0gdHlwZW9mIGlucHV0LmZpbGVuYW1lID09PSBcInN0cmluZ1wiICYmIGlucHV0LmZpbGVuYW1lLmxlbmd0aCA+IDBcbiAgICAgID8gaW5wdXQuZmlsZW5hbWVcbiAgICAgIDogYmFzZU5hbWUocGF0aFNvdXJjZS5maWxlUGF0aClcbiAgICBjb250ZW50VHlwZSA9IHR5cGVvZiBpbnB1dC5jb250ZW50VHlwZSA9PT0gXCJzdHJpbmdcIiAmJiBpbnB1dC5jb250ZW50VHlwZS5sZW5ndGggPiAwID8gaW5wdXQuY29udGVudFR5cGUgOiBudWxsXG4gIH0gZWxzZSBpZiAoaXNQbGFpbk9iamVjdChpbnB1dCkgJiYgdHlwZW9mIGlucHV0LmNvbnRlbnRCYXNlNjQgPT09IFwic3RyaW5nXCIpIHtcbiAgICBidWZmZXIgPSBCdWZmZXIuZnJvbShpbnB1dC5jb250ZW50QmFzZTY0LCBcImJhc2U2NFwiKVxuICAgIGZpbGVuYW1lID0gdHlwZW9mIGlucHV0LmZpbGVuYW1lID09PSBcInN0cmluZ1wiICYmIGlucHV0LmZpbGVuYW1lLmxlbmd0aCA+IDAgPyBpbnB1dC5maWxlbmFtZSA6IGRlZmF1bHRGaWxlbmFtZVxuICAgIGNvbnRlbnRUeXBlID0gdHlwZW9mIGlucHV0LmNvbnRlbnRUeXBlID09PSBcInN0cmluZ1wiICYmIGlucHV0LmNvbnRlbnRUeXBlLmxlbmd0aCA+IDAgPyBpbnB1dC5jb250ZW50VHlwZSA6IG51bGxcbiAgfSBlbHNlIGlmIChpc1BsYWluT2JqZWN0KGlucHV0KSAmJiBcImNvbnRlbnRcIiBpbiBpbnB1dCkge1xuICAgIGJ1ZmZlciA9IHRvQnVmZmVyKGlucHV0LmNvbnRlbnQpXG4gICAgZmlsZW5hbWUgPSB0eXBlb2YgaW5wdXQuZmlsZW5hbWUgPT09IFwic3RyaW5nXCIgJiYgaW5wdXQuZmlsZW5hbWUubGVuZ3RoID4gMCA/IGlucHV0LmZpbGVuYW1lIDogZGVmYXVsdEZpbGVuYW1lXG4gICAgY29udGVudFR5cGUgPSB0eXBlb2YgaW5wdXQuY29udGVudFR5cGUgPT09IFwic3RyaW5nXCIgJiYgaW5wdXQuY29udGVudFR5cGUubGVuZ3RoID4gMCA/IGlucHV0LmNvbnRlbnRUeXBlIDogbnVsbFxuICB9IGVsc2UgaWYgKGlzQXJyYXlCdWZmZXJMaWtlKGlucHV0KSkge1xuICAgIGNvbnN0IGFycmF5QnVmZmVyID0gYXdhaXQgaW5wdXQuYXJyYXlCdWZmZXIoKVxuXG4gICAgYnVmZmVyID0gQnVmZmVyLmZyb20oYXJyYXlCdWZmZXIpXG4gICAgZmlsZW5hbWUgPSB0eXBlb2YgLyoqIEB0eXBlIHs/fSAqLyAoaW5wdXQpLm5hbWUgPT09IFwic3RyaW5nXCIgJiYgLyoqIEB0eXBlIHs/fSAqLyAoaW5wdXQpLm5hbWUubGVuZ3RoID4gMFxuICAgICAgPyAvKiogQHR5cGUgez99ICovIChpbnB1dCkubmFtZVxuICAgICAgOiBkZWZhdWx0RmlsZW5hbWVcbiAgICBjb250ZW50VHlwZSA9IHR5cGVvZiAvKiogQHR5cGUgez99ICovIChpbnB1dCkudHlwZSA9PT0gXCJzdHJpbmdcIiAmJiAvKiogQHR5cGUgez99ICovIChpbnB1dCkudHlwZS5sZW5ndGggPiAwXG4gICAgICA/IC8qKiBAdHlwZSB7P30gKi8gKGlucHV0KS50eXBlXG4gICAgICA6IG51bGxcbiAgfSBlbHNlIGlmICh0eXBlb2YgaW5wdXQgPT09IFwic3RyaW5nXCIgfHwgQnVmZmVyLmlzQnVmZmVyKGlucHV0KSB8fCBpc0FycmF5QnVmZmVyKGlucHV0KSB8fCBpc1VpbnQ4QXJyYXkoaW5wdXQpKSB7XG4gICAgYnVmZmVyID0gdG9CdWZmZXIoaW5wdXQpXG4gICAgZmlsZW5hbWUgPSBkZWZhdWx0RmlsZW5hbWVcbiAgfSBlbHNlIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoXCJVbnN1cHBvcnRlZCBhdHRhY2htZW50IGlucHV0XCIpXG4gIH1cblxuICBjb25zdCBub3JtYWxpemVkRmlsZW5hbWUgPSB0eXBlb2YgZmlsZW5hbWUgPT09IFwic3RyaW5nXCIgJiYgZmlsZW5hbWUubGVuZ3RoID4gMFxuICAgID8gYmFzZU5hbWUoZmlsZW5hbWUpXG4gICAgOiBcIlwiXG5cbiAgaWYgKCFidWZmZXIgJiYgIXBhdGhTb3VyY2UpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoXCJBdHRhY2htZW50IGlucHV0IG5vcm1hbGl6YXRpb24gcHJvZHVjZWQgbm8gY29udGVudFwiKVxuICB9XG5cbiAgaWYgKGJ1ZmZlcikgYnl0ZVNpemUgPSBidWZmZXIubGVuZ3RoXG4gIGlmIChieXRlU2l6ZSA9PT0gbnVsbCkgdGhyb3cgbmV3IEVycm9yKFwiQXR0YWNobWVudCBpbnB1dCBub3JtYWxpemF0aW9uIHByb2R1Y2VkIG5vIGJ5dGUgc2l6ZVwiKVxuXG4gIHJldHVybiB7XG4gICAgYnl0ZVNpemUsXG4gICAgY29udGVudEJ1ZmZlcjogYnVmZmVyLFxuICAgIGNvbnRlbnRCYXNlNjQ6IGJ1ZmZlciA/IGJ1ZmZlci50b1N0cmluZyhcImJhc2U2NFwiKSA6IG51bGwsXG4gICAgY29udGVudFR5cGUsXG4gICAgZmlsZW5hbWU6IG5vcm1hbGl6ZWRGaWxlbmFtZSB8fCBkZWZhdWx0RmlsZW5hbWUsXG4gICAgcGF0aFNvdXJjZVxuICB9XG59XG4iXX0=
@@ -23,15 +23,12 @@ export default class FilesystemAttachmentStorageDriver {
23
23
  * Runs write.
24
24
  * @param {object} args - Options.
25
25
  * @param {string} args.attachmentId - Attachment id.
26
- * @param {{contentBuffer: Buffer, filename: string}} args.input - Normalized attachment input.
26
+ * @param {import("../normalize-input.js").NormalizedAttachmentInput} args.input - Normalized attachment input.
27
27
  * @returns {Promise<{storageKey: string}>} - Storage key result.
28
28
  */
29
29
  write({ attachmentId, input }: {
30
30
  attachmentId: string;
31
- input: {
32
- contentBuffer: Buffer;
33
- filename: string;
34
- };
31
+ input: import("../normalize-input.js").NormalizedAttachmentInput;
35
32
  }): Promise<{
36
33
  storageKey: string;
37
34
  }>;
@@ -1 +1 @@
1
- {"version":3,"file":"filesystem.d.ts","sourceRoot":"","sources":["../../../../../../src/database/record/attachments/storage-drivers/filesystem.js"],"names":[],"mappings":"AAuBA;;GAEG;AACH;IACE;;;;;OAKG;IACH,wCAHG;QAA6D,aAAa,EAAlE,OAAO,8BAA8B,EAAE,OAAO;QACrB,OAAO;KAC1C,EAIA;IAFC,8DAAkC;IAClC,6BAAsB;IAGxB;;;OAGG;IACH,aAFa,MAAM,CAQlB;IAED;;;;;;OAMG;IACH,+BAJG;QAAqB,YAAY,EAAzB,MAAM;QAC0C,KAAK,EAArD;YAAC,aAAa,EAAE,MAAM,CAAC;YAAC,QAAQ,EAAE,MAAM,CAAA;SAAC;KACjD,GAAU,OAAO,CAAC;QAAC,UAAU,EAAE,MAAM,CAAA;KAAC,CAAC,CAWzC;IAED;;;;;OAKG;IACH,qBAHG;QAAqB,UAAU,EAAvB,MAAM;KACd,GAAU,OAAO,CAAC,MAAM,CAAC,CAM3B;IAED;;;;;OAKG;IACH,uBAHG;QAAqB,UAAU,EAAvB,MAAM;KACd,GAAU,OAAO,CAAC,IAAI,CAAC,CAYzB;IAED;;;;;OAKG;IACH,oBAHG;QAAqB,UAAU,EAAvB,MAAM;KACd,GAAU,OAAO,CAAC,MAAM,CAAC,CAU3B;CACF"}
1
+ {"version":3,"file":"filesystem.d.ts","sourceRoot":"","sources":["../../../../../../src/database/record/attachments/storage-drivers/filesystem.js"],"names":[],"mappings":"AAyBA;;GAEG;AACH;IACE;;;;;OAKG;IACH,wCAHG;QAA6D,aAAa,EAAlE,OAAO,8BAA8B,EAAE,OAAO;QACrB,OAAO;KAC1C,EAIA;IAFC,8DAAkC;IAClC,6BAAsB;IAGxB;;;OAGG;IACH,aAFa,MAAM,CAQlB;IAED;;;;;;OAMG;IACH,+BAJG;QAAqB,YAAY,EAAzB,MAAM;QAC0D,KAAK,EAArE,OAAO,uBAAuB,EAAE,yBAAyB;KACjE,GAAU,OAAO,CAAC;QAAC,UAAU,EAAE,MAAM,CAAA;KAAC,CAAC,CAwCzC;IAED;;;;;OAKG;IACH,qBAHG;QAAqB,UAAU,EAAvB,MAAM;KACd,GAAU,OAAO,CAAC,MAAM,CAAC,CAM3B;IAED;;;;;OAKG;IACH,uBAHG;QAAqB,UAAU,EAAvB,MAAM;KACd,GAAU,OAAO,CAAC,IAAI,CAAC,CAYzB;IAED;;;;;OAKG;IACH,oBAHG;QAAqB,UAAU,EAAvB,MAAM;KACd,GAAU,OAAO,CAAC,MAAM,CAAC,CAU3B;CACF"}
@@ -1,6 +1,8 @@
1
1
  // @ts-check
2
+ import { createWriteStream } from "node:fs";
2
3
  import fs from "fs/promises";
3
4
  import path from "path";
5
+ import { pipeline } from "node:stream/promises";
4
6
  /**
5
7
  * Runs normalize base url.
6
8
  * @param {string} value - URL value.
@@ -45,15 +47,38 @@ export default class FilesystemAttachmentStorageDriver {
45
47
  * Runs write.
46
48
  * @param {object} args - Options.
47
49
  * @param {string} args.attachmentId - Attachment id.
48
- * @param {{contentBuffer: Buffer, filename: string}} args.input - Normalized attachment input.
50
+ * @param {import("../normalize-input.js").NormalizedAttachmentInput} args.input - Normalized attachment input.
49
51
  * @returns {Promise<{storageKey: string}>} - Storage key result.
50
52
  */
51
53
  async write({ attachmentId, input }) {
52
54
  const normalizedFilename = path.basename(input.filename || "attachment.bin");
53
55
  const storageKey = `${attachmentId}-${normalizedFilename}`;
54
56
  const filePath = path.resolve(this.directory(), storageKey);
57
+ const temporaryFilePath = `${filePath}.tmp`;
55
58
  await fs.mkdir(path.dirname(filePath), { recursive: true });
56
- await fs.writeFile(filePath, input.contentBuffer);
59
+ try {
60
+ if (input.pathSource) {
61
+ await pipeline(await input.pathSource.createReadStream(), createWriteStream(temporaryFilePath));
62
+ }
63
+ else if (input.contentBuffer) {
64
+ await fs.writeFile(temporaryFilePath, input.contentBuffer);
65
+ }
66
+ else {
67
+ throw new Error("Filesystem attachment input has no content");
68
+ }
69
+ await fs.rename(temporaryFilePath, filePath);
70
+ }
71
+ catch (error) {
72
+ try {
73
+ await fs.unlink(temporaryFilePath);
74
+ }
75
+ catch (cleanupError) {
76
+ if (!(cleanupError instanceof Error) || !("code" in cleanupError) || cleanupError.code !== "ENOENT") {
77
+ throw new AggregateError([error, cleanupError], `Filesystem attachment write and partial-file cleanup both failed for ${storageKey}`, { cause: cleanupError });
78
+ }
79
+ }
80
+ throw error;
81
+ }
57
82
  return { storageKey };
58
83
  }
59
84
  /**
@@ -97,4 +122,4 @@ export default class FilesystemAttachmentStorageDriver {
97
122
  return `file://${filePath}`;
98
123
  }
99
124
  }
100
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZmlsZXN5c3RlbS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3NyYy9kYXRhYmFzZS9yZWNvcmQvYXR0YWNobWVudHMvc3RvcmFnZS1kcml2ZXJzL2ZpbGVzeXN0ZW0uanMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsWUFBWTtBQUVaLE9BQU8sRUFBRSxNQUFNLGFBQWEsQ0FBQTtBQUM1QixPQUFPLElBQUksTUFBTSxNQUFNLENBQUE7QUFFdkI7Ozs7R0FJRztBQUNILFNBQVMsZ0JBQWdCLENBQUMsS0FBSztJQUM3QixPQUFPLEtBQUssQ0FBQyxPQUFPLENBQUMsTUFBTSxFQUFFLEVBQUUsQ0FBQyxDQUFBO0FBQ2xDLENBQUM7QUFFRDs7OztHQUlHO0FBQ0gsU0FBUyxnQkFBZ0IsQ0FBQyxVQUFVO0lBQ2xDLE9BQU8sVUFBVSxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxLQUFLLEVBQUUsRUFBRSxDQUFDLGtCQUFrQixDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFBO0FBQ2xGLENBQUM7QUFFRDs7R0FFRztBQUNILE1BQU0sQ0FBQyxPQUFPLE9BQU8saUNBQWlDO0lBQ3BEOzs7OztPQUtHO0lBQ0gsWUFBWSxFQUFDLGFBQWEsRUFBRSxPQUFPLEdBQUcsRUFBRSxFQUFDO1FBQ3ZDLElBQUksQ0FBQyxhQUFhLEdBQUcsYUFBYSxDQUFBO1FBQ2xDLElBQUksQ0FBQyxPQUFPLEdBQUcsT0FBTyxDQUFBO0lBQ3hCLENBQUM7SUFFRDs7O09BR0c7SUFDSCxTQUFTO1FBQ1AsSUFBSSxPQUFPLElBQUksQ0FBQyxPQUFPLENBQUMsU0FBUyxLQUFLLFFBQVEsSUFBSSxJQUFJLENBQUMsT0FBTyxDQUFDLFNBQVMsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFFLENBQUM7WUFDcEYsT0FBTyxJQUFJLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsU0FBUyxDQUFDLENBQUE7UUFDN0MsQ0FBQztRQUVELE9BQU8sSUFBSSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsYUFBYSxDQUFDLFlBQVksRUFBRSxFQUFFLDRCQUE0QixDQUFDLENBQUE7SUFDdEYsQ0FBQztJQUVEOzs7Ozs7T0FNRztJQUNILEtBQUssQ0FBQyxLQUFLLENBQUMsRUFBQyxZQUFZLEVBQUUsS0FBSyxFQUFDO1FBQy9CLE1BQU0sa0JBQWtCLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUMsUUFBUSxJQUFJLGdCQUFnQixDQUFDLENBQUE7UUFDNUUsTUFBTSxVQUFVLEdBQUcsR0FBRyxZQUFZLElBQUksa0JBQWtCLEVBQUUsQ0FBQTtRQUMxRCxNQUFNLFFBQVEsR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxTQUFTLEVBQUUsRUFBRSxVQUFVLENBQUMsQ0FBQTtRQUUzRCxNQUFNLEVBQUUsQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxRQUFRLENBQUMsRUFBRSxFQUFDLFNBQVMsRUFBRSxJQUFJLEVBQUMsQ0FBQyxDQUFBO1FBQ3pELE1BQU0sRUFBRSxDQUFDLFNBQVMsQ0FBQyxRQUFRLEVBQUUsS0FBSyxDQUFDLGFBQWEsQ0FBQyxDQUFBO1FBRWpELE9BQU8sRUFBQyxVQUFVLEVBQUMsQ0FBQTtJQUNyQixDQUFDO0lBRUQ7Ozs7O09BS0c7SUFDSCxLQUFLLENBQUMsSUFBSSxDQUFDLEVBQUMsVUFBVSxFQUFDO1FBQ3JCLE1BQU0sUUFBUSxHQUFHLElBQUksQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLFNBQVMsRUFBRSxFQUFFLFVBQVUsQ0FBQyxDQUFBO1FBRTNELE9BQU8sTUFBTSxFQUFFLENBQUMsUUFBUSxDQUFDLFFBQVEsQ0FBQyxDQUFBO0lBQ3BDLENBQUM7SUFFRDs7Ozs7T0FLRztJQUNILEtBQUssQ0FBQyxNQUFNLENBQUMsRUFBQyxVQUFVLEVBQUM7UUFDdkIsTUFBTSxRQUFRLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsU0FBUyxFQUFFLEVBQUUsVUFBVSxDQUFDLENBQUE7UUFFM0QsSUFBSSxDQUFDO1lBQ0gsTUFBTSxFQUFFLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxDQUFBO1FBQzNCLENBQUM7UUFBQyxPQUFPLEtBQUssRUFBRSxDQUFDO1lBQ2YsSUFBSSxDQUFDLENBQUMsS0FBSyxZQUFZLEtBQUssQ0FBQyxJQUFJLENBQUMsQ0FBQyxNQUFNLElBQUksS0FBSyxDQUFDLElBQUksS0FBSyxDQUFDLElBQUksS0FBSyxRQUFRLEVBQUUsQ0FBQztnQkFDL0UsTUFBTSxLQUFLLENBQUE7WUFDYixDQUFDO1FBQ0gsQ0FBQztJQUNILENBQUM7SUFFRDs7Ozs7T0FLRztJQUNILEtBQUssQ0FBQyxHQUFHLENBQUMsRUFBQyxVQUFVLEVBQUM7UUFDcEIsSUFBSSxPQUFPLElBQUksQ0FBQyxPQUFPLENBQUMsT0FBTyxLQUFLLFFBQVEsSUFBSSxJQUFJLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFFLENBQUM7WUFDaEYsT0FBTyxHQUFHLGdCQUFnQixDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDLElBQUksZ0JBQWdCLENBQUMsVUFBVSxDQUFDLEVBQUUsQ0FBQTtRQUNwRixDQUFDO1FBRUQsTUFBTSxRQUFRLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsU0FBUyxFQUFFLEVBQUUsVUFBVSxDQUFDLENBQUE7UUFFM0QsT0FBTyxVQUFVLFFBQVEsRUFBRSxDQUFBO0lBQzdCLENBQUM7Q0FDRiIsInNvdXJjZXNDb250ZW50IjpbIi8vIEB0cy1jaGVja1xuXG5pbXBvcnQgZnMgZnJvbSBcImZzL3Byb21pc2VzXCJcbmltcG9ydCBwYXRoIGZyb20gXCJwYXRoXCJcblxuLyoqXG4gKiBSdW5zIG5vcm1hbGl6ZSBiYXNlIHVybC5cbiAqIEBwYXJhbSB7c3RyaW5nfSB2YWx1ZSAtIFVSTCB2YWx1ZS5cbiAqIEByZXR1cm5zIHtzdHJpbmd9IC0gVVJMIHdpdGhvdXQgdHJhaWxpbmcgc2xhc2guXG4gKi9cbmZ1bmN0aW9uIG5vcm1hbGl6ZUJhc2VVcmwodmFsdWUpIHtcbiAgcmV0dXJuIHZhbHVlLnJlcGxhY2UoL1xcLyskLywgXCJcIilcbn1cblxuLyoqXG4gKiBSdW5zIGVuY29kZSBzdG9yYWdlIGtleS5cbiAqIEBwYXJhbSB7c3RyaW5nfSBzdG9yYWdlS2V5IC0gU3RvcmFnZSBrZXkuXG4gKiBAcmV0dXJucyB7c3RyaW5nfSAtIFVSTC1zYWZlIHN0b3JhZ2Uga2V5LlxuICovXG5mdW5jdGlvbiBlbmNvZGVTdG9yYWdlS2V5KHN0b3JhZ2VLZXkpIHtcbiAgcmV0dXJuIHN0b3JhZ2VLZXkuc3BsaXQoXCIvXCIpLm1hcCgoZW50cnkpID0+IGVuY29kZVVSSUNvbXBvbmVudChlbnRyeSkpLmpvaW4oXCIvXCIpXG59XG5cbi8qKlxuICogRmlsZXN5c3RlbSBhdHRhY2htZW50IHN0b3JhZ2UgZHJpdmVyLlxuICovXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBGaWxlc3lzdGVtQXR0YWNobWVudFN0b3JhZ2VEcml2ZXIge1xuICAvKipcbiAgICogUnVucyBjb25zdHJ1Y3Rvci5cbiAgICogQHBhcmFtIHtvYmplY3R9IGFyZ3MgLSBPcHRpb25zLlxuICAgKiBAcGFyYW0ge2ltcG9ydChcIi4uLy4uLy4uLy4uL2NvbmZpZ3VyYXRpb24uanNcIikuZGVmYXVsdH0gYXJncy5jb25maWd1cmF0aW9uIC0gQ29uZmlndXJhdGlvbiBpbnN0YW5jZS5cbiAgICogQHBhcmFtIHtSZWNvcmQ8c3RyaW5nLCA/Pn0gW2FyZ3Mub3B0aW9uc10gLSBEcml2ZXIgb3B0aW9ucy5cbiAgICovXG4gIGNvbnN0cnVjdG9yKHtjb25maWd1cmF0aW9uLCBvcHRpb25zID0ge319KSB7XG4gICAgdGhpcy5jb25maWd1cmF0aW9uID0gY29uZmlndXJhdGlvblxuICAgIHRoaXMub3B0aW9ucyA9IG9wdGlvbnNcbiAgfVxuXG4gIC8qKlxuICAgKiBSdW5zIGRpcmVjdG9yeS5cbiAgICogQHJldHVybnMge3N0cmluZ30gLSBSb290IGRpcmVjdG9yeSBmb3IgYXR0YWNobWVudCBmaWxlcy5cbiAgICovXG4gIGRpcmVjdG9yeSgpIHtcbiAgICBpZiAodHlwZW9mIHRoaXMub3B0aW9ucy5kaXJlY3RvcnkgPT09IFwic3RyaW5nXCIgJiYgdGhpcy5vcHRpb25zLmRpcmVjdG9yeS5sZW5ndGggPiAwKSB7XG4gICAgICByZXR1cm4gcGF0aC5yZXNvbHZlKHRoaXMub3B0aW9ucy5kaXJlY3RvcnkpXG4gICAgfVxuXG4gICAgcmV0dXJuIHBhdGgucmVzb2x2ZSh0aGlzLmNvbmZpZ3VyYXRpb24uZ2V0RGlyZWN0b3J5KCksIFwidG1wL2F0dGFjaG1lbnRzL2ZpbGVzeXN0ZW1cIilcbiAgfVxuXG4gIC8qKlxuICAgKiBSdW5zIHdyaXRlLlxuICAgKiBAcGFyYW0ge29iamVjdH0gYXJncyAtIE9wdGlvbnMuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBhcmdzLmF0dGFjaG1lbnRJZCAtIEF0dGFjaG1lbnQgaWQuXG4gICAqIEBwYXJhbSB7e2NvbnRlbnRCdWZmZXI6IEJ1ZmZlciwgZmlsZW5hbWU6IHN0cmluZ319IGFyZ3MuaW5wdXQgLSBOb3JtYWxpemVkIGF0dGFjaG1lbnQgaW5wdXQuXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPHtzdG9yYWdlS2V5OiBzdHJpbmd9Pn0gLSBTdG9yYWdlIGtleSByZXN1bHQuXG4gICAqL1xuICBhc3luYyB3cml0ZSh7YXR0YWNobWVudElkLCBpbnB1dH0pIHtcbiAgICBjb25zdCBub3JtYWxpemVkRmlsZW5hbWUgPSBwYXRoLmJhc2VuYW1lKGlucHV0LmZpbGVuYW1lIHx8IFwiYXR0YWNobWVudC5iaW5cIilcbiAgICBjb25zdCBzdG9yYWdlS2V5ID0gYCR7YXR0YWNobWVudElkfS0ke25vcm1hbGl6ZWRGaWxlbmFtZX1gXG4gICAgY29uc3QgZmlsZVBhdGggPSBwYXRoLnJlc29sdmUodGhpcy5kaXJlY3RvcnkoKSwgc3RvcmFnZUtleSlcblxuICAgIGF3YWl0IGZzLm1rZGlyKHBhdGguZGlybmFtZShmaWxlUGF0aCksIHtyZWN1cnNpdmU6IHRydWV9KVxuICAgIGF3YWl0IGZzLndyaXRlRmlsZShmaWxlUGF0aCwgaW5wdXQuY29udGVudEJ1ZmZlcilcblxuICAgIHJldHVybiB7c3RvcmFnZUtleX1cbiAgfVxuXG4gIC8qKlxuICAgKiBSdW5zIHJlYWQuXG4gICAqIEBwYXJhbSB7b2JqZWN0fSBhcmdzIC0gT3B0aW9ucy5cbiAgICogQHBhcmFtIHtzdHJpbmd9IGFyZ3Muc3RvcmFnZUtleSAtIFN0b3JhZ2Uga2V5LlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTxCdWZmZXI+fSAtIEF0dGFjaG1lbnQgYnl0ZXMuXG4gICAqL1xuICBhc3luYyByZWFkKHtzdG9yYWdlS2V5fSkge1xuICAgIGNvbnN0IGZpbGVQYXRoID0gcGF0aC5yZXNvbHZlKHRoaXMuZGlyZWN0b3J5KCksIHN0b3JhZ2VLZXkpXG5cbiAgICByZXR1cm4gYXdhaXQgZnMucmVhZEZpbGUoZmlsZVBhdGgpXG4gIH1cblxuICAvKipcbiAgICogUnVucyBkZWxldGUuXG4gICAqIEBwYXJhbSB7b2JqZWN0fSBhcmdzIC0gT3B0aW9ucy5cbiAgICogQHBhcmFtIHtzdHJpbmd9IGFyZ3Muc3RvcmFnZUtleSAtIFN0b3JhZ2Uga2V5LlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTx2b2lkPn0gLSBSZXNvbHZlcyB3aGVuIGZpbGUgaGFzIGJlZW4gZGVsZXRlZC5cbiAgICovXG4gIGFzeW5jIGRlbGV0ZSh7c3RvcmFnZUtleX0pIHtcbiAgICBjb25zdCBmaWxlUGF0aCA9IHBhdGgucmVzb2x2ZSh0aGlzLmRpcmVjdG9yeSgpLCBzdG9yYWdlS2V5KVxuXG4gICAgdHJ5IHtcbiAgICAgIGF3YWl0IGZzLnVubGluayhmaWxlUGF0aClcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgaWYgKCEoZXJyb3IgaW5zdGFuY2VvZiBFcnJvcikgfHwgIShcImNvZGVcIiBpbiBlcnJvcikgfHwgZXJyb3IuY29kZSAhPT0gXCJFTk9FTlRcIikge1xuICAgICAgICB0aHJvdyBlcnJvclxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBSdW5zIHVybC5cbiAgICogQHBhcmFtIHtvYmplY3R9IGFyZ3MgLSBPcHRpb25zLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gYXJncy5zdG9yYWdlS2V5IC0gU3RvcmFnZSBrZXkuXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPHN0cmluZz59IC0gUmVzb2x2YWJsZSBVUkwuXG4gICAqL1xuICBhc3luYyB1cmwoe3N0b3JhZ2VLZXl9KSB7XG4gICAgaWYgKHR5cGVvZiB0aGlzLm9wdGlvbnMuYmFzZVVybCA9PT0gXCJzdHJpbmdcIiAmJiB0aGlzLm9wdGlvbnMuYmFzZVVybC5sZW5ndGggPiAwKSB7XG4gICAgICByZXR1cm4gYCR7bm9ybWFsaXplQmFzZVVybCh0aGlzLm9wdGlvbnMuYmFzZVVybCl9LyR7ZW5jb2RlU3RvcmFnZUtleShzdG9yYWdlS2V5KX1gXG4gICAgfVxuXG4gICAgY29uc3QgZmlsZVBhdGggPSBwYXRoLnJlc29sdmUodGhpcy5kaXJlY3RvcnkoKSwgc3RvcmFnZUtleSlcblxuICAgIHJldHVybiBgZmlsZTovLyR7ZmlsZVBhdGh9YFxuICB9XG59XG4iXX0=
125
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZmlsZXN5c3RlbS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3NyYy9kYXRhYmFzZS9yZWNvcmQvYXR0YWNobWVudHMvc3RvcmFnZS1kcml2ZXJzL2ZpbGVzeXN0ZW0uanMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsWUFBWTtBQUVaLE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxNQUFNLFNBQVMsQ0FBQTtBQUMzQyxPQUFPLEVBQUUsTUFBTSxhQUFhLENBQUE7QUFDNUIsT0FBTyxJQUFJLE1BQU0sTUFBTSxDQUFBO0FBQ3ZCLE9BQU8sRUFBRSxRQUFRLEVBQUUsTUFBTSxzQkFBc0IsQ0FBQTtBQUUvQzs7OztHQUlHO0FBQ0gsU0FBUyxnQkFBZ0IsQ0FBQyxLQUFLO0lBQzdCLE9BQU8sS0FBSyxDQUFDLE9BQU8sQ0FBQyxNQUFNLEVBQUUsRUFBRSxDQUFDLENBQUE7QUFDbEMsQ0FBQztBQUVEOzs7O0dBSUc7QUFDSCxTQUFTLGdCQUFnQixDQUFDLFVBQVU7SUFDbEMsT0FBTyxVQUFVLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEtBQUssRUFBRSxFQUFFLENBQUMsa0JBQWtCLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUE7QUFDbEYsQ0FBQztBQUVEOztHQUVHO0FBQ0gsTUFBTSxDQUFDLE9BQU8sT0FBTyxpQ0FBaUM7SUFDcEQ7Ozs7O09BS0c7SUFDSCxZQUFZLEVBQUMsYUFBYSxFQUFFLE9BQU8sR0FBRyxFQUFFLEVBQUM7UUFDdkMsSUFBSSxDQUFDLGFBQWEsR0FBRyxhQUFhLENBQUE7UUFDbEMsSUFBSSxDQUFDLE9BQU8sR0FBRyxPQUFPLENBQUE7SUFDeEIsQ0FBQztJQUVEOzs7T0FHRztJQUNILFNBQVM7UUFDUCxJQUFJLE9BQU8sSUFBSSxDQUFDLE9BQU8sQ0FBQyxTQUFTLEtBQUssUUFBUSxJQUFJLElBQUksQ0FBQyxPQUFP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UyxFQUFFLEVBQUUsVUFBVSxDQUFDLENBQUE7UUFFM0QsSUFBSSxDQUFDO1lBQ0gsTUFBTSxFQUFFLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxDQUFBO1FBQzNCLENBQUM7UUFBQyxPQUFPLEtBQUssRUFBRSxDQUFDO1lBQ2YsSUFBSSxDQUFDLENBQUMsS0FBSyxZQUFZLEtBQUssQ0FBQyxJQUFJLENBQUMsQ0FBQyxNQUFNLElBQUksS0FBSyxDQUFDLElBQUksS0FBSyxDQUFDLElBQUksS0FBSyxRQUFRLEVBQUUsQ0FBQztnQkFDL0UsTUFBTSxLQUFLLENBQUE7WUFDYixDQUFDO1FBQ0gsQ0FBQztJQUNILENBQUM7SUFFRDs7Ozs7T0FLRztJQUNILEtBQUssQ0FBQyxHQUFHLENBQUMsRUFBQyxVQUFVLEVBQUM7UUFDcEIsSUFBSSxPQUFPLElBQUksQ0FBQyxPQUFPLENBQUMsT0FBTyxLQUFLLFFBQVEsSUFBSSxJQUFJLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFFLENBQUM7WUFDaEYsT0FBTyxHQUFHLGdCQUFnQixDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDLElBQUksZ0JBQWdCLENBQUMsVUFBVSxDQUFDLEVBQUUsQ0FBQTtRQUNwRixDQUFDO1FBRUQsTUFBTSxRQUFRLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsU0FBUyxFQUFFLEVBQUUsVUFBVSxDQUFDLENBQUE7UUFFM0QsT0FBTyxVQUFVLFFBQVEsRUFBRSxDQUFBO0lBQzdCLENBQUM7Q0FDRiIsInNvdXJjZXNDb250ZW50IjpbIi8vIEB0cy1jaGVja1xuXG5pbXBvcnQgeyBjcmVhdGVXcml0ZVN0cmVhbSB9IGZyb20gXCJub2RlOmZzXCJcbmltcG9ydCBmcyBmcm9tIFwiZnMvcHJvbWlzZXNcIlxuaW1wb3J0IHBhdGggZnJvbSBcInBhdGhcIlxuaW1wb3J0IHsgcGlwZWxpbmUgfSBmcm9tIFwibm9kZTpzdHJlYW0vcHJvbWlzZXNcIlxuXG4vKipcbiAqIFJ1bnMgbm9ybWFsaXplIGJhc2UgdXJsLlxuICogQHBhcmFtIHtzdHJpbmd9IHZhbHVlIC0gVVJMIHZhbHVlLlxuICogQHJldHVybnMge3N0cmluZ30gLSBVUkwgd2l0aG91dCB0cmFpbGluZyBzbGFzaC5cbiAqL1xuZnVuY3Rpb24gbm9ybWFsaXplQmFzZVVybCh2YWx1ZSkge1xuICByZXR1cm4gdmFsdWUucmVwbGFjZSgvXFwvKyQvLCBcIlwiKVxufVxuXG4vKipcbiAqIFJ1bnMgZW5jb2RlIHN0b3JhZ2Uga2V5LlxuICogQHBhcmFtIHtzdHJpbmd9IHN0b3JhZ2VLZXkgLSBTdG9yYWdlIGtleS5cbiAqIEByZXR1cm5zIHtzdHJpbmd9IC0gVVJMLXNhZmUgc3RvcmFnZSBrZXkuXG4gKi9cbmZ1bmN0aW9uIGVuY29kZVN0b3JhZ2VLZXkoc3RvcmFnZUtleSkge1xuICByZXR1cm4gc3RvcmFnZUtleS5zcGxpdChcIi9cIikubWFwKChlbnRyeSkgPT4gZW5jb2RlVVJJQ29tcG9uZW50KGVudHJ5KSkuam9pbihcIi9cIilcbn1cblxuLyoqXG4gKiBGaWxlc3lzdGVtIGF0dGFjaG1lbnQgc3RvcmFnZSBkcml2ZXIuXG4gKi9cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIEZpbGVzeXN0ZW1BdHRhY2htZW50U3RvcmFnZURyaXZlciB7XG4gIC8qKlxuICAgKiBSdW5zIGNvbnN0cnVjdG9yLlxuICAgKiBAcGFyYW0ge29iamVjdH0gYXJncyAtIE9wdGlvbnMuXG4gICAqIEBwYXJhbSB7aW1wb3J0KFwiLi4vLi4vLi4vLi4vY29uZmlndXJhdGlvbi5qc1wiKS5kZWZhdWx0fSBhcmdzLmNvbmZpZ3VyYXRpb24gLSBDb25maWd1cmF0aW9uIGluc3RhbmNlLlxuICAgKiBAcGFyYW0ge1JlY29yZDxzdHJpbmcsID8+fSBbYXJncy5vcHRpb25zXSAtIERyaXZlciBvcHRpb25zLlxuICAgKi9cbiAgY29uc3RydWN0b3Ioe2NvbmZpZ3VyYXRpb24sIG9wdGlvbnMgPSB7fX0pIHtcbiAgICB0aGlzLmNvbmZpZ3VyYXRpb24gPSBjb25maWd1cmF0aW9uXG4gICAgdGhpcy5vcHRpb25zID0gb3B0aW9uc1xuICB9XG5cbiAgLyoqXG4gICAqIFJ1bnMgZGlyZWN0b3J5LlxuICAgKiBAcmV0dXJucyB7c3RyaW5nfSAtIFJvb3QgZGlyZWN0b3J5IGZvciBhdHRhY2htZW50IGZpbGVzLlxuICAgKi9cbiAgZGlyZWN0b3J5KCkge1xuICAgIGlmICh0eXBlb2YgdGhpcy5vcHRpb25zLmRpcmVjdG9yeSA9PT0gXCJzdHJpbmdcIiAmJiB0aGlzLm9wdGlvbnMuZGlyZWN0b3J5Lmxlbmd0aCA+IDApIHtcbiAgICAgIHJldHVybiBwYXRoLnJlc29sdmUodGhpcy5vcHRpb25zLmRpcmVjdG9yeSlcbiAgICB9XG5cbiAgICByZXR1cm4gcGF0aC5yZXNvbHZlKHRoaXMuY29uZmlndXJhdGlvbi5nZXREaXJlY3RvcnkoKSwgXCJ0bXAvYXR0YWNobWVudHMvZmlsZXN5c3RlbVwiKVxuICB9XG5cbiAgLyoqXG4gICAqIFJ1bnMgd3JpdGUuXG4gICAqIEBwYXJhbSB7b2JqZWN0fSBhcmdzIC0gT3B0aW9ucy5cbiAgICogQHBhcmFtIHtzdHJpbmd9IGFyZ3MuYXR0YWNobWVudElkIC0gQXR0YWNobWVudCBpZC5cbiAgICogQHBhcmFtIHtpbXBvcnQoXCIuLi9ub3JtYWxpemUtaW5wdXQuanNcIikuTm9ybWFsaXplZEF0dGFjaG1lbnRJbnB1dH0gYXJncy5pbnB1dCAtIE5vcm1hbGl6ZWQgYXR0YWNobWVudCBpbnB1dC5cbiAgICogQHJldHVybnMge1Byb21pc2U8e3N0b3JhZ2VLZXk6IHN0cmluZ30+fSAtIFN0b3JhZ2Uga2V5IHJlc3VsdC5cbiAgICovXG4gIGFzeW5jIHdyaXRlKHthdHRhY2htZW50SWQsIGlucHV0fSkge1xuICAgIGNvbnN0IG5vcm1hbGl6ZWRGaWxlbmFtZSA9IHBhdGguYmFzZW5hbWUoaW5wdXQuZmlsZW5hbWUgfHwgXCJhdHRhY2htZW50LmJpblwiKVxuICAgIGNvbnN0IHN0b3JhZ2VLZXkgPSBgJHthdHRhY2htZW50SWR9LSR7bm9ybWFsaXplZEZpbGVuYW1lfWBcbiAgICBjb25zdCBmaWxlUGF0aCA9IHBhdGgucmVzb2x2ZSh0aGlzLmRpcmVjdG9yeSgpLCBzdG9yYWdlS2V5KVxuICAgIGNvbnN0IHRlbXBvcmFyeUZpbGVQYXRoID0gYCR7ZmlsZVBhdGh9LnRtcGBcblxuICAgIGF3YWl0IGZzLm1rZGlyKHBhdGguZGlybmFtZShmaWxlUGF0aCksIHtyZWN1cnNpdmU6IHRydWV9KVxuXG4gICAgdHJ5IHtcbiAgICAgIGlmIChpbnB1dC5wYXRoU291cmNlKSB7XG4gICAgICAgIGF3YWl0IHBpcGVsaW5lKFxuICAgICAgICAgIGF3YWl0IGlucHV0LnBhdGhTb3VyY2UuY3JlYXRlUmVhZFN0cmVhbSgpLFxuICAgICAgICAgIGNyZWF0ZVdyaXRlU3RyZWFtKHRlbXBvcmFyeUZpbGVQYXRoKVxuICAgICAgICApXG4gICAgICB9IGVsc2UgaWYgKGlucHV0LmNvbnRlbnRCdWZmZXIpIHtcbiAgICAgICAgYXdhaXQgZnMud3JpdGVGaWxlKHRlbXBvcmFyeUZpbGVQYXRoLCBpbnB1dC5jb250ZW50QnVmZmVyKVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiRmlsZXN5c3RlbSBhdHRhY2htZW50IGlucHV0IGhhcyBubyBjb250ZW50XCIpXG4gICAgICB9XG5cbiAgICAgIGF3YWl0IGZzLnJlbmFtZSh0ZW1wb3JhcnlGaWxlUGF0aCwgZmlsZVBhdGgpXG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGF3YWl0IGZzLnVubGluayh0ZW1wb3JhcnlGaWxlUGF0aClcbiAgICAgIH0gY2F0Y2ggKGNsZWFudXBFcnJvcikge1xuICAgICAgICBpZiAoIShjbGVhbnVwRXJyb3IgaW5zdGFuY2VvZiBFcnJvcikgfHwgIShcImNvZGVcIiBpbiBjbGVhbnVwRXJyb3IpIHx8IGNsZWFudXBFcnJvci5jb2RlICE9PSBcIkVOT0VOVFwiKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IEFnZ3JlZ2F0ZUVycm9yKFxuICAgICAgICAgICAgW2Vycm9yLCBjbGVhbnVwRXJyb3JdLFxuICAgICAgICAgICAgYEZpbGVzeXN0ZW0gYXR0YWNobWVudCB3cml0ZSBhbmQgcGFydGlhbC1maWxlIGNsZWFudXAgYm90aCBmYWlsZWQgZm9yICR7c3RvcmFnZUtleX1gLFxuICAgICAgICAgICAge2NhdXNlOiBjbGVhbnVwRXJyb3J9XG4gICAgICAgICAgKVxuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIHRocm93IGVycm9yXG4gICAgfVxuXG4gICAgcmV0dXJuIHtzdG9yYWdlS2V5fVxuICB9XG5cbiAgLyoqXG4gICAqIFJ1bnMgcmVhZC5cbiAgICogQHBhcmFtIHtvYmplY3R9IGFyZ3MgLSBPcHRpb25zLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gYXJncy5zdG9yYWdlS2V5IC0gU3RvcmFnZSBrZXkuXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPEJ1ZmZlcj59IC0gQXR0YWNobWVudCBieXRlcy5cbiAgICovXG4gIGFzeW5jIHJlYWQoe3N0b3JhZ2VLZXl9KSB7XG4gICAgY29uc3QgZmlsZVBhdGggPSBwYXRoLnJlc29sdmUodGhpcy5kaXJlY3RvcnkoKSwgc3RvcmFnZUtleSlcblxuICAgIHJldHVybiBhd2FpdCBmcy5yZWFkRmlsZShmaWxlUGF0aClcbiAgfVxuXG4gIC8qKlxuICAgKiBSdW5zIGRlbGV0ZS5cbiAgICogQHBhcmFtIHtvYmplY3R9IGFyZ3MgLSBPcHRpb25zLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gYXJncy5zdG9yYWdlS2V5IC0gU3RvcmFnZSBrZXkuXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPHZvaWQ+fSAtIFJlc29sdmVzIHdoZW4gZmlsZSBoYXMgYmVlbiBkZWxldGVkLlxuICAgKi9cbiAgYXN5bmMgZGVsZXRlKHtzdG9yYWdlS2V5fSkge1xuICAgIGNvbnN0IGZpbGVQYXRoID0gcGF0aC5yZXNvbHZlKHRoaXMuZGlyZWN0b3J5KCksIHN0b3JhZ2VLZXkpXG5cbiAgICB0cnkge1xuICAgICAgYXdhaXQgZnMudW5saW5rKGZpbGVQYXRoKVxuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBpZiAoIShlcnJvciBpbnN0YW5jZW9mIEVycm9yKSB8fCAhKFwiY29kZVwiIGluIGVycm9yKSB8fCBlcnJvci5jb2RlICE9PSBcIkVOT0VOVFwiKSB7XG4gICAgICAgIHRocm93IGVycm9yXG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFJ1bnMgdXJsLlxuICAgKiBAcGFyYW0ge29iamVjdH0gYXJncyAtIE9wdGlvbnMuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBhcmdzLnN0b3JhZ2VLZXkgLSBTdG9yYWdlIGtleS5cbiAgICogQHJldHVybnMge1Byb21pc2U8c3RyaW5nPn0gLSBSZXNvbHZhYmxlIFVSTC5cbiAgICovXG4gIGFzeW5jIHVybCh7c3RvcmFnZUtleX0pIHtcbiAgICBpZiAodHlwZW9mIHRoaXMub3B0aW9ucy5iYXNlVXJsID09PSBcInN0cmluZ1wiICYmIHRoaXMub3B0aW9ucy5iYXNlVXJsLmxlbmd0aCA+IDApIHtcbiAgICAgIHJldHVybiBgJHtub3JtYWxpemVCYXNlVXJsKHRoaXMub3B0aW9ucy5iYXNlVXJsKX0vJHtlbmNvZGVTdG9yYWdlS2V5KHN0b3JhZ2VLZXkpfWBcbiAgICB9XG5cbiAgICBjb25zdCBmaWxlUGF0aCA9IHBhdGgucmVzb2x2ZSh0aGlzLmRpcmVjdG9yeSgpLCBzdG9yYWdlS2V5KVxuXG4gICAgcmV0dXJuIGBmaWxlOi8vJHtmaWxlUGF0aH1gXG4gIH1cbn1cbiJdfQ==
@@ -22,18 +22,14 @@ export default class NativeAttachmentStorageDriver {
22
22
  * Runs write.
23
23
  * @param {object} args - Write args.
24
24
  * @param {string} args.attachmentId - Attachment id.
25
- * @param {{contentBase64: string, contentType: string | null, filename: string}} args.input - Normalized attachment input.
25
+ * @param {import("../normalize-input.js").NormalizedAttachmentInput} args.input - Normalized attachment input.
26
26
  * @param {import("../../index.js").default} args.model - Model instance.
27
27
  * @param {string} args.name - Attachment name.
28
28
  * @returns {Promise<{storageKey: string}>} - Storage key result.
29
29
  */
30
30
  write({ attachmentId, input, model, name }: {
31
31
  attachmentId: string;
32
- input: {
33
- contentBase64: string;
34
- contentType: string | null;
35
- filename: string;
36
- };
32
+ input: import("../normalize-input.js").NormalizedAttachmentInput;
37
33
  model: import("../../index.js").default;
38
34
  name: string;
39
35
  }): Promise<{
@@ -1 +1 @@
1
- {"version":3,"file":"native.d.ts","sourceRoot":"","sources":["../../../../../../src/database/record/attachments/storage-drivers/native.js"],"names":[],"mappings":"AA2BA;;;GAGG;AACH;IACE;;;;;;OAMG;IACH,8CAJG;QAA8D,aAAa;QACtD,IAAI,EAAjB,MAAM;QACmB,OAAO;KAC1C,EAKA;IAHC,0EAAkC;IAClC,aAAgB;IAChB,6BAAsB;IAGxB;;;;;;;;OAQG;IACH,4CANG;QAAqB,YAAY,EAAzB,MAAM;QACsE,KAAK,EAAjF;YAAC,aAAa,EAAE,MAAM,CAAC;YAAC,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;YAAC,QAAQ,EAAE,MAAM,CAAA;SAAC;QAC9B,KAAK,EAA5C,OAAO,gBAAgB,EAAE,OAAO;QACnB,IAAI,EAAjB,MAAM;KACd,GAAU,OAAO,CAAC;QAAC,UAAU,EAAE,MAAM,CAAA;KAAC,CAAC,CAqBzC;IAED;;;;;;;;OAQG;IACH,uCANG;QAAqB,UAAU,EAAvB,MAAM;QACiC,KAAK,EAA5C,OAAO,gBAAgB,EAAE,OAAO;QACnB,IAAI,EAAjB,MAAM;QACkB,GAAG,EAA3B,MAAM,CAAC,MAAM,EAAE,OAAC,CAAC;KACzB,GAAU,OAAO,CAAC,MAAM,CAAC,CAgB3B;IAED;;;;;;;;OAQG;IACH,yCANG;QAAqB,UAAU,EAAvB,MAAM;QACiC,KAAK,EAA5C,OAAO,gBAAgB,EAAE,OAAO;QACnB,IAAI,EAAjB,MAAM;QACkB,GAAG,EAA3B,MAAM,CAAC,MAAM,EAAE,OAAC,CAAC;KACzB,GAAU,OAAO,CAAC,IAAI,CAAC,CAYzB;IAED;;;;;;;;OAQG;IACH,sCANG;QAAqB,UAAU,EAAvB,MAAM;QACiC,KAAK,EAA5C,OAAO,gBAAgB,EAAE,OAAO;QACnB,IAAI,EAAjB,MAAM;QACkB,GAAG,EAA3B,MAAM,CAAC,MAAM,EAAE,OAAC,CAAC;KACzB,GAAU,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAgBlC;CACF"}
1
+ {"version":3,"file":"native.d.ts","sourceRoot":"","sources":["../../../../../../src/database/record/attachments/storage-drivers/native.js"],"names":[],"mappings":"AA2BA;;;GAGG;AACH;IACE;;;;;;OAMG;IACH,8CAJG;QAA8D,aAAa;QACtD,IAAI,EAAjB,MAAM;QACmB,OAAO;KAC1C,EAKA;IAHC,0EAAkC;IAClC,aAAgB;IAChB,6BAAsB;IAGxB;;;;;;;;OAQG;IACH,4CANG;QAAqB,YAAY,EAAzB,MAAM;QAC0D,KAAK,EAArE,OAAO,uBAAuB,EAAE,yBAAyB;QAClB,KAAK,EAA5C,OAAO,gBAAgB,EAAE,OAAO;QACnB,IAAI,EAAjB,MAAM;KACd,GAAU,OAAO,CAAC;QAAC,UAAU,EAAE,MAAM,CAAA;KAAC,CAAC,CAoCzC;IAED;;;;;;;;OAQG;IACH,uCANG;QAAqB,UAAU,EAAvB,MAAM;QACiC,KAAK,EAA5C,OAAO,gBAAgB,EAAE,OAAO;QACnB,IAAI,EAAjB,MAAM;QACkB,GAAG,EAA3B,MAAM,CAAC,MAAM,EAAE,OAAC,CAAC;KACzB,GAAU,OAAO,CAAC,MAAM,CAAC,CAgB3B;IAED;;;;;;;;OAQG;IACH,yCANG;QAAqB,UAAU,EAAvB,MAAM;QACiC,KAAK,EAA5C,OAAO,gBAAgB,EAAE,OAAO;QACnB,IAAI,EAAjB,MAAM;QACkB,GAAG,EAA3B,MAAM,CAAC,MAAM,EAAE,OAAC,CAAC;KACzB,GAAU,OAAO,CAAC,IAAI,CAAC,CAYzB;IAED;;;;;;;;OAQG;IACH,sCANG;QAAqB,UAAU,EAAvB,MAAM;QACiC,KAAK,EAA5C,OAAO,gBAAgB,EAAE,OAAO;QACnB,IAAI,EAAjB,MAAM;QACkB,GAAG,EAA3B,MAAM,CAAC,MAAM,EAAE,OAAC,CAAC;KACzB,GAAU,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAgBlC;CACF"}
@@ -46,7 +46,7 @@ export default class NativeAttachmentStorageDriver {
46
46
  * Runs write.
47
47
  * @param {object} args - Write args.
48
48
  * @param {string} args.attachmentId - Attachment id.
49
- * @param {{contentBase64: string, contentType: string | null, filename: string}} args.input - Normalized attachment input.
49
+ * @param {import("../normalize-input.js").NormalizedAttachmentInput} args.input - Normalized attachment input.
50
50
  * @param {import("../../index.js").default} args.model - Model instance.
51
51
  * @param {string} args.name - Attachment name.
52
52
  * @returns {Promise<{storageKey: string}>} - Storage key result.
@@ -55,10 +55,21 @@ export default class NativeAttachmentStorageDriver {
55
55
  if (typeof this.options.write !== "function") {
56
56
  throwMissingMethod({ driverName: this.name, methodName: "write" });
57
57
  }
58
+ let contentBase64 = input.contentBase64;
59
+ if (input.pathSource) {
60
+ // Native write callbacks have always received Base64. Path input is
61
+ // intentionally buffered here, after driver selection, to preserve that
62
+ // public callback contract without forcing filesystem/S3 to buffer.
63
+ const contentBuffer = await input.pathSource.readBuffer();
64
+ contentBase64 = contentBuffer.toString("base64");
65
+ }
66
+ if (contentBase64 === null) {
67
+ throw new Error(`Attachment storage driver "${this.name}" input has no content`);
68
+ }
58
69
  const result = await this.options.write({
59
70
  attachmentId,
60
71
  attachmentName: name,
61
- contentBase64: input.contentBase64,
72
+ contentBase64,
62
73
  contentType: input.contentType,
63
74
  filename: input.filename,
64
75
  model
@@ -134,4 +145,4 @@ export default class NativeAttachmentStorageDriver {
134
145
  return null;
135
146
  }
136
147
  }
137
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibmF0aXZlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vc3JjL2RhdGFiYXNlL3JlY29yZC9hdHRhY2htZW50cy9zdG9yYWdlLWRyaXZlcnMvbmF0aXZlLmpzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLFlBQVk7QUFFWjs7Ozs7O0dBTUc7QUFDSCxTQUFTLGtCQUFrQixDQUFDLEVBQUMsVUFBVSxFQUFFLFVBQVUsRUFBQztJQUNsRCxNQUFNLElBQUksS0FBSyxDQUFDLDhCQUE4QixVQUFVLGlCQUFpQixVQUFVLFlBQVksQ0FBQyxDQUFBO0FBQ2xHLENBQUM7QUFFRDs7OztHQUlHO0FBQ0gsU0FBUyxRQUFRLENBQUMsS0FBSztJQUNyQixJQUFJLE1BQU0sQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDO1FBQUUsT0FBTyxLQUFLLENBQUE7SUFDeEMsSUFBSSxLQUFLLFlBQVksVUFBVTtRQUFFLE9BQU8sTUFBTSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQTtJQUMxRCxJQUFJLEtBQUssWUFBWSxXQUFXO1FBQUUsT0FBTyxNQUFNLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFBO0lBQzNELElBQUksT0FBTyxLQUFLLEtBQUssUUFBUTtRQUFFLE9BQU8sTUFBTSxDQUFDLElBQUksQ0FBQyxLQUFLLEVBQUUsUUFBUSxDQUFDLENBQUE7SUFFbEUsTUFBTSxJQUFJLEtBQUssQ0FBQyw4Q0FBOEMsTUFBTSxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUMsQ0FBQTtBQUNoRixDQUFDO0FBRUQ7OztHQUdHO0FBQ0gsTUFBTSxDQUFDLE9BQU8sT0FBTyw2QkFBNkI7SUFDaEQ7Ozs7OztPQU1HO0lBQ0gsWUFBWSxFQUFDLGFBQWEsRUFBRSxJQUFJLEVBQUUsT0FBTyxHQUFHLEVBQUUsRUFBQztRQUM3QyxJQUFJLENBQUMsYUFBYSxHQUFHLGFBQWEsQ0FBQTtRQUNsQyxJQUFJLENBQUMsSUFBSSxHQUFHLElBQUksQ0FB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QVU7U0FDWCxDQUFDLENBQUE7UUFFRixJQUFJLE9BQU8sS0FBSyxLQUFLLFFBQVEsSUFBSSxLQUFLLENBQUMsTUFBTSxHQUFHLENBQUM7WUFBRSxPQUFPLEtBQUssQ0FBQTtRQUUvRCxPQUFPLElBQUksQ0FBQTtJQUNiLENBQUM7Q0FDRiIsInNvdXJjZXNDb250ZW50IjpbIi8vIEB0cy1jaGVja1xuXG4vKipcbiAqIFJ1bnMgdGhyb3cgbWlzc2luZyBtZXRob2QuXG4gKiBAcGFyYW0ge29iamVjdH0gYXJncyAtIEFyZ3MuXG4gKiBAcGFyYW0ge3N0cmluZ30gYXJncy5kcml2ZXJOYW1lIC0gRHJpdmVyIG5hbWUuXG4gKiBAcGFyYW0ge3N0cmluZ30gYXJncy5tZXRob2ROYW1lIC0gTWV0aG9kIG5hbWUuXG4gKiBAcmV0dXJucyB7bmV2ZXJ9IC0gQWx3YXlzIHRocm93cy5cbiAqL1xuZnVuY3Rpb24gdGhyb3dNaXNzaW5nTWV0aG9kKHtkcml2ZXJOYW1lLCBtZXRob2ROYW1lfSkge1xuICB0aHJvdyBuZXcgRXJyb3IoYEF0dGFjaG1lbnQgc3RvcmFnZSBkcml2ZXIgXCIke2RyaXZlck5hbWV9XCIgcmVxdWlyZXMgYSBcIiR7bWV0aG9kTmFtZX1cIiBjYWxsYmFja2ApXG59XG5cbi8qKlxuICogUnVucyB0byBidWZmZXIuXG4gKiBAcGFyYW0gez99IHZhbHVlIC0gQ2FuZGlkYXRlIHZhbHVlLlxuICogQHJldHVybnMge0J1ZmZlcn0gLSBCdWZmZXIgdmFsdWUuXG4gKi9cbmZ1bmN0aW9uIHRvQnVmZmVyKHZhbHVlKSB7XG4gIGlmIChCdWZmZXIuaXNCdWZmZXIodmFsdWUpKSByZXR1cm4gdmFsdWVcbiAgaWYgKHZhbHVlIGluc3RhbmNlb2YgVWludDhBcnJheSkgcmV0dXJuIEJ1ZmZlci5mcm9tKHZhbHVlKVxuICBpZiAodmFsdWUgaW5zdGFuY2VvZiBBcnJheUJ1ZmZlcikgcmV0dXJuIEJ1ZmZlci5mcm9tKHZhbHVlKVxuICBpZiAodHlwZW9mIHZhbHVlID09PSBcInN0cmluZ1wiKSByZXR1cm4gQnVmZmVyLmZyb20odmFsdWUsIFwiYmFzZTY0XCIpXG5cbiAgdGhyb3cgbmV3IEVycm9yKGBVbnN1cHBvcnRlZCBuYXRpdmUgYXR0YWNobWVudCByZWFkIHJlc3VsdDogJHtTdHJpbmcodmFsdWUpfWApXG59XG5cbi8qKlxuICogTmF0aXZlIGF0dGFjaG1lbnQgc3RvcmFnZSBkcml2ZXIuXG4gKiBUaGlzIGRyaXZlciBkZWxlZ2F0ZXMgYWxsIEkvTyB0byB1c2VyLXByb3ZpZGVkIGNhbGxiYWNrcy5cbiAqL1xuZXhwb3J0IGRlZmF1bHQgY2xhc3MgTmF0aXZlQXR0YWNobWVudFN0b3JhZ2VEcml2ZXIge1xuICAvKipcbiAgICogUnVucyBjb25zdHJ1Y3Rvci5cbiAgICogQHBhcmFtIHtvYmplY3R9IGFyZ3MgLSBPcHRpb25zLlxuICAgKiBAcGFyYW0ge2ltcG9ydChcIi4uLy4uLy4uLy4uL2NvbmZpZ3VyYXRpb24uanNcIikuZGVmYXVsdH0gW2FyZ3MuY29uZmlndXJhdGlvbl0gLSBDb25maWd1cmF0aW9uIGluc3RhbmNlLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gYXJncy5uYW1lIC0gRHJpdmVyIG5hbWUuXG4gICAqIEBwYXJhbSB7UmVjb3JkPHN0cmluZywgPz59IFthcmdzLm9wdGlvbnNdIC0gRHJpdmVyIG9wdGlvbnMuXG4gICAqL1xuICBjb25zdHJ1Y3Rvcih7Y29uZmlndXJhdGlvbiwgbmFtZSwgb3B0aW9ucyA9IHt9fSkge1xuICAgIHRoaXMuY29uZmlndXJhdGlvbiA9IGNvbmZpZ3VyYXRpb25cbiAgICB0aGlzLm5hbWUgPSBuYW1lXG4gICAgdGhpcy5vcHRpb25zID0gb3B0aW9uc1xuICB9XG5cbiAgLyoqXG4gICAqIFJ1bnMgd3JpdGUuXG4gICAqIEBwYXJhbSB7b2JqZWN0fSBhcmdzIC0gV3JpdGUgYXJncy5cbiAgICogQHBhcmFtIHtzdHJpbmd9IGFyZ3MuYXR0YWNobWVudElkIC0gQXR0YWNobWVudCBpZC5cbiAgICogQHBhcmFtIHt7Y29udGVudEJhc2U2NDogc3RyaW5nLCBjb250ZW50VHlwZTogc3RyaW5nIHwgbnVsbCwgZmlsZW5hbWU6IHN0cmluZ319IGFyZ3MuaW5wdXQgLSBOb3JtYWxpemVkIGF0dGFjaG1lbnQgaW5wdXQuXG4gICAqIEBwYXJhbSB7aW1wb3J0KFwiLi4vLi4vaW5kZXguanNcIikuZGVmYXVsdH0gYXJncy5tb2RlbCAtIE1vZGVsIGluc3RhbmNlLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gYXJncy5uYW1lIC0gQXR0YWNobWVudCBuYW1lLlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTx7c3RvcmFnZUtleTogc3RyaW5nfT59IC0gU3RvcmFnZSBrZXkgcmVzdWx0LlxuICAgKi9cbiAgYXN5bmMgd3JpdGUoe2F0dGFjaG1lbnRJZCwgaW5wdXQsIG1vZGVsLCBuYW1lfSkge1xuICAgIGlmICh0eXBlb2YgdGhpcy5vcHRpb25zLndyaXRlICE9PSBcImZ1bmN0aW9uXCIpIHtcbiAgICAgIHRocm93TWlzc2luZ01ldGhvZCh7ZHJpdmVyTmFtZTogdGhpcy5uYW1lLCBtZXRob2ROYW1lOiBcIndyaXRlXCJ9KVxuICAgIH1cblxuICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHRoaXMub3B0aW9ucy53cml0ZSh7XG4gICAgICBhdHRhY2htZW50SWQsXG4gICAgICBhdHRhY2htZW50TmFtZTogbmFtZSxcbiAgICAgIGNvbnRlbnRCYXNlNjQ6IGlucHV0LmNvbnRlbnRCYXNlNjQsXG4gICAgICBjb250ZW50VHlwZTogaW5wdXQuY29udGVudFR5cGUsXG4gICAgICBmaWxlbmFtZTogaW5wdXQuZmlsZW5hbWUsXG4gICAgICBtb2RlbFxuICAgIH0pXG5cbiAgICBpZiAoIXJlc3VsdCB8fCB0eXBlb2YgcmVzdWx0LnN0b3JhZ2VLZXkgIT09IFwic3RyaW5nXCIgfHwgcmVzdWx0LnN0b3JhZ2VLZXkubGVuZ3RoIDwgMSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBBdHRhY2htZW50IHN0b3JhZ2UgZHJpdmVyIFwiJHt0aGlzLm5hbWV9XCIgd3JpdGUgY2FsbGJhY2sgbXVzdCByZXR1cm4ge3N0b3JhZ2VLZXl9YClcbiAgICB9XG5cbiAgICByZXR1cm4ge3N0b3JhZ2VLZXk6IHJlc3VsdC5zdG9yYWdlS2V5fVxuICB9XG5cbiAgLyoqXG4gICAqIFJ1bnMgcmVhZC5cbiAgICogQHBhcmFtIHtvYmplY3R9IGFyZ3MgLSBSZWFkIGFyZ3MuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBhcmdzLnN0b3JhZ2VLZXkgLSBTdG9yYWdlIGtleS5cbiAgICogQHBhcmFtIHtpbXBvcnQoXCIuLi8uLi9pbmRleC5qc1wiKS5kZWZhdWx0fSBhcmdzLm1vZGVsIC0gTW9kZWwgaW5zdGFuY2UuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBhcmdzLm5hbWUgLSBBdHRhY2htZW50IG5hbWUuXG4gICAqIEBwYXJhbSB7UmVjb3JkPHN0cmluZywgPz59IGFyZ3Mucm93IC0gQXR0YWNobWVudCByb3cuXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPEJ1ZmZlcj59IC0gQXR0YWNobWVudCBieXRlcy5cbiAgICovXG4gIGFzeW5jIHJlYWQoe21vZGVsLCBuYW1lLCByb3csIHN0b3JhZ2VLZXl9KSB7XG4gICAgaWYgKHR5cGVvZiB0aGlzLm9wdGlvbnMucmVhZCAhPT0gXCJmdW5jdGlvblwiKSB7XG4gICAgICB0aHJvd01pc3NpbmdNZXRob2Qoe2RyaXZlck5hbWU6IHRoaXMubmFtZSwgbWV0aG9kTmFtZTogXCJyZWFkXCJ9KVxuICAgIH1cblxuICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHRoaXMub3B0aW9ucy5yZWFkKHtcbiAgICAgIGF0dGFjaG1lbnRJZDogcm93LmlkIHx8IFwiXCIsXG4gICAgICBhdHRhY2htZW50TmFtZTogbmFtZSxcbiAgICAgIG1vZGVsLFxuICAgICAgcm93LFxuICAgICAgc3RvcmFnZUtleVxuICAgIH0pXG5cbiAgICByZXR1cm4gdG9CdWZmZXIocmVzdWx0KVxuICB9XG5cbiAgLyoqXG4gICAqIFJ1bnMgZGVsZXRlLlxuICAgKiBAcGFyYW0ge29iamVjdH0gYXJncyAtIERlbGV0ZSBhcmdzLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gYXJncy5zdG9yYWdlS2V5IC0gU3RvcmFnZSBrZXkuXG4gICAqIEBwYXJhbSB7aW1wb3J0KFwiLi4vLi4vaW5kZXguanNcIikuZGVmYXVsdH0gYXJncy5tb2RlbCAtIE1vZGVsIGluc3RhbmNlLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gYXJncy5uYW1lIC0gQXR0YWNobWVudCBuYW1lLlxuICAgKiBAcGFyYW0ge1JlY29yZDxzdHJpbmcsID8+fSBhcmdzLnJvdyAtIEF0dGFjaG1lbnQgcm93LlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTx2b2lkPn0gLSBSZXNvbHZlcyB3aGVuIGRlbGV0ZWQuXG4gICAqL1xuICBhc3luYyBkZWxldGUoe21vZGVsLCBuYW1lLCByb3csIHN0b3JhZ2VLZXl9KSB7XG4gICAgaWYgKHR5cGVvZiB0aGlzLm9wdGlvbnMuZGVsZXRlICE9PSBcImZ1bmN0aW9uXCIpIHJldHVyblxuXG4gICAgYXdhaXQgdGhpcy5vcHRpb25zLmRlbGV0ZSh7XG4gICAgICBhdHRhY2htZW50SWQ6IHJvdy5pZCB8fCBcIlwiLFxuICAgICAgYXR0YWNobWVudE5hbWU6IG5hbWUsXG4gICAgICBtb2RlbCxcbiAgICAgIHJvdyxcbiAgICAgIHN0b3JhZ2VLZXlcbiAgICB9KVxuICB9XG5cbiAgLyoqXG4gICAqIFJ1bnMgdXJsLlxuICAgKiBAcGFyYW0ge29iamVjdH0gYXJncyAtIFVSTCBhcmdzLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gYXJncy5zdG9yYWdlS2V5IC0gU3RvcmFnZSBrZXkuXG4gICAqIEBwYXJhbSB7aW1wb3J0KFwiLi4vLi4vaW5kZXguanNcIikuZGVmYXVsdH0gYXJncy5tb2RlbCAtIE1vZGVsIGluc3RhbmNlLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gYXJncy5uYW1lIC0gQXR0YWNobWVudCBuYW1lLlxuICAgKiBAcGFyYW0ge1JlY29yZDxzdHJpbmcsID8+fSBhcmdzLnJvdyAtIEF0dGFjaG1lbnQgcm93LlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTxzdHJpbmcgfCBudWxsPn0gLSBBdHRhY2htZW50IFVSTC5cbiAgICovXG4gIGFzeW5jIHVybCh7bW9kZWwsIG5hbWUsIHJvdywgc3RvcmFnZUtleX0pIHtcbiAgICBpZiAodHlwZW9mIHRoaXMub3B0aW9ucy51cmwgIT09IFwiZnVuY3Rpb25cIikgcmV0dXJuIG51bGxcblxuICAgIGNvbnN0IHZhbHVlID0gYXdhaXQgdGhpcy5vcHRpb25zLnVybCh7XG4gICAgICBhdHRhY2htZW50SWQ6IHJvdy5pZCB8fCBcIlwiLFxuICAgICAgYXR0YWNobWVudE5hbWU6IG5hbWUsXG4gICAgICBtb2RlbCxcbiAgICAgIHJvdyxcbiAgICAgIHN0b3JhZ2VLZXlcbiAgICB9KVxuXG4gICAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gXCJzdHJpbmdcIiAmJiB2YWx1ZS5sZW5ndGggPiAwKSByZXR1cm4gdmFsdWVcblxuICAgIHJldHVybiBudWxsXG4gIH1cbn1cbiJdfQ==
148
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibmF0aXZlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vc3JjL2RhdGFiYXNlL3JlY29yZC9hdHRhY2htZW50cy9zdG9yYWdlLWRyaXZlcnMvbmF0aXZlLmpzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLFlBQVk7QUFFWjs7Ozs7O0dBTUc7QUFDSCxTQUFTLGtCQUFrQixDQUFDLEVBQUMsVUFBVSxFQUFFLFVBQVUsRUFBQztJQUNsRCxNQUFNLElBQUksS0FBSyxDQUFDLDhCQUE4QixVQUFVLGlCQUFpQixVQUFVLFlBQVksQ0FBQyxDQUFBO0FBQ2xHLENBQUM7QUFFRDs7OztHQUlHO0FBQ0gsU0FBUyxRQUFRLENBQUMsS0FBSztJQUNyQixJQUFJLE1BQU0sQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDO1FBQUUsT0FBTyxLQUFLLENBQUE7SUFDeEMsSUFBSSxLQUFLLFlBQVksVUFBVTtRQUFFLE9BQU8sTUFBTSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQTtJQUMxRCxJQUFJLEtBQUssWUFBWSxXQUFXO1FBQUUsT0FBTyxNQUFNLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFBO0lBQzNELElBQUksT0FBTyxLQUFLLEtBQUssUUFBUTtRQUFFLE9BQU8sTUFBTSxDQUFDLElBQUksQ0FBQyxLQUFLLEVBQUUsUUFBUSxDQUFDLENBQUE7SUFFbEUsTUFBTSxJQUFJLEtBQUssQ0FBQyw4Q0FBOEMsTUFBTSxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUMsQ0FBQTtBQUNoRixDQUFDO0FBRUQ7OztHQUdHO0FBQ0gsTUFBTSxDQUFDLE9BQU8sT0FBTyw2QkFBNkI7SUFDaEQ7Ozs7OztPQU1HO0lBQ0gsWUFBWSxFQUFDLGFBQWEsRUFBRSxJQUFJLEVBQUUsT0FBTyxHQUFHLEVBQUUsRUFBQztRQUM3QyxJQUFJLENBQUMsYUFBYSxHQUFHLGFBQWEsQ0FBQTtRQUNsQyxJQUFJLENBQUMsSUFBSSxHQUFHLElBQUksQ0FB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QUNYLENBQUMsQ0FBQTtJQUNKLENBQUM7SUFFRDs7Ozs7Ozs7T0FRRztJQUNILEtBQUssQ0FBQyxHQUFHLENBQUMsRUFBQyxLQUFLLEVBQUUsSUFBSSxFQUFFLEdBQUcsRUFBRSxVQUFVLEVBQUM7UUFDdEMsSUFBSSxPQUFPLElBQUksQ0FBQyxPQUFPLENBQUMsR0FBRyxLQUFLLFVBQVU7WUFBRSxPQUFPLElBQUksQ0FBQTtRQUV2RCxNQUFNLEtBQUssR0FBRyxNQUFNLElBQUksQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDO1lBQ25DLFlBQVksRUFBRSxHQUFHLENBQUMsRUFBRSxJQUFJLEVBQUU7WUFDMUIsY0FBYyxFQUFFLElBQUk7WUFDcEIsS0FBSztZQUNMLEdBQUc7WUFDSCxVQUFVO1NBQ1gsQ0FBQyxDQUFBO1FBRUYsSUFBSSxPQUFPLEtBQUssS0FBSyxRQUFRLElBQUksS0FBSyxDQUFDLE1BQU0sR0FBRyxDQUFDO1lBQUUsT0FBTyxLQUFLLENBQUE7UUFFL0QsT0FBTyxJQUFJLENBQUE7SUFDYixDQUFDO0NBQ0YiLCJzb3VyY2VzQ29udGVudCI6WyIvLyBAdHMtY2hlY2tcblxuLyoqXG4gKiBSdW5zIHRocm93IG1pc3NpbmcgbWV0aG9kLlxuICogQHBhcmFtIHtvYmplY3R9IGFyZ3MgLSBBcmdzLlxuICogQHBhcmFtIHtzdHJpbmd9IGFyZ3MuZHJpdmVyTmFtZSAtIERyaXZlciBuYW1lLlxuICogQHBhcmFtIHtzdHJpbmd9IGFyZ3MubWV0aG9kTmFtZSAtIE1ldGhvZCBuYW1lLlxuICogQHJldHVybnMge25ldmVyfSAtIEFsd2F5cyB0aHJvd3MuXG4gKi9cbmZ1bmN0aW9uIHRocm93TWlzc2luZ01ldGhvZCh7ZHJpdmVyTmFtZSwgbWV0aG9kTmFtZX0pIHtcbiAgdGhyb3cgbmV3IEVycm9yKGBBdHRhY2htZW50IHN0b3JhZ2UgZHJpdmVyIFwiJHtkcml2ZXJOYW1lfVwiIHJlcXVpcmVzIGEgXCIke21ldGhvZE5hbWV9XCIgY2FsbGJhY2tgKVxufVxuXG4vKipcbiAqIFJ1bnMgdG8gYnVmZmVyLlxuICogQHBhcmFtIHs/fSB2YWx1ZSAtIENhbmRpZGF0ZSB2YWx1ZS5cbiAqIEByZXR1cm5zIHtCdWZmZXJ9IC0gQnVmZmVyIHZhbHVlLlxuICovXG5mdW5jdGlvbiB0b0J1ZmZlcih2YWx1ZSkge1xuICBpZiAoQnVmZmVyLmlzQnVmZmVyKHZhbHVlKSkgcmV0dXJuIHZhbHVlXG4gIGlmICh2YWx1ZSBpbnN0YW5jZW9mIFVpbnQ4QXJyYXkpIHJldHVybiBCdWZmZXIuZnJvbSh2YWx1ZSlcbiAgaWYgKHZhbHVlIGluc3RhbmNlb2YgQXJyYXlCdWZmZXIpIHJldHVybiBCdWZmZXIuZnJvbSh2YWx1ZSlcbiAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gXCJzdHJpbmdcIikgcmV0dXJuIEJ1ZmZlci5mcm9tKHZhbHVlLCBcImJhc2U2NFwiKVxuXG4gIHRocm93IG5ldyBFcnJvcihgVW5zdXBwb3J0ZWQgbmF0aXZlIGF0dGFjaG1lbnQgcmVhZCByZXN1bHQ6ICR7U3RyaW5nKHZhbHVlKX1gKVxufVxuXG4vKipcbiAqIE5hdGl2ZSBhdHRhY2htZW50IHN0b3JhZ2UgZHJpdmVyLlxuICogVGhpcyBkcml2ZXIgZGVsZWdhdGVzIGFsbCBJL08gdG8gdXNlci1wcm92aWRlZCBjYWxsYmFja3MuXG4gKi9cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIE5hdGl2ZUF0dGFjaG1lbnRTdG9yYWdlRHJpdmVyIHtcbiAgLyoqXG4gICAqIFJ1bnMgY29uc3RydWN0b3IuXG4gICAqIEBwYXJhbSB7b2JqZWN0fSBhcmdzIC0gT3B0aW9ucy5cbiAgICogQHBhcmFtIHtpbXBvcnQoXCIuLi8uLi8uLi8uLi9jb25maWd1cmF0aW9uLmpzXCIpLmRlZmF1bHR9IFthcmdzLmNvbmZpZ3VyYXRpb25dIC0gQ29uZmlndXJhdGlvbiBpbnN0YW5jZS5cbiAgICogQHBhcmFtIHtzdHJpbmd9IGFyZ3MubmFtZSAtIERyaXZlciBuYW1lLlxuICAgKiBAcGFyYW0ge1JlY29yZDxzdHJpbmcsID8+fSBbYXJncy5vcHRpb25zXSAtIERyaXZlciBvcHRpb25zLlxuICAgKi9cbiAgY29uc3RydWN0b3Ioe2NvbmZpZ3VyYXRpb24sIG5hbWUsIG9wdGlvbnMgPSB7fX0pIHtcbiAgICB0aGlzLmNvbmZpZ3VyYXRpb24gPSBjb25maWd1cmF0aW9uXG4gICAgdGhpcy5uYW1lID0gbmFtZVxuICAgIHRoaXMub3B0aW9ucyA9IG9wdGlvbnNcbiAgfVxuXG4gIC8qKlxuICAgKiBSdW5zIHdyaXRlLlxuICAgKiBAcGFyYW0ge29iamVjdH0gYXJncyAtIFdyaXRlIGFyZ3MuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBhcmdzLmF0dGFjaG1lbnRJZCAtIEF0dGFjaG1lbnQgaWQuXG4gICAqIEBwYXJhbSB7aW1wb3J0KFwiLi4vbm9ybWFsaXplLWlucHV0LmpzXCIpLk5vcm1hbGl6ZWRBdHRhY2htZW50SW5wdXR9IGFyZ3MuaW5wdXQgLSBOb3JtYWxpemVkIGF0dGFjaG1lbnQgaW5wdXQuXG4gICAqIEBwYXJhbSB7aW1wb3J0KFwiLi4vLi4vaW5kZXguanNcIikuZGVmYXVsdH0gYXJncy5tb2RlbCAtIE1vZGVsIGluc3RhbmNlLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gYXJncy5uYW1lIC0gQXR0YWNobWVudCBuYW1lLlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTx7c3RvcmFnZUtleTogc3RyaW5nfT59IC0gU3RvcmFnZSBrZXkgcmVzdWx0LlxuICAgKi9cbiAgYXN5bmMgd3JpdGUoe2F0dGFjaG1lbnRJZCwgaW5wdXQsIG1vZGVsLCBuYW1lfSkge1xuICAgIGlmICh0eXBlb2YgdGhpcy5vcHRpb25zLndyaXRlICE9PSBcImZ1bmN0aW9uXCIpIHtcbiAgICAgIHRocm93TWlzc2luZ01ldGhvZCh7ZHJpdmVyTmFtZTogdGhpcy5uYW1lLCBtZXRob2ROYW1lOiBcIndyaXRlXCJ9KVxuICAgIH1cblxuICAgIGxldCBjb250ZW50QmFzZTY0ID0gaW5wdXQuY29udGVudEJhc2U2NFxuXG4gICAgaWYgKGlucHV0LnBhdGhTb3VyY2UpIHtcbiAgICAgIC8vIE5hdGl2ZSB3cml0ZSBjYWxsYmFja3MgaGF2ZSBhbHdheXMgcmVjZWl2ZWQgQmFzZTY0LiBQYXRoIGlucHV0IGlzXG4gICAgICAvLyBpbnRlbnRpb25hbGx5IGJ1ZmZlcmVkIGhlcmUsIGFmdGVyIGRyaXZlciBzZWxlY3Rpb24sIHRvIHByZXNlcnZlIHRoYXRcbiAgICAgIC8vIHB1YmxpYyBjYWxsYmFjayBjb250cmFjdCB3aXRob3V0IGZvcmNpbmcgZmlsZXN5c3RlbS9TMyB0byBidWZmZXIuXG4gICAgICBjb25zdCBjb250ZW50QnVmZmVyID0gYXdhaXQgaW5wdXQucGF0aFNvdXJjZS5yZWFkQnVmZmVyKClcblxuICAgICAgY29udGVudEJhc2U2NCA9IGNvbnRlbnRCdWZmZXIudG9TdHJpbmcoXCJiYXNlNjRcIilcbiAgICB9XG5cbiAgICBpZiAoY29udGVudEJhc2U2NCA9PT0gbnVsbCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBBdHRhY2htZW50IHN0b3JhZ2UgZHJpdmVyIFwiJHt0aGlzLm5hbWV9XCIgaW5wdXQgaGFzIG5vIGNvbnRlbnRgKVxuICAgIH1cblxuICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHRoaXMub3B0aW9ucy53cml0ZSh7XG4gICAgICBhdHRhY2htZW50SWQsXG4gICAgICBhdHRhY2htZW50TmFtZTogbmFtZSxcbiAgICAgIGNvbnRlbnRCYXNlNjQsXG4gICAgICBjb250ZW50VHlwZTogaW5wdXQuY29udGVudFR5cGUsXG4gICAgICBmaWxlbmFtZTogaW5wdXQuZmlsZW5hbWUsXG4gICAgICBtb2RlbFxuICAgIH0pXG5cbiAgICBpZiAoIXJlc3VsdCB8fCB0eXBlb2YgcmVzdWx0LnN0b3JhZ2VLZXkgIT09IFwic3RyaW5nXCIgfHwgcmVzdWx0LnN0b3JhZ2VLZXkubGVuZ3RoIDwgMSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBBdHRhY2htZW50IHN0b3JhZ2UgZHJpdmVyIFwiJHt0aGlzLm5hbWV9XCIgd3JpdGUgY2FsbGJhY2sgbXVzdCByZXR1cm4ge3N0b3JhZ2VLZXl9YClcbiAgICB9XG5cbiAgICByZXR1cm4ge3N0b3JhZ2VLZXk6IHJlc3VsdC5zdG9yYWdlS2V5fVxuICB9XG5cbiAgLyoqXG4gICAqIFJ1bnMgcmVhZC5cbiAgICogQHBhcmFtIHtvYmplY3R9IGFyZ3MgLSBSZWFkIGFyZ3MuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBhcmdzLnN0b3JhZ2VLZXkgLSBTdG9yYWdlIGtleS5cbiAgICogQHBhcmFtIHtpbXBvcnQoXCIuLi8uLi9pbmRleC5qc1wiKS5kZWZhdWx0fSBhcmdzLm1vZGVsIC0gTW9kZWwgaW5zdGFuY2UuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBhcmdzLm5hbWUgLSBBdHRhY2htZW50IG5hbWUuXG4gICAqIEBwYXJhbSB7UmVjb3JkPHN0cmluZywgPz59IGFyZ3Mucm93IC0gQXR0YWNobWVudCByb3cuXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPEJ1ZmZlcj59IC0gQXR0YWNobWVudCBieXRlcy5cbiAgICovXG4gIGFzeW5jIHJlYWQoe21vZGVsLCBuYW1lLCByb3csIHN0b3JhZ2VLZXl9KSB7XG4gICAgaWYgKHR5cGVvZiB0aGlzLm9wdGlvbnMucmVhZCAhPT0gXCJmdW5jdGlvblwiKSB7XG4gICAgICB0aHJvd01pc3NpbmdNZXRob2Qoe2RyaXZlck5hbWU6IHRoaXMubmFtZSwgbWV0aG9kTmFtZTogXCJyZWFkXCJ9KVxuICAgIH1cblxuICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHRoaXMub3B0aW9ucy5yZWFkKHtcbiAgICAgIGF0dGFjaG1lbnRJZDogcm93LmlkIHx8IFwiXCIsXG4gICAgICBhdHRhY2htZW50TmFtZTogbmFtZSxcbiAgICAgIG1vZGVsLFxuICAgICAgcm93LFxuICAgICAgc3RvcmFnZUtleVxuICAgIH0pXG5cbiAgICByZXR1cm4gdG9CdWZmZXIocmVzdWx0KVxuICB9XG5cbiAgLyoqXG4gICAqIFJ1bnMgZGVsZXRlLlxuICAgKiBAcGFyYW0ge29iamVjdH0gYXJncyAtIERlbGV0ZSBhcmdzLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gYXJncy5zdG9yYWdlS2V5IC0gU3RvcmFnZSBrZXkuXG4gICAqIEBwYXJhbSB7aW1wb3J0KFwiLi4vLi4vaW5kZXguanNcIikuZGVmYXVsdH0gYXJncy5tb2RlbCAtIE1vZGVsIGluc3RhbmNlLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gYXJncy5uYW1lIC0gQXR0YWNobWVudCBuYW1lLlxuICAgKiBAcGFyYW0ge1JlY29yZDxzdHJpbmcsID8+fSBhcmdzLnJvdyAtIEF0dGFjaG1lbnQgcm93LlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTx2b2lkPn0gLSBSZXNvbHZlcyB3aGVuIGRlbGV0ZWQuXG4gICAqL1xuICBhc3luYyBkZWxldGUoe21vZGVsLCBuYW1lLCByb3csIHN0b3JhZ2VLZXl9KSB7XG4gICAgaWYgKHR5cGVvZiB0aGlzLm9wdGlvbnMuZGVsZXRlICE9PSBcImZ1bmN0aW9uXCIpIHJldHVyblxuXG4gICAgYXdhaXQgdGhpcy5vcHRpb25zLmRlbGV0ZSh7XG4gICAgICBhdHRhY2htZW50SWQ6IHJvdy5pZCB8fCBcIlwiLFxuICAgICAgYXR0YWNobWVudE5hbWU6IG5hbWUsXG4gICAgICBtb2RlbCxcbiAgICAgIHJvdyxcbiAgICAgIHN0b3JhZ2VLZXlcbiAgICB9KVxuICB9XG5cbiAgLyoqXG4gICAqIFJ1bnMgdXJsLlxuICAgKiBAcGFyYW0ge29iamVjdH0gYXJncyAtIFVSTCBhcmdzLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gYXJncy5zdG9yYWdlS2V5IC0gU3RvcmFnZSBrZXkuXG4gICAqIEBwYXJhbSB7aW1wb3J0KFwiLi4vLi4vaW5kZXguanNcIikuZGVmYXVsdH0gYXJncy5tb2RlbCAtIE1vZGVsIGluc3RhbmNlLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gYXJncy5uYW1lIC0gQXR0YWNobWVudCBuYW1lLlxuICAgKiBAcGFyYW0ge1JlY29yZDxzdHJpbmcsID8+fSBhcmdzLnJvdyAtIEF0dGFjaG1lbnQgcm93LlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTxzdHJpbmcgfCBudWxsPn0gLSBBdHRhY2htZW50IFVSTC5cbiAgICovXG4gIGFzeW5jIHVybCh7bW9kZWwsIG5hbWUsIHJvdywgc3RvcmFnZUtleX0pIHtcbiAgICBpZiAodHlwZW9mIHRoaXMub3B0aW9ucy51cmwgIT09IFwiZnVuY3Rpb25cIikgcmV0dXJuIG51bGxcblxuICAgIGNvbnN0IHZhbHVlID0gYXdhaXQgdGhpcy5vcHRpb25zLnVybCh7XG4gICAgICBhdHRhY2htZW50SWQ6IHJvdy5pZCB8fCBcIlwiLFxuICAgICAgYXR0YWNobWVudE5hbWU6IG5hbWUsXG4gICAgICBtb2RlbCxcbiAgICAgIHJvdyxcbiAgICAgIHN0b3JhZ2VLZXlcbiAgICB9KVxuXG4gICAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gXCJzdHJpbmdcIiAmJiB2YWx1ZS5sZW5ndGggPiAwKSByZXR1cm4gdmFsdWVcblxuICAgIHJldHVybiBudWxsXG4gIH1cbn1cbiJdfQ==
@@ -49,16 +49,12 @@ export default class S3AttachmentStorageDriver {
49
49
  * Runs write.
50
50
  * @param {object} args - Write args.
51
51
  * @param {string} args.attachmentId - Attachment id.
52
- * @param {{contentBuffer: Buffer, contentType: string | null, filename: string}} args.input - Normalized attachment input.
52
+ * @param {import("../normalize-input.js").NormalizedAttachmentInput} args.input - Normalized attachment input.
53
53
  * @returns {Promise<{storageKey: string}>} - Storage key.
54
54
  */
55
55
  write({ attachmentId, input }: {
56
56
  attachmentId: string;
57
- input: {
58
- contentBuffer: Buffer;
59
- contentType: string | null;
60
- filename: string;
61
- };
57
+ input: import("../normalize-input.js").NormalizedAttachmentInput;
62
58
  }): Promise<{
63
59
  storageKey: string;
64
60
  }>;
@@ -1 +1 @@
1
- {"version":3,"file":"s3.d.ts","sourceRoot":"","sources":["../../../../../../src/database/record/attachments/storage-drivers/s3.js"],"names":[],"mappings":"AAuEA;;GAEG;AACH;IACE;;;;OAIG;IACH,yBAFG;QAAiC,OAAO;KAC1C,EAIA;IAFC,6BAAsB;IACtB;;;;;;cAA0B;IAG5B;;;OAGG;IACH,UAFa,MAAM,CAUlB;IAED;;;OAGG;IACH,sBAFa,MAAM,CAQlB;IAED;;;OAGG;IACH,aAFa,OAAO,CAAC;QAAC,QAAQ,EAAE,OAAC,CAAC;QAAC,gBAAgB,EAAE,OAAC,CAAC;QAAC,gBAAgB,EAAE,OAAC,CAAC;QAAC,mBAAmB,EAAE,OAAC,CAAC;QAAC,YAAY,EAAE,OAAC,CAAA;KAAC,CAAC,CAerH;IAED;;;OAGG;IACH,UAFa,OAAO,CAAC,OAAC,CAAC,CA+BtB;IAJG,aAAyC;IAM7C;;;;;;OAMG;IACH,+BAJG;QAAqB,YAAY,EAAzB,MAAM;QACsE,KAAK,EAAjF;YAAC,aAAa,EAAE,MAAM,CAAC;YAAC,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;YAAC,QAAQ,EAAE,MAAM,CAAA;SAAC;KAC7E,GAAU,OAAO,CAAC;QAAC,UAAU,EAAE,MAAM,CAAA;KAAC,CAAC,CAezC;IAED;;;;;OAKG;IACH,qBAHG;QAAqB,UAAU,EAAvB,MAAM;KACd,GAAU,OAAO,CAAC,MAAM,CAAC,CAW3B;IAED;;;;;OAKG;IACH,uBAHG;QAAqB,UAAU,EAAvB,MAAM;KACd,GAAU,OAAO,CAAC,IAAI,CAAC,CAUzB;IAED;;;;;OAKG;IACH,oBAHG;QAAqB,UAAU,EAAvB,MAAM;KACd,GAAU,OAAO,CAAC,MAAM,CAAC,CAW3B;CACF"}
1
+ {"version":3,"file":"s3.d.ts","sourceRoot":"","sources":["../../../../../../src/database/record/attachments/storage-drivers/s3.js"],"names":[],"mappings":"AAuEA;;GAEG;AACH;IACE;;;;OAIG;IACH,yBAFG;QAAiC,OAAO;KAC1C,EAIA;IAFC,6BAAsB;IACtB;;;;;;cAA0B;IAG5B;;;OAGG;IACH,UAFa,MAAM,CAUlB;IAED;;;OAGG;IACH,sBAFa,MAAM,CAQlB;IAED;;;OAGG;IACH,aAFa,OAAO,CAAC;QAAC,QAAQ,EAAE,OAAC,CAAC;QAAC,gBAAgB,EAAE,OAAC,CAAC;QAAC,gBAAgB,EAAE,OAAC,CAAC;QAAC,mBAAmB,EAAE,OAAC,CAAC;QAAC,YAAY,EAAE,OAAC,CAAA;KAAC,CAAC,CAerH;IAED;;;OAGG;IACH,UAFa,OAAO,CAAC,OAAC,CAAC,CA+BtB;IAJG,aAAyC;IAM7C;;;;;;OAMG;IACH,+BAJG;QAAqB,YAAY,EAAzB,MAAM;QAC0D,KAAK,EAArE,OAAO,uBAAuB,EAAE,yBAAyB;KACjE,GAAU,OAAO,CAAC;QAAC,UAAU,EAAE,MAAM,CAAA;KAAC,CAAC,CAmCzC;IAED;;;;;OAKG;IACH,qBAHG;QAAqB,UAAU,EAAvB,MAAM;KACd,GAAU,OAAO,CAAC,MAAM,CAAC,CAW3B;IAED;;;;;OAKG;IACH,uBAHG;QAAqB,UAAU,EAAvB,MAAM;KACd,GAAU,OAAO,CAAC,IAAI,CAAC,CAUzB;IAED;;;;;OAKG;IACH,oBAHG;QAAqB,UAAU,EAAvB,MAAM;KACd,GAAU,OAAO,CAAC,MAAM,CAAC,CAW3B;CACF"}
@@ -143,19 +143,40 @@ export default class S3AttachmentStorageDriver {
143
143
  * Runs write.
144
144
  * @param {object} args - Write args.
145
145
  * @param {string} args.attachmentId - Attachment id.
146
- * @param {{contentBuffer: Buffer, contentType: string | null, filename: string}} args.input - Normalized attachment input.
146
+ * @param {import("../normalize-input.js").NormalizedAttachmentInput} args.input - Normalized attachment input.
147
147
  * @returns {Promise<{storageKey: string}>} - Storage key.
148
148
  */
149
149
  async write({ attachmentId, input }) {
150
150
  const { PutObjectCommand } = await this.s3Runtime();
151
151
  const client = await this.client();
152
152
  const storageKey = `${attachmentId}-${input.filename}`;
153
- await client.send(new PutObjectCommand({
154
- Body: input.contentBuffer,
155
- Bucket: this.bucket(),
156
- ContentType: input.contentType || undefined,
157
- Key: storageKey
158
- }));
153
+ /**
154
+ * S3 request body.
155
+ * @type {Buffer | import("node:stream").Readable | null} */
156
+ let body = input.contentBuffer;
157
+ /**
158
+ * Path input stream.
159
+ * @type {import("node:stream").Readable | null} */
160
+ let pathInputStream = null;
161
+ if (input.pathSource) {
162
+ pathInputStream = await input.pathSource.createReadStream();
163
+ body = pathInputStream;
164
+ }
165
+ if (!body)
166
+ throw new Error("S3 attachment input has no content");
167
+ try {
168
+ await client.send(new PutObjectCommand({
169
+ Body: body,
170
+ Bucket: this.bucket(),
171
+ ContentLength: input.byteSize,
172
+ ContentType: input.contentType || undefined,
173
+ Key: storageKey
174
+ }));
175
+ }
176
+ finally {
177
+ if (pathInputStream)
178
+ pathInputStream.destroy();
179
+ }
159
180
  return { storageKey };
160
181
  }
161
182
  /**
@@ -203,4 +224,4 @@ export default class S3AttachmentStorageDriver {
203
224
  return await runtime.getSignedUrl(client, command, { expiresIn: this.signedUrlExpiresIn() });
204
225
  }
205
226
  }
206
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiczMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9zcmMvZGF0YWJhc2UvcmVjb3JkL2F0dGFjaG1lbnRzL3N0b3JhZ2UtZHJpdmVycy9zMy5qcyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxZQUFZO0FBRVo7Ozs7R0FJRztBQUNILFNBQVMseUJBQXlCLENBQUMsT0FBTztJQUN4QyxNQUFNLElBQUksS0FBSyxDQUFDLGdEQUFnRCxPQUFPLEVBQUUsQ0FBQyxDQUFBO0FBQzVFLENBQUM7QUFFRDs7OztHQUlHO0FBQ0gsU0FBUyxnQkFBZ0IsQ0FBQyxLQUFLO0lBQzdCLE9BQU8sT0FBTyxDQUFDLEtBQUssSUFBSSxPQUFPLEtBQUssS0FBSyxRQUFRLElBQUksT0FBTyxnQkFBZ0IsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLElBQUksS0FBSyxVQUFVLENBQUMsQ0FBQTtBQUMzRyxDQUFDO0FBRUQ7Ozs7R0FJRztBQUNILEtBQUssVUFBVSxhQUFhLENBQUMsU0FBUztJQUNwQyxNQUFNLFFBQVEsR0FBRyxzREFBc0QsQ0FBQyxDQUN0RSxJQUFJLFFBQVEsQ0FBQyxpQkFBaUIsRUFBRSxnQ0FBZ0MsQ0FBQyxDQUNsRSxDQUFBO0lBRUQsT0FBTyxNQUFNLFFBQVEsQ0FBQyxTQUFTLENBQUMsQ0FBQTtBQUNsQyxDQUFDO0FBRUQ7Ozs7R0FJRztBQUNILEtBQUssVUFBVSxjQUFjLENBQUMsS0FBSztJQUNqQyxJQUFJLE1BQU0sQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDO1FBQUUsT0FBTyxLQUFLLENBQUE7SUFDeEMsSUFBSSxLQUFLLFlBQVksVUFBVTtRQUFFLE9BQU8sTUFBTSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQTtJQUMxRCxJQUFJLEtBQUssWUFBWSxXQUFXO1FBQUUsT0FBTyxNQUFNLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFBO0lBRTNELElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxLQUFLLENB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RUFBRSxPQUFPLEVBQUUsRUFBQyxTQUFTLEVBQUUsSUFBSSxDQUFDLGtCQUFrQixFQUFFLEVBQUMsQ0FBQyxDQUFBO0lBQzVGLENBQUM7Q0FDRiIsInNvdXJjZXNDb250ZW50IjpbIi8vIEB0cy1jaGVja1xuXG4vKipcbiAqIFJ1bnMgdGhyb3cgczMgY29uZmlndXJhdGlvbiBlcnJvci5cbiAqIEBwYXJhbSB7c3RyaW5nfSBtZXNzYWdlIC0gRXJyb3IgbWVzc2FnZS5cbiAqIEByZXR1cm5zIHtuZXZlcn0gLSBBbHdheXMgdGhyb3dzLlxuICovXG5mdW5jdGlvbiB0aHJvd1MzQ29uZmlndXJhdGlvbkVycm9yKG1lc3NhZ2UpIHtcbiAgdGhyb3cgbmV3IEVycm9yKGBJbnZhbGlkIFMzIGF0dGFjaG1lbnQgc3RvcmFnZSBjb25maWd1cmF0aW9uOiAke21lc3NhZ2V9YClcbn1cblxuLyoqXG4gKiBSdW5zIGlzIHJlYWRhYmxlIHN0cmVhbS5cbiAqIEBwYXJhbSB7P30gdmFsdWUgLSBDYW5kaWRhdGUgdmFsdWUuXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gLSBXaGV0aGVyIHZhbHVlIGlzIGEgcmVhZGFibGUgc3RyZWFtLlxuICovXG5mdW5jdGlvbiBpc1JlYWRhYmxlU3RyZWFtKHZhbHVlKSB7XG4gIHJldHVybiBCb29sZWFuKHZhbHVlICYmIHR5cGVvZiB2YWx1ZSA9PT0gXCJvYmplY3RcIiAmJiB0eXBlb2YgLyoqIEB0eXBlIHs/fSAqLyAodmFsdWUpLnBpcGUgPT09IFwiZnVuY3Rpb25cIilcbn1cblxuLyoqXG4gKiBSdW5zIGR5bmFtaWMgaW1wb3J0LlxuICogQHBhcmFtIHtzdHJpbmd9IHNwZWNpZmllciAtIE1vZHVsZSBzcGVjaWZpZXIuXG4gKiBAcmV0dXJucyB7UHJvbWlzZTw/Pn0gLSBJbXBvcnRlZCBtb2R1bGUuXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIGR5bmFtaWNJbXBvcnQoc3BlY2lmaWVyKSB7XG4gIGNvbnN0IGltcG9ydGVyID0gLyoqIEB0eXBlIHsobW9kdWxlU3BlY2lmaWVyOiBzdHJpbmcpID0+IFByb21pc2U8Pz59ICovIChcbiAgICBuZXcgRnVuY3Rpb24oXCJtb2R1bGVTcGVjaWZpZXJcIiwgXCJyZXR1cm4gaW1wb3J0KG1vZHVsZVNwZWNpZmllcilcIilcbiAgKVxuXG4gIHJldHVybiBhd2FpdCBpbXBvcnRlcihzcGVjaWZpZXIpXG59XG5cbi8qKlxuICogUnVucyBzdHJlYW0gdG8gYnVmZmVyLlxuICogQHBhcmFtIHs/fSB2YWx1ZSAtIENhbmRpZGF0ZSB2YWx1ZS5cbiAqIEByZXR1cm5zIHtQcm9taXNlPEJ1ZmZlcj59IC0gQnVmZmVyIHZhbHVlLlxuICovXG5hc3luYyBmdW5jdGlvbiBzdHJlYW1Ub0J1ZmZlcih2YWx1ZSkge1xuICBpZiAoQnVmZmVyLmlzQnVmZmVyKHZhbHVlKSkgcmV0dXJuIHZhbHVlXG4gIGlmICh2YWx1ZSBpbnN0YW5jZW9mIFVpbnQ4QXJyYXkpIHJldHVybiBCdWZmZXIuZnJvbSh2YWx1ZSlcbiAgaWYgKHZhbHVlIGluc3RhbmNlb2YgQXJyYXlCdWZmZXIpIHJldHVybiBCdWZmZXIuZnJvbSh2YWx1ZSlcblxuICBpZiAoIWlzUmVhZGFibGVTdHJlYW0odmFsdWUpKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBVbnN1cHBvcnRlZCBTMyBib2R5IHR5cGU6ICR7U3RyaW5nKHZhbHVlKX1gKVxuICB9XG5cbiAgLyoqXG4gICAqIENodW5rcy5cbiAgICogQHR5cGUge0J1ZmZlcltdfSAqL1xuICBjb25zdCBjaHVua3MgPSBbXVxuXG4gIGNvbnN0IHJlYWRhYmxlU3RyZWFtID0gLyoqIEB0eXBlIHs/fSAqLyAodmFsdWUpXG5cbiAgYXdhaXQgbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgIHJlYWRhYmxlU3RyZWFtLm9uKFwiZGF0YVwiLCAoLyoqIEB0eXBlIHtCdWZmZXIgfCBVaW50OEFycmF5IHwgQXJyYXlCdWZmZXIgfCBzdHJpbmd9ICovIGNodW5rKSA9PiB7XG4gICAgICBpZiAoQnVmZmVyLmlzQnVmZmVyKGNodW5rKSkge1xuICAgICAgICBjaHVua3MucHVzaChjaHVuaylcbiAgICAgIH0gZWxzZSBpZiAoY2h1bmsgaW5zdGFuY2VvZiBBcnJheUJ1ZmZlcikge1xuICAgICAgICBjaHVua3MucHVzaChCdWZmZXIuZnJvbShjaHVuaykpXG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjaHVua3MucHVzaChCdWZmZXIuZnJvbShjaHVuaykpXG4gICAgICB9XG4gICAgfSlcbiAgICByZWFkYWJsZVN0cmVhbS5vbihcImVycm9yXCIsIHJlamVjdClcbiAgICByZWFkYWJsZVN0cmVhbS5vbihcImVuZFwiLCByZXNvbHZlKVxuICB9KVxuXG4gIHJldHVybiBCdWZmZXIuY29uY2F0KGNodW5rcylcbn1cblxuLyoqXG4gKiBTMyBhdHRhY2htZW50IHN0b3JhZ2UgZHJpdmVyLlxuICovXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBTM0F0dGFjaG1lbnRTdG9yYWdlRHJpdmVyIHtcbiAgLyoqXG4gICAqIFJ1bnMgY29uc3RydWN0b3IuXG4gICAqIEBwYXJhbSB7b2JqZWN0fSBhcmdzIC0gT3B0aW9ucy5cbiAgICogQHBhcmFtIHtSZWNvcmQ8c3RyaW5nLCA/Pn0gW2FyZ3Mub3B0aW9uc10gLSBEcml2ZXIgb3B0aW9ucy5cbiAgICovXG4gIGNvbnN0cnVjdG9yKHtvcHRpb25zID0ge319KSB7XG4gICAgdGhpcy5vcHRpb25zID0gb3B0aW9uc1xuICAgIHRoaXMuX2NsaWVudFByb21pc2UgPSBudWxsXG4gIH1cblxuICAvKipcbiAgICogUnVucyBidWNrZXQuXG4gICAqIEByZXR1cm5zIHtzdHJpbmd9IC0gUzMgYnVja2V0IG5hbWUuXG4gICAqL1xuICBidWNrZXQoKSB7XG4gICAgY29uc3QgdmFsdWUgPSB0aGlzLm9wdGlvbnMuYnVja2V0IHx8IHByb2Nlc3MuZW52LlZFTE9DSU9VU19BVFRBQ0hNRU5UU19TM19CVUNLRVRcblxuICAgIGlmICh0eXBlb2YgdmFsdWUgIT09IFwic3RyaW5nXCIgfHwgdmFsdWUubGVuZ3RoIDwgMSkge1xuICAgICAgdGhyb3dTM0NvbmZpZ3VyYXRpb25FcnJvcihcIm1pc3NpbmcgYnVja2V0XCIpXG4gICAgfVxuXG4gICAgcmV0dXJuIHZhbHVlXG4gIH1cblxuICAvKipcbiAgICogUnVucyBzaWduZWQgdXJsIGV4cGlyZXMgaW4uXG4gICAqIEByZXR1cm5zIHtudW1iZXJ9IC0gU2lnbmVkIFVSTCBleHBpcmF0aW9uIGluIHNlY29uZHMuXG4gICAqL1xuICBzaWduZWRVcmxFeHBpcmVzSW4oKSB7XG4gICAgY29uc3QgdmFsdWUgPSBOdW1iZXIodGhpcy5vcHRpb25zLnNpZ25lZFVybEV4cGlyZXNJbiA/PyBwcm9jZXNzLmVudi5WRUxPQ0lPVVNfQVRUQUNITUVOVFNfUzNfU0lHTkVEX1VSTF9FWFBJUkVTX0lOID8/IDM2MDApXG5cbiAgICBpZiAoIU51bWJlci5pc0Zpbml0ZSh2YWx1ZSkgfHwgdmFsdWUgPCAxKSByZXR1cm4gMzYwMFxuXG4gICAgcmV0dXJuIE1hdGguZmxvb3IodmFsdWUpXG4gIH1cblxuICAvKipcbiAgICogUnVucyBzMyBydW50aW1lLlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTx7UzNDbGllbnQ6ID8sIFB1dE9iamVjdENvbW1hbmQ6ID8sIEdldE9iamVjdENvbW1hbmQ6ID8sIERlbGV0ZU9iamVjdENvbW1hbmQ6ID8sIGdldFNpZ25lZFVybDogP30+fSAtIFMzIHJ1bnRpbWUuXG4gICAqL1xuICBhc3luYyBzM1J1bnRpbWUoKSB7XG4gICAgaWYgKCF0aGlzLl9jbGllbnRQcm9taXNlKSB7XG4gICAgICB0aGlzLl9jbGllbnRQcm9taXNlID0gKGFzeW5jICgpID0+IHtcbiAgICAgICAgY29uc3QgW3tTM0NsaWVudCwgUHV0T2JqZWN0Q29tbWFuZCwgR2V0T2JqZWN0Q29tbWFuZCwgRGVsZXRlT2JqZWN0Q29tbWFuZH0sIHtnZXRTaWduZWRVcmx9XSA9IGF3YWl0IFByb21pc2UuYWxsKFtcbiAgICAgICAgICBkeW5hbWljSW1wb3J0KFwiQGF3cy1zZGsvY2xpZW50LXMzXCIpLFxuICAgICAgICAgIGR5bmFtaWNJbXBvcnQoXCJAYXdzLXNkay9zMy1yZXF1ZXN0LXByZXNpZ25lclwiKVxuICAgICAgICBdKVxuXG4gICAgICAgIHJldHVybiB7RGVsZXRlT2JqZWN0Q29tbWFuZCwgR2V0T2JqZWN0Q29tbWFuZCwgUHV0T2JqZWN0Q29tbWFuZCwgUzNDbGllbnQsIGdldFNpZ25lZFVybH1cbiAgICAgIH0pKClcbiAgICB9XG5cbiAgICByZXR1cm4gYXdhaXQgdGhpcy5fY2xpZW50UHJvbWlzZVxuICB9XG5cbiAgLyoqXG4gICAqIFJ1bnMgY2xpZW50LlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTw/Pn0gLSBTMyBjbGllbnQuXG4gICAqL1xuICBhc3luYyBjbGllbnQoKSB7XG4gICAgaWYgKCF0aGlzLl9jbGllbnQpIHtcbiAgICAgIGNvbnN0IHtTM0NsaWVudH0gPSBhd2FpdCB0aGlzLnMzUnVudGltZSgpXG4gICAgICAvKipcbiAgICAgICAqIENsaWVudCBjb25maWcuXG4gICAgICAgKiBAdHlwZSB7UmVjb3JkPHN0cmluZywgPz59ICovXG4gICAgICBjb25zdCBjbGllbnRDb25maWcgPSB7XG4gICAgICAgIHJlZ2lvbjogdGhpcy5vcHRpb25zLnJlZ2lvbiB8fCBwcm9jZXNzLmVudi5WRUxPQ0lPVVNfQVRUQUNITUVOVFNfUzNfUkVHSU9OIHx8IFwidXMtZWFzdC0xXCJcbiAgICAgIH1cblxuICAgICAgaWYgKHR5cGVvZiB0aGlzLm9wdGlvbnMuZW5kcG9pbnQgPT09IFwic3RyaW5nXCIgJiYgdGhpcy5vcHRpb25zLmVuZHBvaW50Lmxlbmd0aCA+IDApIHtcbiAgICAgICAgY2xpZW50Q29uZmlnLmVuZHBvaW50ID0gdGhpcy5vcHRpb25zLmVuZHBvaW50XG4gICAgICB9XG5cbiAgICAgIGlmICh0eXBlb2YgdGhpcy5vcHRpb25zLmZvcmNlUGF0aFN0eWxlID09PSBcImJvb2xlYW5cIikge1xuICAgICAgICBjbGllbnRDb25maWcuZm9yY2VQYXRoU3R5bGUgPSB0aGlzLm9wdGlvbnMuZm9yY2VQYXRoU3R5bGVcbiAgICAgIH1cblxuICAgICAgY29uc3QgYWNjZXNzS2V5SWQgPSB0aGlzLm9wdGlvbnMuYWNjZXNzS2V5SWQgfHwgcHJvY2Vzcy5lbnYuVkVMT0NJT1VTX0FUVEFDSE1FTlRTX1MzX0FDQ0VTU19LRVlfSURcbiAgICAgIGNvbnN0IHNlY3JldEFjY2Vzc0tleSA9IHRoaXMub3B0aW9ucy5zZWNyZXRBY2Nlc3NLZXkgfHwgcHJvY2Vzcy5lbnYuVkVMT0NJT1VTX0FUVEFDSE1FTlRTX1MzX1NFQ1JFVF9BQ0NFU1NfS0VZXG5cbiAgICAgIGlmICh0eXBlb2YgYWNjZXNzS2V5SWQgPT09IFwic3RyaW5nXCIgJiYgYWNjZXNzS2V5SWQubGVuZ3RoID4gMCAmJiB0eXBlb2Ygc2VjcmV0QWNjZXNzS2V5ID09PSBcInN0cmluZ1wiICYmIHNlY3JldEFjY2Vzc0tleS5sZW5ndGggPiAwKSB7XG4gICAgICAgIGNsaWVudENvbmZpZy5jcmVkZW50aWFscyA9IHthY2Nlc3NLZXlJZCwgc2VjcmV0QWNjZXNzS2V5fVxuICAgICAgfVxuXG4gICAgICB0aGlzLl9jbGllbnQgPSBuZXcgUzNDbGllbnQoY2xpZW50Q29uZmlnKVxuICAgIH1cblxuICAgIHJldHVybiB0aGlzLl9jbGllbnRcbiAgfVxuXG4gIC8qKlxuICAgKiBSdW5zIHdyaXRlLlxuICAgKiBAcGFyYW0ge29iamVjdH0gYXJncyAtIFdyaXRlIGFyZ3MuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBhcmdzLmF0dGFjaG1lbnRJZCAtIEF0dGFjaG1lbnQgaWQuXG4gICAqIEBwYXJhbSB7e2NvbnRlbnRCdWZmZXI6IEJ1ZmZlciwgY29udGVudFR5cGU6IHN0cmluZyB8IG51bGwsIGZpbGVuYW1lOiBzdHJpbmd9fSBhcmdzLmlucHV0IC0gTm9ybWFsaXplZCBhdHRhY2htZW50IGlucHV0LlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTx7c3RvcmFnZUtleTogc3RyaW5nfT59IC0gU3RvcmFnZSBrZXkuXG4gICAqL1xuICBhc3luYyB3cml0ZSh7YXR0YWNobWVudElkLCBpbnB1dH0pIHtcbiAgICBjb25zdCB7UHV0T2JqZWN0Q29tbWFuZH0gPSBhd2FpdCB0aGlzLnMzUnVudGltZSgpXG4gICAgY29uc3QgY2xpZW50ID0gYXdhaXQgdGhpcy5jbGllbnQoKVxuICAgIGNvbnN0IHN0b3JhZ2VLZXkgPSBgJHthdHRhY2htZW50SWR9LSR7aW5wdXQuZmlsZW5hbWV9YFxuXG4gICAgYXdhaXQgY2xpZW50LnNlbmQobmV3IFB1dE9iamVjdENvbW1hbmQoe1xuICAgICAgQm9keTogaW5wdXQuY29udGVudEJ1ZmZlcixcbiAgICAgIEJ1Y2tldDogdGhpcy5idWNrZXQoKSxcbiAgICAgIENvbnRlbnRUeXBlOiBpbnB1dC5jb250ZW50VHlwZSB8fCB1bmRlZmluZWQsXG4gICAgICBLZXk6IHN0b3JhZ2VLZXlcbiAgICB9KSlcblxuICAgIHJldHVybiB7c3RvcmFnZUtleX1cbiAgfVxuXG4gIC8qKlxuICAgKiBSdW5zIHJlYWQuXG4gICAqIEBwYXJhbSB7b2JqZWN0fSBhcmdzIC0gUmVhZCBhcmdzLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gYXJncy5zdG9yYWdlS2V5IC0gU3RvcmFnZSBrZXkuXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPEJ1ZmZlcj59IC0gQXR0YWNobWVudCBieXRlcy5cbiAgICovXG4gIGFzeW5jIHJlYWQoe3N0b3JhZ2VLZXl9KSB7XG4gICAgY29uc3Qge0dldE9iamVjdENvbW1hbmR9ID0gYXdhaXQgdGhpcy5zM1J1bnRpbWUoKVxuICAgIGNvbnN0IGNsaWVudCA9IGF3YWl0IHRoaXMuY2xpZW50KClcbiAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IGNsaWVudC5zZW5kKG5ldyBHZXRPYmplY3RDb21tYW5kKHtcbiAgICAgIEJ1Y2tldDogdGhpcy5idWNrZXQoKSxcbiAgICAgIEtleTogc3RvcmFnZUtleVxuICAgIH0pKVxuXG4gICAgcmV0dXJuIGF3YWl0IHN0cmVhbVRvQnVmZmVyKHJlc3BvbnNlLkJvZHkpXG4gIH1cblxuICAvKipcbiAgICogUnVucyBkZWxldGUuXG4gICAqIEBwYXJhbSB7b2JqZWN0fSBhcmdzIC0gRGVsZXRlIGFyZ3MuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBhcmdzLnN0b3JhZ2VLZXkgLSBTdG9yYWdlIGtleS5cbiAgICogQHJldHVybnMge1Byb21pc2U8dm9pZD59IC0gUmVzb2x2ZXMgd2hlbiBkZWxldGVkLlxuICAgKi9cbiAgYXN5bmMgZGVsZXRlKHtzdG9yYWdlS2V5fSkge1xuICAgIGNvbnN0IHtEZWxldGVPYmplY3RDb21tYW5kfSA9IGF3YWl0IHRoaXMuczNSdW50aW1lKClcbiAgICBjb25zdCBjbGllbnQgPSBhd2FpdCB0aGlzLmNsaWVudCgpXG5cbiAgICBhd2FpdCBjbGllbnQuc2VuZChuZXcgRGVsZXRlT2JqZWN0Q29tbWFuZCh7XG4gICAgICBCdWNrZXQ6IHRoaXMuYnVja2V0KCksXG4gICAgICBLZXk6IHN0b3JhZ2VLZXlcbiAgICB9KSlcbiAgfVxuXG4gIC8qKlxuICAgKiBSdW5zIHVybC5cbiAgICogQHBhcmFtIHtvYmplY3R9IGFyZ3MgLSBVUkwgYXJncy5cbiAgICogQHBhcmFtIHtzdHJpbmd9IGFyZ3Muc3RvcmFnZUtleSAtIFN0b3JhZ2Uga2V5LlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTxzdHJpbmc+fSAtIFNpZ25lZCBVUkwuXG4gICAqL1xuICBhc3luYyB1cmwoe3N0b3JhZ2VLZXl9KSB7XG4gICAgY29uc3QgcnVudGltZSA9IGF3YWl0IHRoaXMuczNSdW50aW1lKClcbiAgICBjb25zdCBjbGllbnQgPSBhd2FpdCB0aGlzLmNsaWVudCgpXG4gICAgY29uc3QgY29tbWFuZCA9IG5ldyBydW50aW1lLkdldE9iamVjdENvbW1hbmQoe1xuICAgICAgQnVja2V0OiB0aGlzLmJ1Y2tldCgpLFxuICAgICAgS2V5OiBzdG9yYWdlS2V5XG4gICAgfSlcblxuICAgIHJldHVybiBhd2FpdCBydW50aW1lLmdldFNpZ25lZFVybChjbGllbnQsIGNvbW1hbmQsIHtleHBpcmVzSW46IHRoaXMuc2lnbmVkVXJsRXhwaXJlc0luKCl9KVxuICB9XG59XG4iXX0=
227
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiczMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9zcmMvZGF0YWJhc2UvcmVjb3JkL2F0dGFjaG1lbnRzL3N0b3JhZ2UtZHJpdmVycy9zMy5qcyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxZQUFZO0FBRVo7Ozs7R0FJRztBQUNILFNBQVMseUJBQXlCLENBQUMsT0FBTztJQUN4QyxNQUFNLElBQUksS0FBSyxDQUFDLGdEQUFnRCxPQUFPLEVBQUUsQ0FBQyxDQUFBO0FBQzVFLENBQUM7QUFFRDs7OztHQUlHO0FBQ0gsU0FBUyxnQkFBZ0IsQ0FBQyxLQUFLO0lBQzdCLE9BQU8sT0FBTyxDQUFDLEtBQUssSUFBSSxPQUFPLEtBQUssS0FBSyxRQUFRLElBQUksT0FBTyxnQkFBZ0IsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLElBQUksS0FBSyxVQUFVLENBQUMsQ0FBQTtBQUMzRyxDQUFDO0FBRUQ7Ozs7R0FJRztBQUNILEtBQUssVUFBVSxhQUFhLENBQUMsU0FBUztJQUNwQyxNQUFNLFFBQVEsR0FBRyxzREFBc0QsQ0FBQyxDQUN0RSxJQUFJLFFBQVEsQ0FBQyxpQkFBaUIsRUFBRSxnQ0FBZ0MsQ0FBQyxDQUNsRSxDQUFBO0lBRUQsT0FBTyxNQUFNLFFBQVEsQ0FBQyxTQUFTLENBQUMsQ0FBQTtBQUNsQyxDQUFDO0FBRUQ7Ozs7R0FJRztBQUNILEtBQUssVUFBVSxjQUFjLENBQUMsS0FBSztJQUNqQyxJQUFJLE1BQU0sQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDO1FBQUUsT0FBTyxLQUFLLENBQUE7SUFDeEMsSUFBSSxLQUFLLFlBQVksVUFBVTtRQUFFLE9BQU8sTUFBTSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQTtJQUMxRCxJQUFJLEtBQUssWUFBWSxXQUFXO1FBQUUsT0FBTyxNQUFNLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFBO0lBRTNELElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxLQUFLLENB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LENBQUM7WUFDeEMsTUFBTSxFQUFFLElBQUksQ0FBQyxNQUFNLEVBQUU7WUFDckIsR0FBRyxFQUFFLFVBQVU7U0FDaEIsQ0FBQyxDQUFDLENBQUE7SUFDTCxDQUFDO0lBRUQ7Ozs7O09BS0c7SUFDSCxLQUFLLENBQUMsR0FBRyxDQUFDLEVBQUMsVUFBVSxFQUFDO1FBQ3BCLE1BQU0sT0FBTyxHQUFHLE1BQU0sSUFBSSxDQUFDLFNBQVMsRUFBRSxDQUFBO1FBQ3RDLE1BQU0sTUFBTSxHQUFHLE1BQU0sSUFBSSxDQUFDLE1BQU0sRUFBRSxDQUFBO1FBQ2xDLE1BQU0sT0FBTyxHQUFHLElBQUksT0FBTyxDQUFDLGdCQUFnQixDQUFDO1lBQzNDLE1BQU0sRUFBRSxJQUFJLENBQUMsTUFBTSxFQUFFO1lBQ3JCLEdBQUcsRUFBRSxVQUFVO1NBQ2hCLENBQUMsQ0FBQTtRQUVGLE9BQU8sTUFBTSxPQUFPLENBQUMsWUFBWSxDQUFDLE1BQU0sRUFBRSxPQUFPLEVBQUUsRUFBQyxTQUFTLEVBQUUsSUFBSSxDQUFDLGtCQUFrQixFQUFFLEVBQUMsQ0FBQyxDQUFBO0lBQzVGLENBQUM7Q0FDRiIsInNvdXJjZXNDb250ZW50IjpbIi8vIEB0cy1jaGVja1xuXG4vKipcbiAqIFJ1bnMgdGhyb3cgczMgY29uZmlndXJhdGlvbiBlcnJvci5cbiAqIEBwYXJhbSB7c3RyaW5nfSBtZXNzYWdlIC0gRXJyb3IgbWVzc2FnZS5cbiAqIEByZXR1cm5zIHtuZXZlcn0gLSBBbHdheXMgdGhyb3dzLlxuICovXG5mdW5jdGlvbiB0aHJvd1MzQ29uZmlndXJhdGlvbkVycm9yKG1lc3NhZ2UpIHtcbiAgdGhyb3cgbmV3IEVycm9yKGBJbnZhbGlkIFMzIGF0dGFjaG1lbnQgc3RvcmFnZSBjb25maWd1cmF0aW9uOiAke21lc3NhZ2V9YClcbn1cblxuLyoqXG4gKiBSdW5zIGlzIHJlYWRhYmxlIHN0cmVhbS5cbiAqIEBwYXJhbSB7P30gdmFsdWUgLSBDYW5kaWRhdGUgdmFsdWUuXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gLSBXaGV0aGVyIHZhbHVlIGlzIGEgcmVhZGFibGUgc3RyZWFtLlxuICovXG5mdW5jdGlvbiBpc1JlYWRhYmxlU3RyZWFtKHZhbHVlKSB7XG4gIHJldHVybiBCb29sZWFuKHZhbHVlICYmIHR5cGVvZiB2YWx1ZSA9PT0gXCJvYmplY3RcIiAmJiB0eXBlb2YgLyoqIEB0eXBlIHs/fSAqLyAodmFsdWUpLnBpcGUgPT09IFwiZnVuY3Rpb25cIilcbn1cblxuLyoqXG4gKiBSdW5zIGR5bmFtaWMgaW1wb3J0LlxuICogQHBhcmFtIHtzdHJpbmd9IHNwZWNpZmllciAtIE1vZHVsZSBzcGVjaWZpZXIuXG4gKiBAcmV0dXJucyB7UHJvbWlzZTw/Pn0gLSBJbXBvcnRlZCBtb2R1bGUuXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIGR5bmFtaWNJbXBvcnQoc3BlY2lmaWVyKSB7XG4gIGNvbnN0IGltcG9ydGVyID0gLyoqIEB0eXBlIHsobW9kdWxlU3BlY2lmaWVyOiBzdHJpbmcpID0+IFByb21pc2U8Pz59ICovIChcbiAgICBuZXcgRnVuY3Rpb24oXCJtb2R1bGVTcGVjaWZpZXJcIiwgXCJyZXR1cm4gaW1wb3J0KG1vZHVsZVNwZWNpZmllcilcIilcbiAgKVxuXG4gIHJldHVybiBhd2FpdCBpbXBvcnRlcihzcGVjaWZpZXIpXG59XG5cbi8qKlxuICogUnVucyBzdHJlYW0gdG8gYnVmZmVyLlxuICogQHBhcmFtIHs/fSB2YWx1ZSAtIENhbmRpZGF0ZSB2YWx1ZS5cbiAqIEByZXR1cm5zIHtQcm9taXNlPEJ1ZmZlcj59IC0gQnVmZmVyIHZhbHVlLlxuICovXG5hc3luYyBmdW5jdGlvbiBzdHJlYW1Ub0J1ZmZlcih2YWx1ZSkge1xuICBpZiAoQnVmZmVyLmlzQnVmZmVyKHZhbHVlKSkgcmV0dXJuIHZhbHVlXG4gIGlmICh2YWx1ZSBpbnN0YW5jZW9mIFVpbnQ4QXJyYXkpIHJldHVybiBCdWZmZXIuZnJvbSh2YWx1ZSlcbiAgaWYgKHZhbHVlIGluc3RhbmNlb2YgQXJyYXlCdWZmZXIpIHJldHVybiBCdWZmZXIuZnJvbSh2YWx1ZSlcblxuICBpZiAoIWlzUmVhZGFibGVTdHJlYW0odmFsdWUpKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBVbnN1cHBvcnRlZCBTMyBib2R5IHR5cGU6ICR7U3RyaW5nKHZhbHVlKX1gKVxuICB9XG5cbiAgLyoqXG4gICAqIENodW5rcy5cbiAgICogQHR5cGUge0J1ZmZlcltdfSAqL1xuICBjb25zdCBjaHVua3MgPSBbXVxuXG4gIGNvbnN0IHJlYWRhYmxlU3RyZWFtID0gLyoqIEB0eXBlIHs/fSAqLyAodmFsdWUpXG5cbiAgYXdhaXQgbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgIHJlYWRhYmxlU3RyZWFtLm9uKFwiZGF0YVwiLCAoLyoqIEB0eXBlIHtCdWZmZXIgfCBVaW50OEFycmF5IHwgQXJyYXlCdWZmZXIgfCBzdHJpbmd9ICovIGNodW5rKSA9PiB7XG4gICAgICBpZiAoQnVmZmVyLmlzQnVmZmVyKGNodW5rKSkge1xuICAgICAgICBjaHVua3MucHVzaChjaHVuaylcbiAgICAgIH0gZWxzZSBpZiAoY2h1bmsgaW5zdGFuY2VvZiBBcnJheUJ1ZmZlcikge1xuICAgICAgICBjaHVua3MucHVzaChCdWZmZXIuZnJvbShjaHVuaykpXG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjaHVua3MucHVzaChCdWZmZXIuZnJvbShjaHVuaykpXG4gICAgICB9XG4gICAgfSlcbiAgICByZWFkYWJsZVN0cmVhbS5vbihcImVycm9yXCIsIHJlamVjdClcbiAgICByZWFkYWJsZVN0cmVhbS5vbihcImVuZFwiLCByZXNvbHZlKVxuICB9KVxuXG4gIHJldHVybiBCdWZmZXIuY29uY2F0KGNodW5rcylcbn1cblxuLyoqXG4gKiBTMyBhdHRhY2htZW50IHN0b3JhZ2UgZHJpdmVyLlxuICovXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBTM0F0dGFjaG1lbnRTdG9yYWdlRHJpdmVyIHtcbiAgLyoqXG4gICAqIFJ1bnMgY29uc3RydWN0b3IuXG4gICAqIEBwYXJhbSB7b2JqZWN0fSBhcmdzIC0gT3B0aW9ucy5cbiAgICogQHBhcmFtIHtSZWNvcmQ8c3RyaW5nLCA/Pn0gW2FyZ3Mub3B0aW9uc10gLSBEcml2ZXIgb3B0aW9ucy5cbiAgICovXG4gIGNvbnN0cnVjdG9yKHtvcHRpb25zID0ge319KSB7XG4gICAgdGhpcy5vcHRpb25zID0gb3B0aW9uc1xuICAgIHRoaXMuX2NsaWVudFByb21pc2UgPSBudWxsXG4gIH1cblxuICAvKipcbiAgICogUnVucyBidWNrZXQuXG4gICAqIEByZXR1cm5zIHtzdHJpbmd9IC0gUzMgYnVja2V0IG5hbWUuXG4gICAqL1xuICBidWNrZXQoKSB7XG4gICAgY29uc3QgdmFsdWUgPSB0aGlzLm9wdGlvbnMuYnVja2V0IHx8IHByb2Nlc3MuZW52LlZFTE9DSU9VU19BVFRBQ0hNRU5UU19TM19CVUNLRVRcblxuICAgIGlmICh0eXBlb2YgdmFsdWUgIT09IFwic3RyaW5nXCIgfHwgdmFsdWUubGVuZ3RoIDwgMSkge1xuICAgICAgdGhyb3dTM0NvbmZpZ3VyYXRpb25FcnJvcihcIm1pc3NpbmcgYnVja2V0XCIpXG4gICAgfVxuXG4gICAgcmV0dXJuIHZhbHVlXG4gIH1cblxuICAvKipcbiAgICogUnVucyBzaWduZWQgdXJsIGV4cGlyZXMgaW4uXG4gICAqIEByZXR1cm5zIHtudW1iZXJ9IC0gU2lnbmVkIFVSTCBleHBpcmF0aW9uIGluIHNlY29uZHMuXG4gICAqL1xuICBzaWduZWRVcmxFeHBpcmVzSW4oKSB7XG4gICAgY29uc3QgdmFsdWUgPSBOdW1iZXIodGhpcy5vcHRpb25zLnNpZ25lZFVybEV4cGlyZXNJbiA/PyBwcm9jZXNzLmVudi5WRUxPQ0lPVVNfQVRUQUNITUVOVFNfUzNfU0lHTkVEX1VSTF9FWFBJUkVTX0lOID8/IDM2MDApXG5cbiAgICBpZiAoIU51bWJlci5pc0Zpbml0ZSh2YWx1ZSkgfHwgdmFsdWUgPCAxKSByZXR1cm4gMzYwMFxuXG4gICAgcmV0dXJuIE1hdGguZmxvb3IodmFsdWUpXG4gIH1cblxuICAvKipcbiAgICogUnVucyBzMyBydW50aW1lLlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTx7UzNDbGllbnQ6ID8sIFB1dE9iamVjdENvbW1hbmQ6ID8sIEdldE9iamVjdENvbW1hbmQ6ID8sIERlbGV0ZU9iamVjdENvbW1hbmQ6ID8sIGdldFNpZ25lZFVybDogP30+fSAtIFMzIHJ1bnRpbWUuXG4gICAqL1xuICBhc3luYyBzM1J1bnRpbWUoKSB7XG4gICAgaWYgKCF0aGlzLl9jbGllbnRQcm9taXNlKSB7XG4gICAgICB0aGlzLl9jbGllbnRQcm9taXNlID0gKGFzeW5jICgpID0+IHtcbiAgICAgICAgY29uc3QgW3tTM0NsaWVudCwgUHV0T2JqZWN0Q29tbWFuZCwgR2V0T2JqZWN0Q29tbWFuZCwgRGVsZXRlT2JqZWN0Q29tbWFuZH0sIHtnZXRTaWduZWRVcmx9XSA9IGF3YWl0IFByb21pc2UuYWxsKFtcbiAgICAgICAgICBkeW5hbWljSW1wb3J0KFwiQGF3cy1zZGsvY2xpZW50LXMzXCIpLFxuICAgICAgICAgIGR5bmFtaWNJbXBvcnQoXCJAYXdzLXNkay9zMy1yZXF1ZXN0LXByZXNpZ25lclwiKVxuICAgICAgICBdKVxuXG4gICAgICAgIHJldHVybiB7RGVsZXRlT2JqZWN0Q29tbWFuZCwgR2V0T2JqZWN0Q29tbWFuZCwgUHV0T2JqZWN0Q29tbWFuZCwgUzNDbGllbnQsIGdldFNpZ25lZFVybH1cbiAgICAgIH0pKClcbiAgICB9XG5cbiAgICByZXR1cm4gYXdhaXQgdGhpcy5fY2xpZW50UHJvbWlzZVxuICB9XG5cbiAgLyoqXG4gICAqIFJ1bnMgY2xpZW50LlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTw/Pn0gLSBTMyBjbGllbnQuXG4gICAqL1xuICBhc3luYyBjbGllbnQoKSB7XG4gICAgaWYgKCF0aGlzLl9jbGllbnQpIHtcbiAgICAgIGNvbnN0IHtTM0NsaWVudH0gPSBhd2FpdCB0aGlzLnMzUnVudGltZSgpXG4gICAgICAvKipcbiAgICAgICAqIENsaWVudCBjb25maWcuXG4gICAgICAgKiBAdHlwZSB7UmVjb3JkPHN0cmluZywgPz59ICovXG4gICAgICBjb25zdCBjbGllbnRDb25maWcgPSB7XG4gICAgICAgIHJlZ2lvbjogdGhpcy5vcHRpb25zLnJlZ2lvbiB8fCBwcm9jZXNzLmVudi5WRUxPQ0lPVVNfQVRUQUNITUVOVFNfUzNfUkVHSU9OIHx8IFwidXMtZWFzdC0xXCJcbiAgICAgIH1cblxuICAgICAgaWYgKHR5cGVvZiB0aGlzLm9wdGlvbnMuZW5kcG9pbnQgPT09IFwic3RyaW5nXCIgJiYgdGhpcy5vcHRpb25zLmVuZHBvaW50Lmxlbmd0aCA+IDApIHtcbiAgICAgICAgY2xpZW50Q29uZmlnLmVuZHBvaW50ID0gdGhpcy5vcHRpb25zLmVuZHBvaW50XG4gICAgICB9XG5cbiAgICAgIGlmICh0eXBlb2YgdGhpcy5vcHRpb25zLmZvcmNlUGF0aFN0eWxlID09PSBcImJvb2xlYW5cIikge1xuICAgICAgICBjbGllbnRDb25maWcuZm9yY2VQYXRoU3R5bGUgPSB0aGlzLm9wdGlvbnMuZm9yY2VQYXRoU3R5bGVcbiAgICAgIH1cblxuICAgICAgY29uc3QgYWNjZXNzS2V5SWQgPSB0aGlzLm9wdGlvbnMuYWNjZXNzS2V5SWQgfHwgcHJvY2Vzcy5lbnYuVkVMT0NJT1VTX0FUVEFDSE1FTlRTX1MzX0FDQ0VTU19LRVlfSURcbiAgICAgIGNvbnN0IHNlY3JldEFjY2Vzc0tleSA9IHRoaXMub3B0aW9ucy5zZWNyZXRBY2Nlc3NLZXkgfHwgcHJvY2Vzcy5lbnYuVkVMT0NJT1VTX0FUVEFDSE1FTlRTX1MzX1NFQ1JFVF9BQ0NFU1NfS0VZXG5cbiAgICAgIGlmICh0eXBlb2YgYWNjZXNzS2V5SWQgPT09IFwic3RyaW5nXCIgJiYgYWNjZXNzS2V5SWQubGVuZ3RoID4gMCAmJiB0eXBlb2Ygc2VjcmV0QWNjZXNzS2V5ID09PSBcInN0cmluZ1wiICYmIHNlY3JldEFjY2Vzc0tleS5sZW5ndGggPiAwKSB7XG4gICAgICAgIGNsaWVudENvbmZpZy5jcmVkZW50aWFscyA9IHthY2Nlc3NLZXlJZCwgc2VjcmV0QWNjZXNzS2V5fVxuICAgICAgfVxuXG4gICAgICB0aGlzLl9jbGllbnQgPSBuZXcgUzNDbGllbnQoY2xpZW50Q29uZmlnKVxuICAgIH1cblxuICAgIHJldHVybiB0aGlzLl9jbGllbnRcbiAgfVxuXG4gIC8qKlxuICAgKiBSdW5zIHdyaXRlLlxuICAgKiBAcGFyYW0ge29iamVjdH0gYXJncyAtIFdyaXRlIGFyZ3MuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBhcmdzLmF0dGFjaG1lbnRJZCAtIEF0dGFjaG1lbnQgaWQuXG4gICAqIEBwYXJhbSB7aW1wb3J0KFwiLi4vbm9ybWFsaXplLWlucHV0LmpzXCIpLk5vcm1hbGl6ZWRBdHRhY2htZW50SW5wdXR9IGFyZ3MuaW5wdXQgLSBOb3JtYWxpemVkIGF0dGFjaG1lbnQgaW5wdXQuXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPHtzdG9yYWdlS2V5OiBzdHJpbmd9Pn0gLSBTdG9yYWdlIGtleS5cbiAgICovXG4gIGFzeW5jIHdyaXRlKHthdHRhY2htZW50SWQsIGlucHV0fSkge1xuICAgIGNvbnN0IHtQdXRPYmplY3RDb21tYW5kfSA9IGF3YWl0IHRoaXMuczNSdW50aW1lKClcbiAgICBjb25zdCBjbGllbnQgPSBhd2FpdCB0aGlzLmNsaWVudCgpXG4gICAgY29uc3Qgc3RvcmFnZUtleSA9IGAke2F0dGFjaG1lbnRJZH0tJHtpbnB1dC5maWxlbmFtZX1gXG4gICAgLyoqXG4gICAgICogUzMgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtCdWZmZXIgfCBpbXBvcnQoXCJub2RlOnN0cmVhbVwiKS5SZWFkYWJsZSB8IG51bGx9ICovXG4gICAgbGV0IGJvZHkgPSBpbnB1dC5jb250ZW50QnVmZmVyXG4gICAgLyoqXG4gICAgICogUGF0aCBpbnB1dCBzdHJlYW0uXG4gICAgICogQHR5cGUge2ltcG9ydChcIm5vZGU6c3RyZWFtXCIpLlJlYWRhYmxlIHwgbnVsbH0gKi9cbiAgICBsZXQgcGF0aElucHV0U3RyZWFtID0gbnVsbFxuXG4gICAgaWYgKGlucHV0LnBhdGhTb3VyY2UpIHtcbiAgICAgIHBhdGhJbnB1dFN0cmVhbSA9IGF3YWl0IGlucHV0LnBhdGhTb3VyY2UuY3JlYXRlUmVhZFN0cmVhbSgpXG4gICAgICBib2R5ID0gcGF0aElucHV0U3RyZWFtXG4gICAgfVxuXG4gICAgaWYgKCFib2R5KSB0aHJvdyBuZXcgRXJyb3IoXCJTMyBhdHRhY2htZW50IGlucHV0IGhhcyBubyBjb250ZW50XCIpXG5cbiAgICB0cnkge1xuICAgICAgYXdhaXQgY2xpZW50LnNlbmQobmV3IFB1dE9iamVjdENvbW1hbmQoe1xuICAgICAgICBCb2R5OiBib2R5LFxuICAgICAgICBCdWNrZXQ6IHRoaXMuYnVja2V0KCksXG4gICAgICAgIENvbnRlbnRMZW5ndGg6IGlucHV0LmJ5dGVTaXplLFxuICAgICAgICBDb250ZW50VHlwZTogaW5wdXQuY29udGVudFR5cGUgfHwgdW5kZWZpbmVkLFxuICAgICAgICBLZXk6IHN0b3JhZ2VLZXlcbiAgICAgIH0pKVxuICAgIH0gZmluYWxseSB7XG4gICAgICBpZiAocGF0aElucHV0U3RyZWFtKSBwYXRoSW5wdXRTdHJlYW0uZGVzdHJveSgpXG4gICAgfVxuXG4gICAgcmV0dXJuIHtzdG9yYWdlS2V5fVxuICB9XG5cbiAgLyoqXG4gICAqIFJ1bnMgcmVhZC5cbiAgICogQHBhcmFtIHtvYmplY3R9IGFyZ3MgLSBSZWFkIGFyZ3MuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBhcmdzLnN0b3JhZ2VLZXkgLSBTdG9yYWdlIGtleS5cbiAgICogQHJldHVybnMge1Byb21pc2U8QnVmZmVyPn0gLSBBdHRhY2htZW50IGJ5dGVzLlxuICAgKi9cbiAgYXN5bmMgcmVhZCh7c3RvcmFnZUtleX0pIHtcbiAgICBjb25zdCB7R2V0T2JqZWN0Q29tbWFuZH0gPSBhd2FpdCB0aGlzLnMzUnVudGltZSgpXG4gICAgY29uc3QgY2xpZW50ID0gYXdhaXQgdGhpcy5jbGllbnQoKVxuICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgY2xpZW50LnNlbmQobmV3IEdldE9iamVjdENvbW1hbmQoe1xuICAgICAgQnVja2V0OiB0aGlzLmJ1Y2tldCgpLFxuICAgICAgS2V5OiBzdG9yYWdlS2V5XG4gICAgfSkpXG5cbiAgICByZXR1cm4gYXdhaXQgc3RyZWFtVG9CdWZmZXIocmVzcG9uc2UuQm9keSlcbiAgfVxuXG4gIC8qKlxuICAgKiBSdW5zIGRlbGV0ZS5cbiAgICogQHBhcmFtIHtvYmplY3R9IGFyZ3MgLSBEZWxldGUgYXJncy5cbiAgICogQHBhcmFtIHtzdHJpbmd9IGFyZ3Muc3RvcmFnZUtleSAtIFN0b3JhZ2Uga2V5LlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTx2b2lkPn0gLSBSZXNvbHZlcyB3aGVuIGRlbGV0ZWQuXG4gICAqL1xuICBhc3luYyBkZWxldGUoe3N0b3JhZ2VLZXl9KSB7XG4gICAgY29uc3Qge0RlbGV0ZU9iamVjdENvbW1hbmR9ID0gYXdhaXQgdGhpcy5zM1J1bnRpbWUoKVxuICAgIGNvbnN0IGNsaWVudCA9IGF3YWl0IHRoaXMuY2xpZW50KClcblxuICAgIGF3YWl0IGNsaWVudC5zZW5kKG5ldyBEZWxldGVPYmplY3RDb21tYW5kKHtcbiAgICAgIEJ1Y2tldDogdGhpcy5idWNrZXQoKSxcbiAgICAgIEtleTogc3RvcmFnZUtleVxuICAgIH0pKVxuICB9XG5cbiAgLyoqXG4gICAqIFJ1bnMgdXJsLlxuICAgKiBAcGFyYW0ge29iamVjdH0gYXJncyAtIFVSTCBhcmdzLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gYXJncy5zdG9yYWdlS2V5IC0gU3RvcmFnZSBrZXkuXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPHN0cmluZz59IC0gU2lnbmVkIFVSTC5cbiAgICovXG4gIGFzeW5jIHVybCh7c3RvcmFnZUtleX0pIHtcbiAgICBjb25zdCBydW50aW1lID0gYXdhaXQgdGhpcy5zM1J1bnRpbWUoKVxuICAgIGNvbnN0IGNsaWVudCA9IGF3YWl0IHRoaXMuY2xpZW50KClcbiAgICBjb25zdCBjb21tYW5kID0gbmV3IHJ1bnRpbWUuR2V0T2JqZWN0Q29tbWFuZCh7XG4gICAgICBCdWNrZXQ6IHRoaXMuYnVja2V0KCksXG4gICAgICBLZXk6IHN0b3JhZ2VLZXlcbiAgICB9KVxuXG4gICAgcmV0dXJuIGF3YWl0IHJ1bnRpbWUuZ2V0U2lnbmVkVXJsKGNsaWVudCwgY29tbWFuZCwge2V4cGlyZXNJbjogdGhpcy5zaWduZWRVcmxFeHBpcmVzSW4oKX0pXG4gIH1cbn1cbiJdfQ==
@@ -51,6 +51,33 @@ export default class RecordAttachmentsStore {
51
51
  input: unknown;
52
52
  replace: boolean;
53
53
  }): Promise<void>;
54
+ /**
55
+ * Materializes path content once when a legacy schema requires Base64.
56
+ * @param {import("./normalize-input.js").NormalizedAttachmentInput} normalizedInput - Normalized attachment input.
57
+ * @returns {Promise<import("./normalize-input.js").NormalizedAttachmentInput>} - Input used by the driver and database.
58
+ */
59
+ persistenceInputFor(normalizedInput: import("./normalize-input.js").NormalizedAttachmentInput): Promise<import("./normalize-input.js").NormalizedAttachmentInput>;
60
+ /**
61
+ * Persists one normalized attachment while its path source remains open.
62
+ * @param {object} args - Options.
63
+ * @param {import("../index.js").default} args.model - Model instance.
64
+ * @param {string} args.name - Attachment name.
65
+ * @param {import("./normalize-input.js").NormalizedAttachmentInput} args.normalizedInput - Normalized attachment.
66
+ * @param {boolean} args.replace - Whether to replace existing attachments.
67
+ * @returns {Promise<void>} - Resolves after persistence.
68
+ */
69
+ persistNormalizedAttachment({ model, name, normalizedInput, replace }: {
70
+ model: import("../index.js").default;
71
+ name: string;
72
+ normalizedInput: import("./normalize-input.js").NormalizedAttachmentInput;
73
+ replace: boolean;
74
+ }): Promise<void>;
75
+ /**
76
+ * Resolves the database content_base64 value for current and legacy schemas.
77
+ * @param {import("./normalize-input.js").NormalizedAttachmentInput} normalizedInput - Normalized attachment input.
78
+ * @returns {Promise<string | null>} - Nullable or legacy Base64 database value.
79
+ */
80
+ databaseContentBase64For(normalizedInput: import("./normalize-input.js").NormalizedAttachmentInput): Promise<string | null>;
54
81
  /**
55
82
  * Runs ensure attachment store schema.
56
83
  * @param {object} args - Options.