canopycms-cdk 0.0.58 → 0.0.59

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 (144) hide show
  1. package/dist/constructs/asset-support.d.ts +10 -4
  2. package/dist/constructs/asset-support.d.ts.map +1 -1
  3. package/dist/constructs/asset-support.js +4 -1
  4. package/dist/constructs/asset-support.js.map +1 -1
  5. package/dist/constructs/cms-distribution.d.ts +2 -0
  6. package/dist/constructs/cms-distribution.d.ts.map +1 -1
  7. package/dist/constructs/cms-distribution.js +39 -11
  8. package/dist/constructs/cms-distribution.js.map +1 -1
  9. package/dist/constructs/cms-service.d.ts +27 -2
  10. package/dist/constructs/cms-service.d.ts.map +1 -1
  11. package/dist/constructs/cms-service.js +62 -11
  12. package/dist/constructs/cms-service.js.map +1 -1
  13. package/lambda/asset-transform/dist/handler.js +30452 -0
  14. package/lambda/asset-transform/dist/node_modules/.package-lock.json +129 -0
  15. package/lambda/asset-transform/dist/node_modules/@img/colour/LICENSE.md +82 -0
  16. package/lambda/asset-transform/dist/node_modules/@img/colour/README.md +15 -0
  17. package/lambda/asset-transform/dist/node_modules/@img/colour/color.cjs +1596 -0
  18. package/lambda/asset-transform/dist/node_modules/@img/colour/index.cjs +1 -0
  19. package/lambda/asset-transform/dist/node_modules/@img/colour/index.d.ts +929 -0
  20. package/lambda/asset-transform/dist/node_modules/@img/colour/package.json +58 -0
  21. package/lambda/asset-transform/dist/node_modules/@img/sharp-libvips-linux-arm64/README.md +46 -0
  22. package/lambda/asset-transform/dist/node_modules/@img/sharp-libvips-linux-arm64/lib/glib-2.0/include/glibconfig.h +218 -0
  23. package/lambda/asset-transform/dist/node_modules/@img/sharp-libvips-linux-arm64/lib/index.js +1 -0
  24. package/lambda/asset-transform/dist/node_modules/@img/sharp-libvips-linux-arm64/lib/libvips-cpp.so.8.18.3 +0 -0
  25. package/lambda/asset-transform/dist/node_modules/@img/sharp-libvips-linux-arm64/package.json +43 -0
  26. package/lambda/asset-transform/dist/node_modules/@img/sharp-libvips-linux-arm64/versions.json +30 -0
  27. package/lambda/asset-transform/dist/node_modules/@img/sharp-linux-arm64/LICENSE +191 -0
  28. package/lambda/asset-transform/dist/node_modules/@img/sharp-linux-arm64/README.md +18 -0
  29. package/lambda/asset-transform/dist/node_modules/@img/sharp-linux-arm64/index.cjs +2 -0
  30. package/lambda/asset-transform/dist/node_modules/@img/sharp-linux-arm64/lib/sharp-linux-arm64-0.35.3.node +0 -0
  31. package/lambda/asset-transform/dist/node_modules/@img/sharp-linux-arm64/package.json +47 -0
  32. package/lambda/asset-transform/dist/node_modules/detect-libc/LICENSE +201 -0
  33. package/lambda/asset-transform/dist/node_modules/detect-libc/README.md +163 -0
  34. package/lambda/asset-transform/dist/node_modules/detect-libc/index.d.ts +14 -0
  35. package/lambda/asset-transform/dist/node_modules/detect-libc/lib/detect-libc.js +313 -0
  36. package/lambda/asset-transform/dist/node_modules/detect-libc/lib/elf.js +39 -0
  37. package/lambda/asset-transform/dist/node_modules/detect-libc/lib/filesystem.js +51 -0
  38. package/lambda/asset-transform/dist/node_modules/detect-libc/lib/process.js +24 -0
  39. package/lambda/asset-transform/dist/node_modules/detect-libc/package.json +44 -0
  40. package/lambda/asset-transform/dist/node_modules/semver/LICENSE +15 -0
  41. package/lambda/asset-transform/dist/node_modules/semver/README.md +680 -0
  42. package/lambda/asset-transform/dist/node_modules/semver/bin/semver.js +195 -0
  43. package/lambda/asset-transform/dist/node_modules/semver/classes/comparator.js +143 -0
  44. package/lambda/asset-transform/dist/node_modules/semver/classes/index.js +7 -0
  45. package/lambda/asset-transform/dist/node_modules/semver/classes/range.js +577 -0
  46. package/lambda/asset-transform/dist/node_modules/semver/classes/semver.js +350 -0
  47. package/lambda/asset-transform/dist/node_modules/semver/functions/clean.js +8 -0
  48. package/lambda/asset-transform/dist/node_modules/semver/functions/cmp.js +54 -0
  49. package/lambda/asset-transform/dist/node_modules/semver/functions/coerce.js +62 -0
  50. package/lambda/asset-transform/dist/node_modules/semver/functions/compare-build.js +9 -0
  51. package/lambda/asset-transform/dist/node_modules/semver/functions/compare-loose.js +5 -0
  52. package/lambda/asset-transform/dist/node_modules/semver/functions/compare.js +7 -0
  53. package/lambda/asset-transform/dist/node_modules/semver/functions/diff.js +60 -0
  54. package/lambda/asset-transform/dist/node_modules/semver/functions/eq.js +5 -0
  55. package/lambda/asset-transform/dist/node_modules/semver/functions/gt.js +5 -0
  56. package/lambda/asset-transform/dist/node_modules/semver/functions/gte.js +5 -0
  57. package/lambda/asset-transform/dist/node_modules/semver/functions/inc.js +21 -0
  58. package/lambda/asset-transform/dist/node_modules/semver/functions/lt.js +5 -0
  59. package/lambda/asset-transform/dist/node_modules/semver/functions/lte.js +5 -0
  60. package/lambda/asset-transform/dist/node_modules/semver/functions/major.js +5 -0
  61. package/lambda/asset-transform/dist/node_modules/semver/functions/minor.js +5 -0
  62. package/lambda/asset-transform/dist/node_modules/semver/functions/neq.js +5 -0
  63. package/lambda/asset-transform/dist/node_modules/semver/functions/parse.js +18 -0
  64. package/lambda/asset-transform/dist/node_modules/semver/functions/patch.js +5 -0
  65. package/lambda/asset-transform/dist/node_modules/semver/functions/prerelease.js +8 -0
  66. package/lambda/asset-transform/dist/node_modules/semver/functions/rcompare.js +5 -0
  67. package/lambda/asset-transform/dist/node_modules/semver/functions/rsort.js +5 -0
  68. package/lambda/asset-transform/dist/node_modules/semver/functions/satisfies.js +12 -0
  69. package/lambda/asset-transform/dist/node_modules/semver/functions/sort.js +5 -0
  70. package/lambda/asset-transform/dist/node_modules/semver/functions/truncate.js +48 -0
  71. package/lambda/asset-transform/dist/node_modules/semver/functions/valid.js +8 -0
  72. package/lambda/asset-transform/dist/node_modules/semver/index.js +93 -0
  73. package/lambda/asset-transform/dist/node_modules/semver/internal/constants.js +37 -0
  74. package/lambda/asset-transform/dist/node_modules/semver/internal/debug.js +11 -0
  75. package/lambda/asset-transform/dist/node_modules/semver/internal/identifiers.js +29 -0
  76. package/lambda/asset-transform/dist/node_modules/semver/internal/lrucache.js +42 -0
  77. package/lambda/asset-transform/dist/node_modules/semver/internal/parse-options.js +17 -0
  78. package/lambda/asset-transform/dist/node_modules/semver/internal/re.js +223 -0
  79. package/lambda/asset-transform/dist/node_modules/semver/package.json +78 -0
  80. package/lambda/asset-transform/dist/node_modules/semver/preload.js +4 -0
  81. package/lambda/asset-transform/dist/node_modules/semver/range.bnf +17 -0
  82. package/lambda/asset-transform/dist/node_modules/semver/ranges/gtr.js +6 -0
  83. package/lambda/asset-transform/dist/node_modules/semver/ranges/intersects.js +9 -0
  84. package/lambda/asset-transform/dist/node_modules/semver/ranges/ltr.js +6 -0
  85. package/lambda/asset-transform/dist/node_modules/semver/ranges/max-satisfying.js +27 -0
  86. package/lambda/asset-transform/dist/node_modules/semver/ranges/min-satisfying.js +26 -0
  87. package/lambda/asset-transform/dist/node_modules/semver/ranges/min-version.js +63 -0
  88. package/lambda/asset-transform/dist/node_modules/semver/ranges/outside.js +82 -0
  89. package/lambda/asset-transform/dist/node_modules/semver/ranges/simplify.js +49 -0
  90. package/lambda/asset-transform/dist/node_modules/semver/ranges/subset.js +249 -0
  91. package/lambda/asset-transform/dist/node_modules/semver/ranges/to-comparators.js +10 -0
  92. package/lambda/asset-transform/dist/node_modules/semver/ranges/valid.js +13 -0
  93. package/lambda/asset-transform/dist/node_modules/sharp/LICENSE +191 -0
  94. package/lambda/asset-transform/dist/node_modules/sharp/README.md +112 -0
  95. package/lambda/asset-transform/dist/node_modules/sharp/dist/channel.cjs +177 -0
  96. package/lambda/asset-transform/dist/node_modules/sharp/dist/channel.mjs +177 -0
  97. package/lambda/asset-transform/dist/node_modules/sharp/dist/colour.cjs +199 -0
  98. package/lambda/asset-transform/dist/node_modules/sharp/dist/colour.mjs +199 -0
  99. package/lambda/asset-transform/dist/node_modules/sharp/dist/composite.cjs +213 -0
  100. package/lambda/asset-transform/dist/node_modules/sharp/dist/composite.mjs +213 -0
  101. package/lambda/asset-transform/dist/node_modules/sharp/dist/constructor.cjs +511 -0
  102. package/lambda/asset-transform/dist/node_modules/sharp/dist/constructor.mjs +511 -0
  103. package/lambda/asset-transform/dist/node_modules/sharp/dist/index.cjs +25 -0
  104. package/lambda/asset-transform/dist/node_modules/sharp/dist/index.d.cts +1999 -0
  105. package/lambda/asset-transform/dist/node_modules/sharp/dist/index.d.mts +2046 -0
  106. package/lambda/asset-transform/dist/node_modules/sharp/dist/index.mjs +25 -0
  107. package/lambda/asset-transform/dist/node_modules/sharp/dist/input.cjs +814 -0
  108. package/lambda/asset-transform/dist/node_modules/sharp/dist/input.mjs +814 -0
  109. package/lambda/asset-transform/dist/node_modules/sharp/dist/is.cjs +143 -0
  110. package/lambda/asset-transform/dist/node_modules/sharp/dist/is.mjs +143 -0
  111. package/lambda/asset-transform/dist/node_modules/sharp/dist/libvips.cjs +212 -0
  112. package/lambda/asset-transform/dist/node_modules/sharp/dist/libvips.mjs +212 -0
  113. package/lambda/asset-transform/dist/node_modules/sharp/dist/operation.cjs +998 -0
  114. package/lambda/asset-transform/dist/node_modules/sharp/dist/operation.mjs +998 -0
  115. package/lambda/asset-transform/dist/node_modules/sharp/dist/output.cjs +1788 -0
  116. package/lambda/asset-transform/dist/node_modules/sharp/dist/output.mjs +1788 -0
  117. package/lambda/asset-transform/dist/node_modules/sharp/dist/resize.cjs +617 -0
  118. package/lambda/asset-transform/dist/node_modules/sharp/dist/resize.mjs +617 -0
  119. package/lambda/asset-transform/dist/node_modules/sharp/dist/sharp.cjs +174 -0
  120. package/lambda/asset-transform/dist/node_modules/sharp/dist/sharp.mjs +174 -0
  121. package/lambda/asset-transform/dist/node_modules/sharp/dist/utility.cjs +301 -0
  122. package/lambda/asset-transform/dist/node_modules/sharp/dist/utility.mjs +301 -0
  123. package/lambda/asset-transform/dist/node_modules/sharp/install/build.js +38 -0
  124. package/lambda/asset-transform/dist/node_modules/sharp/lib/index.d.ts +1999 -0
  125. package/lambda/asset-transform/dist/node_modules/sharp/package.json +227 -0
  126. package/lambda/asset-transform/dist/node_modules/sharp/src/binding.gyp +303 -0
  127. package/lambda/asset-transform/dist/node_modules/sharp/src/common.cc +1183 -0
  128. package/lambda/asset-transform/dist/node_modules/sharp/src/common.h +421 -0
  129. package/lambda/asset-transform/dist/node_modules/sharp/src/metadata.cc +404 -0
  130. package/lambda/asset-transform/dist/node_modules/sharp/src/metadata.h +95 -0
  131. package/lambda/asset-transform/dist/node_modules/sharp/src/operations.cc +516 -0
  132. package/lambda/asset-transform/dist/node_modules/sharp/src/operations.h +137 -0
  133. package/lambda/asset-transform/dist/node_modules/sharp/src/pipeline.cc +1948 -0
  134. package/lambda/asset-transform/dist/node_modules/sharp/src/pipeline.h +422 -0
  135. package/lambda/asset-transform/dist/node_modules/sharp/src/sharp.cc +43 -0
  136. package/lambda/asset-transform/dist/node_modules/sharp/src/stats.cc +186 -0
  137. package/lambda/asset-transform/dist/node_modules/sharp/src/stats.h +62 -0
  138. package/lambda/asset-transform/dist/node_modules/sharp/src/utilities.cc +289 -0
  139. package/lambda/asset-transform/dist/node_modules/sharp/src/utilities.h +22 -0
  140. package/lambda/asset-transform/dist/package.json +5 -0
  141. package/package.json +5 -4
  142. package/worker/canopy-worker.service +16 -2
  143. package/worker/dist/index.js +50573 -0
  144. package/LICENSE +0 -21
@@ -0,0 +1,289 @@
1
+ /*!
2
+ Copyright 2013 Lovell Fuller and others.
3
+ SPDX-License-Identifier: Apache-2.0
4
+ */
5
+
6
+ #include <cmath>
7
+ #include <cstdio>
8
+ #include <string>
9
+
10
+ #include <napi.h>
11
+ #include <vips/vips8>
12
+ #include <vips/vector.h>
13
+
14
+ #include "./common.h"
15
+ #include "./operations.h"
16
+ #include "./utilities.h"
17
+
18
+ /*
19
+ Get and set cache limits
20
+ */
21
+ Napi::Value cache(const Napi::CallbackInfo& info) {
22
+ Napi::Env env = info.Env();
23
+
24
+ // Set memory limit
25
+ if (info[size_t(0)].IsNumber()) {
26
+ vips_cache_set_max_mem(static_cast<size_t>(info[size_t(0)].As<Napi::Number>().Uint32Value()) * 1048576);
27
+ }
28
+ // Set file limit
29
+ if (info[size_t(1)].IsNumber()) {
30
+ vips_cache_set_max_files(info[size_t(1)].As<Napi::Number>().Uint32Value());
31
+ }
32
+ // Set items limit
33
+ if (info[size_t(2)].IsNumber()) {
34
+ vips_cache_set_max(info[size_t(2)].As<Napi::Number>().Uint32Value());
35
+ }
36
+
37
+ // Get memory stats
38
+ Napi::Object memory = Napi::Object::New(env);
39
+ memory.Set("current", round(vips_tracked_get_mem() / 1048576));
40
+ memory.Set("high", round(vips_tracked_get_mem_highwater() / 1048576));
41
+ memory.Set("max", round(vips_cache_get_max_mem() / 1048576));
42
+ // Get file stats
43
+ Napi::Object files = Napi::Object::New(env);
44
+ files.Set("current", vips_tracked_get_files());
45
+ files.Set("max", vips_cache_get_max_files());
46
+
47
+ // Get item stats
48
+ Napi::Object items = Napi::Object::New(env);
49
+ items.Set("current", vips_cache_get_size());
50
+ items.Set("max", vips_cache_get_max());
51
+
52
+ Napi::Object cache = Napi::Object::New(env);
53
+ cache.Set("memory", memory);
54
+ cache.Set("files", files);
55
+ cache.Set("items", items);
56
+ return cache;
57
+ }
58
+
59
+ /*
60
+ Get and set size of thread pool
61
+ */
62
+ Napi::Value concurrency(const Napi::CallbackInfo& info) {
63
+ // Set concurrency
64
+ if (info[size_t(0)].IsNumber()) {
65
+ vips_concurrency_set(info[size_t(0)].As<Napi::Number>().Int32Value());
66
+ }
67
+ // Get concurrency
68
+ return Napi::Number::New(info.Env(), vips_concurrency_get());
69
+ }
70
+
71
+ /*
72
+ Get internal counters (queued tasks, processing tasks)
73
+ */
74
+ Napi::Value counters(const Napi::CallbackInfo& info) {
75
+ Napi::Object counters = Napi::Object::New(info.Env());
76
+ counters.Set("queue", static_cast<int>(sharp::counterQueue));
77
+ counters.Set("process", static_cast<int>(sharp::counterProcess));
78
+ return counters;
79
+ }
80
+
81
+ /*
82
+ Get and set use of SIMD vector unit instructions
83
+ */
84
+ Napi::Value simd(const Napi::CallbackInfo& info) {
85
+ // Set state
86
+ if (info[size_t(0)].IsBoolean()) {
87
+ vips_vector_set_enabled(info[size_t(0)].As<Napi::Boolean>().Value());
88
+ }
89
+ // Get state
90
+ return Napi::Boolean::New(info.Env(), vips_vector_isenabled());
91
+ }
92
+
93
+ /*
94
+ Get libvips version
95
+ */
96
+ Napi::Value libvipsVersion(const Napi::CallbackInfo& info) {
97
+ Napi::Env env = info.Env();
98
+ Napi::Object version = Napi::Object::New(env);
99
+
100
+ char semver[9];
101
+ std::snprintf(semver, sizeof(semver), "%d.%d.%d", vips_version(0), vips_version(1), vips_version(2));
102
+ version.Set("semver", Napi::String::New(env, semver));
103
+ #ifdef SHARP_USE_GLOBAL_LIBVIPS
104
+ version.Set("isGlobal", Napi::Boolean::New(env, true));
105
+ #else
106
+ version.Set("isGlobal", Napi::Boolean::New(env, false));
107
+ #endif
108
+ #ifdef __EMSCRIPTEN__
109
+ version.Set("isWasm", Napi::Boolean::New(env, true));
110
+ #else
111
+ version.Set("isWasm", Napi::Boolean::New(env, false));
112
+ #endif
113
+ return version;
114
+ }
115
+
116
+ /*
117
+ Get available input/output file/buffer/stream formats
118
+ */
119
+ Napi::Value format(const Napi::CallbackInfo& info) {
120
+ Napi::Env env = info.Env();
121
+ Napi::Object format = Napi::Object::New(env);
122
+ for (std::string const f : {
123
+ "jpeg", "png", "webp", "tiff", "magick", "openslide", "dz",
124
+ "ppm", "fits", "gif", "svg", "heif", "pdf", "vips", "jp2k", "jxl", "rad", "dcraw"
125
+ }) {
126
+ std::string id = f == "jp2k" ? "jp2" : f;
127
+ // Input
128
+ const VipsObjectClass *oc = vips_class_find("VipsOperation", (f + "load").c_str());
129
+ Napi::Boolean hasInputFile = Napi::Boolean::New(env, oc);
130
+ Napi::Boolean hasInputBuffer =
131
+ Napi::Boolean::New(env, vips_type_find("VipsOperation", (f + "load_buffer").c_str()));
132
+ Napi::Object input = Napi::Object::New(env);
133
+ input.Set("file", hasInputFile);
134
+ input.Set("buffer", hasInputBuffer);
135
+ input.Set("stream", hasInputBuffer);
136
+ if (hasInputFile) {
137
+ const VipsForeignClass *fc = VIPS_FOREIGN_CLASS(oc);
138
+ if (fc->suffs) {
139
+ Napi::Array fileSuffix = Napi::Array::New(env);
140
+ const char **suffix = fc->suffs;
141
+ for (int i = 0; *suffix; i++, suffix++) {
142
+ fileSuffix.Set(i, Napi::String::New(env, *suffix));
143
+ }
144
+ input.Set("fileSuffix", fileSuffix);
145
+ }
146
+ }
147
+ // Output
148
+ Napi::Boolean hasOutputFile =
149
+ Napi::Boolean::New(env, vips_type_find("VipsOperation", (f + "save").c_str()));
150
+ Napi::Boolean hasOutputBuffer =
151
+ Napi::Boolean::New(env, vips_type_find("VipsOperation", (f + "save_buffer").c_str()));
152
+ Napi::Object output = Napi::Object::New(env);
153
+ output.Set("file", hasOutputFile);
154
+ output.Set("buffer", hasOutputBuffer);
155
+ output.Set("stream", hasOutputBuffer);
156
+ // Other attributes
157
+ Napi::Object container = Napi::Object::New(env);
158
+ container.Set("id", id);
159
+ container.Set("input", input);
160
+ container.Set("output", output);
161
+ // Add to set of formats
162
+ format.Set(id, container);
163
+ }
164
+
165
+ // Raw, uncompressed data
166
+ Napi::Boolean supported = Napi::Boolean::New(env, true);
167
+ Napi::Boolean unsupported = Napi::Boolean::New(env, false);
168
+ Napi::Object rawInput = Napi::Object::New(env);
169
+ rawInput.Set("file", unsupported);
170
+ rawInput.Set("buffer", supported);
171
+ rawInput.Set("stream", supported);
172
+ Napi::Object rawOutput = Napi::Object::New(env);
173
+ rawOutput.Set("file", unsupported);
174
+ rawOutput.Set("buffer", supported);
175
+ rawOutput.Set("stream", supported);
176
+ Napi::Object raw = Napi::Object::New(env);
177
+ raw.Set("id", "raw");
178
+ raw.Set("input", rawInput);
179
+ raw.Set("output", rawOutput);
180
+ format.Set("raw", raw);
181
+
182
+ return format;
183
+ }
184
+
185
+ /*
186
+ (Un)block libvips operations at runtime.
187
+ */
188
+ void block(const Napi::CallbackInfo& info) {
189
+ Napi::Array ops = info[size_t(0)].As<Napi::Array>();
190
+ bool const state = info[size_t(1)].As<Napi::Boolean>().Value();
191
+ for (unsigned int i = 0; i < ops.Length(); i++) {
192
+ vips_operation_block_set(ops.Get(i).As<Napi::String>().Utf8Value().c_str(), state);
193
+ }
194
+ }
195
+
196
+ /*
197
+ Synchronous, internal-only method used by some of the functional tests.
198
+ Calculates the maximum colour distance using the DE2000 algorithm
199
+ between two images of the same dimensions and number of channels.
200
+ */
201
+ Napi::Value _maxColourDistance(const Napi::CallbackInfo& info) {
202
+ Napi::Env env = info.Env();
203
+
204
+ // Open input files
205
+ VImage image1;
206
+ sharp::ImageType imageType1 = sharp::DetermineImageType(info[size_t(0)].As<Napi::String>().Utf8Value().data());
207
+ if (imageType1 != sharp::ImageType::UNKNOWN) {
208
+ try {
209
+ image1 = VImage::new_from_file(info[size_t(0)].As<Napi::String>().Utf8Value().c_str());
210
+ } catch (...) {
211
+ throw Napi::Error::New(env, "Input file 1 has corrupt header");
212
+ }
213
+ } else {
214
+ throw Napi::Error::New(env, "Input file 1 is of an unsupported image format");
215
+ }
216
+ VImage image2;
217
+ sharp::ImageType imageType2 = sharp::DetermineImageType(info[size_t(1)].As<Napi::String>().Utf8Value().data());
218
+ if (imageType2 != sharp::ImageType::UNKNOWN) {
219
+ try {
220
+ image2 = VImage::new_from_file(info[size_t(1)].As<Napi::String>().Utf8Value().c_str());
221
+ } catch (...) {
222
+ throw Napi::Error::New(env, "Input file 2 has corrupt header");
223
+ }
224
+ } else {
225
+ throw Napi::Error::New(env, "Input file 2 is of an unsupported image format");
226
+ }
227
+ // Ensure same number of channels
228
+ if (image1.bands() != image2.bands()) {
229
+ throw Napi::Error::New(env, "mismatchedBands");
230
+ }
231
+ // Ensure same dimensions
232
+ if (image1.width() != image2.width() || image1.height() != image2.height()) {
233
+ throw Napi::Error::New(env, "mismatchedDimensions");
234
+ }
235
+
236
+ double maxColourDistance;
237
+ try {
238
+ // Premultiply and remove alpha
239
+ if (image1.has_alpha()) {
240
+ image1 = image1.premultiply().extract_band(1, VImage::option()->set("n", image1.bands() - 1));
241
+ }
242
+ if (image2.has_alpha()) {
243
+ image2 = image2.premultiply().extract_band(1, VImage::option()->set("n", image2.bands() - 1));
244
+ }
245
+ // Calculate colour distance
246
+ maxColourDistance = image1.dE00(image2).max();
247
+ } catch (std::runtime_error const &err) {
248
+ throw Napi::Error::New(env, err.what());
249
+ }
250
+
251
+ // Clean up libvips' per-request data and threads
252
+ vips_error_clear();
253
+ vips_thread_shutdown();
254
+
255
+ return Napi::Number::New(env, maxColourDistance);
256
+ }
257
+
258
+ #if defined(__GNUC__)
259
+ // mallctl will be resolved by the runtime linker when jemalloc is being used
260
+ extern "C" {
261
+ int mallctl(const char *name, void *oldp, size_t *oldlenp, void *newp, size_t newlen) __attribute__((weak));
262
+ }
263
+ Napi::Value _isUsingJemalloc(const Napi::CallbackInfo& info) {
264
+ Napi::Env env = info.Env();
265
+ return Napi::Boolean::New(env, mallctl != nullptr);
266
+ }
267
+ #else
268
+ Napi::Value _isUsingJemalloc(const Napi::CallbackInfo& info) {
269
+ Napi::Env env = info.Env();
270
+ return Napi::Boolean::New(env, false);
271
+ }
272
+ #endif
273
+
274
+ #if defined(__GNUC__) && defined(__x86_64__)
275
+ // Are SSE 4.2 intrinsics available at runtime?
276
+ Napi::Value _isUsingX64V2(const Napi::CallbackInfo& info) {
277
+ Napi::Env env = info.Env();
278
+ unsigned int eax, ebx, ecx, edx;
279
+ __asm__ __volatile__("cpuid"
280
+ : "=a"(eax), "=b"(ebx), "=c"(ecx), "=d"(edx)
281
+ : "a"(1));
282
+ return Napi::Boolean::New(env, (ecx & 1U << 20) != 0);
283
+ }
284
+ #else
285
+ Napi::Value _isUsingX64V2(const Napi::CallbackInfo& info) {
286
+ Napi::Env env = info.Env();
287
+ return Napi::Boolean::New(env, false);
288
+ }
289
+ #endif
@@ -0,0 +1,22 @@
1
+ /*!
2
+ Copyright 2013 Lovell Fuller and others.
3
+ SPDX-License-Identifier: Apache-2.0
4
+ */
5
+
6
+ #ifndef SRC_UTILITIES_H_
7
+ #define SRC_UTILITIES_H_
8
+
9
+ #include <napi.h>
10
+
11
+ Napi::Value cache(const Napi::CallbackInfo& info);
12
+ Napi::Value concurrency(const Napi::CallbackInfo& info);
13
+ Napi::Value counters(const Napi::CallbackInfo& info);
14
+ Napi::Value simd(const Napi::CallbackInfo& info);
15
+ Napi::Value libvipsVersion(const Napi::CallbackInfo& info);
16
+ Napi::Value format(const Napi::CallbackInfo& info);
17
+ void block(const Napi::CallbackInfo& info);
18
+ Napi::Value _maxColourDistance(const Napi::CallbackInfo& info);
19
+ Napi::Value _isUsingJemalloc(const Napi::CallbackInfo& info);
20
+ Napi::Value _isUsingX64V2(const Napi::CallbackInfo& info);
21
+
22
+ #endif // SRC_UTILITIES_H_
@@ -0,0 +1,5 @@
1
+ {
2
+ "name": "canopy-asset-transform-lambda",
3
+ "private": true,
4
+ "version": "0.0.0"
5
+ }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "canopycms-cdk",
3
- "version": "0.0.58",
3
+ "version": "0.0.59",
4
4
  "description": "AWS CDK constructs and EC2 worker for CanopyCMS deployment",
5
5
  "license": "MIT",
6
6
  "repository": {
@@ -21,7 +21,8 @@
21
21
  "files": [
22
22
  "dist",
23
23
  "worker/dist",
24
- "worker/canopy-worker.service"
24
+ "worker/canopy-worker.service",
25
+ "lambda/asset-transform/dist"
25
26
  ],
26
27
  "engines": {
27
28
  "node": ">=18"
@@ -52,8 +53,8 @@
52
53
  "tsx": "^4.19.0",
53
54
  "typescript": "^5.6.3",
54
55
  "vitest": "^4.1.0",
55
- "canopycms": "0.0.58",
56
- "canopycms-auth-clerk": "0.0.58"
56
+ "canopycms": "0.0.59",
57
+ "canopycms-auth-clerk": "0.0.59"
57
58
  },
58
59
  "scripts": {
59
60
  "build": "tsc",
@@ -1,6 +1,10 @@
1
1
  [Unit]
2
2
  Description=CanopyCMS Worker Daemon
3
3
  After=network.target
4
+ # Never run against an unmounted workspace filesystem (matches the deployed
5
+ # copy of this unit, which cms-service.ts user-data writes with an fstab
6
+ # entry for /mnt/efs).
7
+ RequiresMountsFor=/mnt/efs
4
8
 
5
9
  [Service]
6
10
  Type=simple
@@ -10,8 +14,18 @@ ExecStart=/usr/bin/node index.js
10
14
  Restart=always
11
15
  RestartSec=5
12
16
  TimeoutStartSec=300
13
- StandardOutput=journal
14
- StandardError=journal
17
+ # File output, not journal: the CloudWatch agent cannot read journald,
18
+ # so it tails this file instead (agent config lives in the cms-service.ts
19
+ # user-data, which writes the deployed copy of this unit).
20
+ # CAUTION: /var/log/canopy-worker must exist BEFORE first start. systemd
21
+ # opens append: targets before it creates LogsDirectory= dirs
22
+ # (systemd#27591), so without the pre-created dir the exec fails with
23
+ # 209/STDOUT and Restart=always crash-loops forever. The deployed user-data
24
+ # runs mkdir first; do the same if you install this unit by hand.
25
+ # LogsDirectory= is kept for ownership management on subsequent starts.
26
+ LogsDirectory=canopy-worker
27
+ StandardOutput=append:/var/log/canopy-worker/worker.log
28
+ StandardError=append:/var/log/canopy-worker/worker.log
15
29
 
16
30
  # Environment
17
31
  EnvironmentFile=/opt/canopy-worker/.env