@balena/pinejs 19.7.3-build-renovate-postgres-17-x-2d03a162db08921d8a448438b1e1514c161bb75a-1 → 20.0.0-build-esm-78a099606f287bc0df4001425788a7ad1c708ba1-1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.pinejs-cache.json +1 -1
- package/.versionbot/CHANGELOG.yml +22 -7
- package/CHANGELOG.md +5 -3
- package/{Gruntfile.ts → Gruntfile.cts} +9 -22
- package/VERSION +1 -1
- package/bin/abstract-sql-compiler.js +1 -1
- package/bin/odata-compiler.js +1 -1
- package/bin/sbvr-compiler.js +1 -1
- package/build/{browser.ts → browser.cts} +1 -1
- package/build/{config.ts → config.cts} +5 -1
- package/build/{module.ts → module.cts} +1 -1
- package/build/{server.ts → server.cts} +1 -1
- package/docker-compose.npm-test.yml +1 -1
- package/out/bin/abstract-sql-compiler.js +17 -19
- package/out/bin/abstract-sql-compiler.js.map +1 -1
- package/out/bin/odata-compiler.js +19 -21
- package/out/bin/odata-compiler.js.map +1 -1
- package/out/bin/sbvr-compiler.js +19 -54
- package/out/bin/sbvr-compiler.js.map +1 -1
- package/out/bin/utils.d.ts +3 -3
- package/out/bin/utils.js +21 -53
- package/out/bin/utils.js.map +1 -1
- package/out/config-loader/config-loader.d.ts +7 -7
- package/out/config-loader/config-loader.js +23 -63
- package/out/config-loader/config-loader.js.map +1 -1
- package/out/config-loader/env.d.ts +1 -1
- package/out/config-loader/env.js +24 -66
- package/out/config-loader/env.js.map +1 -1
- package/out/data-server/sbvr-server.d.ts +3 -3
- package/out/data-server/sbvr-server.js +5 -42
- package/out/data-server/sbvr-server.js.map +1 -1
- package/out/database-layer/db.d.ts +3 -3
- package/out/database-layer/db.js +37 -83
- package/out/database-layer/db.js.map +1 -1
- package/out/express-emulator/express.js.map +1 -1
- package/out/extended-sbvr-parser/extended-sbvr-parser.js +8 -11
- package/out/extended-sbvr-parser/extended-sbvr-parser.js.map +1 -1
- package/out/http-transactions/transactions.d.ts +2 -2
- package/out/http-transactions/transactions.js +4 -4
- package/out/http-transactions/transactions.js.map +1 -1
- package/out/migrator/async.d.ts +2 -2
- package/out/migrator/async.js +20 -60
- package/out/migrator/async.js.map +1 -1
- package/out/migrator/migrations.js +1 -2
- package/out/migrator/sync.d.ts +6 -6
- package/out/migrator/sync.js +20 -61
- package/out/migrator/sync.js.map +1 -1
- package/out/migrator/utils.d.ts +4 -4
- package/out/migrator/utils.js +42 -97
- package/out/migrator/utils.js.map +1 -1
- package/out/odata-metadata/odata-metadata-generator.js +7 -14
- package/out/odata-metadata/odata-metadata-generator.js.map +1 -1
- package/out/passport-pinejs/mount-login-router.d.ts +1 -1
- package/out/passport-pinejs/mount-login-router.js +4 -41
- package/out/passport-pinejs/mount-login-router.js.map +1 -1
- package/out/passport-pinejs/passport-pinejs.d.ts +3 -3
- package/out/passport-pinejs/passport-pinejs.js +11 -46
- package/out/passport-pinejs/passport-pinejs.js.map +1 -1
- package/out/pinejs-session-store/pinejs-session-store.d.ts +1 -1
- package/out/pinejs-session-store/pinejs-session-store.js +11 -48
- package/out/pinejs-session-store/pinejs-session-store.js.map +1 -1
- package/out/sbvr-api/abstract-sql.d.ts +3 -3
- package/out/sbvr-api/abstract-sql.js +22 -65
- package/out/sbvr-api/abstract-sql.js.map +1 -1
- package/out/sbvr-api/cached-compile.js +8 -15
- package/out/sbvr-api/cached-compile.js.map +1 -1
- package/out/sbvr-api/common-types.js +1 -2
- package/out/sbvr-api/control-flow.d.ts +1 -1
- package/out/sbvr-api/control-flow.js +12 -25
- package/out/sbvr-api/control-flow.js.map +1 -1
- package/out/sbvr-api/dev.js +1 -2
- package/out/sbvr-api/errors.d.ts +1 -1
- package/out/sbvr-api/errors.js +47 -95
- package/out/sbvr-api/errors.js.map +1 -1
- package/out/sbvr-api/express-extension.d.ts +2 -2
- package/out/sbvr-api/express-extension.js +1 -2
- package/out/sbvr-api/hooks.d.ts +4 -4
- package/out/sbvr-api/hooks.js +23 -35
- package/out/sbvr-api/hooks.js.map +1 -1
- package/out/sbvr-api/odata-response.d.ts +2 -2
- package/out/sbvr-api/odata-response.js +19 -29
- package/out/sbvr-api/odata-response.js.map +1 -1
- package/out/sbvr-api/permissions.d.ts +9 -9
- package/out/sbvr-api/permissions.js +106 -159
- package/out/sbvr-api/permissions.js.map +1 -1
- package/out/sbvr-api/sbvr-utils.d.ts +40 -18
- package/out/sbvr-api/sbvr-utils.js +222 -285
- package/out/sbvr-api/sbvr-utils.js.map +1 -1
- package/out/sbvr-api/translations.d.ts +1 -1
- package/out/sbvr-api/translations.js +10 -17
- package/out/sbvr-api/translations.js.map +1 -1
- package/out/sbvr-api/uri-parser.d.ts +7 -7
- package/out/sbvr-api/uri-parser.js +39 -84
- package/out/sbvr-api/uri-parser.js.map +1 -1
- package/out/sbvr-api/user.js +1 -2
- package/out/server-glue/global-ext.d.ts +0 -3
- package/out/server-glue/module.d.ts +16 -16
- package/out/server-glue/module.js +20 -59
- package/out/server-glue/module.js.map +1 -1
- package/out/server-glue/sbvr-loader.d.ts +2 -1
- package/out/server-glue/sbvr-loader.js +4 -11
- package/out/server-glue/sbvr-loader.js.map +1 -1
- package/out/server-glue/server.d.ts +2 -2
- package/out/server-glue/server.js +17 -59
- package/out/server-glue/server.js.map +1 -1
- package/out/tasks/common.d.ts +1 -1
- package/out/tasks/common.js +3 -9
- package/out/tasks/common.js.map +1 -1
- package/out/tasks/index.d.ts +8 -8
- package/out/tasks/index.js +25 -63
- package/out/tasks/index.js.map +1 -1
- package/out/tasks/tasks.js +1 -2
- package/out/tasks/worker.d.ts +3 -3
- package/out/tasks/worker.js +14 -51
- package/out/tasks/worker.js.map +1 -1
- package/out/webresource-handler/handlers/NoopHandler.d.ts +1 -1
- package/out/webresource-handler/handlers/NoopHandler.js +1 -5
- package/out/webresource-handler/handlers/NoopHandler.js.map +1 -1
- package/out/webresource-handler/handlers/S3Handler.d.ts +1 -1
- package/out/webresource-handler/handlers/S3Handler.js +17 -24
- package/out/webresource-handler/handlers/S3Handler.js.map +1 -1
- package/out/webresource-handler/handlers/index.d.ts +2 -2
- package/out/webresource-handler/handlers/index.js +2 -18
- package/out/webresource-handler/handlers/index.js.map +1 -1
- package/out/webresource-handler/index.d.ts +3 -3
- package/out/webresource-handler/index.js +35 -85
- package/out/webresource-handler/index.js.map +1 -1
- package/package.json +14 -14
- package/src/bin/abstract-sql-compiler.ts +3 -3
- package/src/bin/odata-compiler.ts +3 -3
- package/src/bin/sbvr-compiler.ts +2 -2
- package/src/bin/utils.ts +23 -15
- package/src/config-loader/config-loader.ts +12 -12
- package/src/config-loader/env.ts +3 -3
- package/src/data-server/sbvr-server.ts +4 -4
- package/src/database-layer/db.ts +18 -11
- package/src/extended-sbvr-parser/extended-sbvr-parser.ts +5 -5
- package/src/http-transactions/transactions.js +4 -4
- package/src/migrator/async.ts +5 -5
- package/src/migrator/sync.ts +8 -8
- package/src/migrator/utils.ts +7 -7
- package/src/odata-metadata/odata-metadata-generator.ts +3 -2
- package/src/passport-pinejs/mount-login-router.ts +3 -3
- package/src/passport-pinejs/passport-pinejs.ts +6 -6
- package/src/pinejs-session-store/pinejs-session-store.ts +4 -4
- package/src/sbvr-api/abstract-sql.ts +6 -6
- package/src/sbvr-api/cached-compile.ts +2 -2
- package/src/sbvr-api/control-flow.ts +1 -1
- package/src/sbvr-api/errors.ts +1 -1
- package/src/sbvr-api/express-extension.ts +2 -2
- package/src/sbvr-api/hooks.ts +5 -5
- package/src/sbvr-api/odata-response.ts +8 -4
- package/src/sbvr-api/permissions.ts +19 -19
- package/src/sbvr-api/sbvr-utils.ts +39 -33
- package/src/sbvr-api/translations.ts +1 -1
- package/src/sbvr-api/uri-parser.ts +10 -10
- package/src/server-glue/global-ext.d.ts +0 -3
- package/src/server-glue/module.ts +20 -20
- package/src/server-glue/sbvr-loader.ts +15 -27
- package/src/server-glue/server.ts +13 -24
- package/src/tasks/common.ts +1 -1
- package/src/tasks/index.ts +14 -14
- package/src/tasks/worker.ts +8 -8
- package/src/webresource-handler/handlers/NoopHandler.ts +5 -1
- package/src/webresource-handler/handlers/S3Handler.ts +1 -1
- package/src/webresource-handler/handlers/index.ts +2 -2
- package/src/webresource-handler/index.ts +10 -10
- package/tsconfig.dev.json +4 -2
- package/tsconfig.json +1 -1
- package/typings/lf-to-abstract-sql.d.ts +2 -2
- package/typings/memoizee.d.ts +2 -2
package/out/tasks/worker.js
CHANGED
@@ -1,45 +1,9 @@
|
|
1
|
-
|
2
|
-
|
3
|
-
|
4
|
-
|
5
|
-
|
6
|
-
|
7
|
-
}
|
8
|
-
Object.defineProperty(o, k2, desc);
|
9
|
-
}) : (function(o, m, k, k2) {
|
10
|
-
if (k2 === undefined) k2 = k;
|
11
|
-
o[k2] = m[k];
|
12
|
-
}));
|
13
|
-
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
14
|
-
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
15
|
-
}) : function(o, v) {
|
16
|
-
o["default"] = v;
|
17
|
-
});
|
18
|
-
var __importStar = (this && this.__importStar) || (function () {
|
19
|
-
var ownKeys = function(o) {
|
20
|
-
ownKeys = Object.getOwnPropertyNames || function (o) {
|
21
|
-
var ar = [];
|
22
|
-
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
23
|
-
return ar;
|
24
|
-
};
|
25
|
-
return ownKeys(o);
|
26
|
-
};
|
27
|
-
return function (mod) {
|
28
|
-
if (mod && mod.__esModule) return mod;
|
29
|
-
var result = {};
|
30
|
-
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
31
|
-
__setModuleDefault(result, mod);
|
32
|
-
return result;
|
33
|
-
};
|
34
|
-
})();
|
35
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
36
|
-
exports.Worker = void 0;
|
37
|
-
const promises_1 = require("node:timers/promises");
|
38
|
-
const env_1 = require("../config-loader/env");
|
39
|
-
const permissions = __importStar(require("../sbvr-api/permissions"));
|
40
|
-
const sbvr_utils_1 = require("../sbvr-api/sbvr-utils");
|
41
|
-
const module_1 = require("../server-glue/module");
|
42
|
-
const common_1 = require("./common");
|
1
|
+
import { setTimeout } from 'node:timers/promises';
|
2
|
+
import { tasks as tasksEnv } from '../config-loader/env.js';
|
3
|
+
import * as permissions from '../sbvr-api/permissions.js';
|
4
|
+
import { PinejsClient } from '../sbvr-api/sbvr-utils.js';
|
5
|
+
import { sbvrUtils } from '../server-glue/module.js';
|
6
|
+
import { ajv } from './common.js';
|
43
7
|
const selectColumns = Object.entries({
|
44
8
|
id: 'id',
|
45
9
|
'is executed by-handler': 'is_executed_by__handler',
|
@@ -51,7 +15,7 @@ const selectColumns = Object.entries({
|
|
51
15
|
})
|
52
16
|
.map(([key, value]) => `t."${key}" AS "${value}"`)
|
53
17
|
.join(', ');
|
54
|
-
class Worker {
|
18
|
+
export class Worker {
|
55
19
|
client;
|
56
20
|
handlers = {};
|
57
21
|
concurrency;
|
@@ -60,8 +24,8 @@ class Worker {
|
|
60
24
|
executing = 0;
|
61
25
|
constructor(client) {
|
62
26
|
this.client = client;
|
63
|
-
this.concurrency =
|
64
|
-
this.interval =
|
27
|
+
this.concurrency = tasksEnv.queueConcurrency;
|
28
|
+
this.interval = tasksEnv.queueIntervalMS;
|
65
29
|
}
|
66
30
|
canExecute() {
|
67
31
|
return (this.executing < this.concurrency && Object.keys(this.handlers).length > 0);
|
@@ -77,14 +41,14 @@ class Worker {
|
|
77
41
|
}
|
78
42
|
if (handler.validate != null &&
|
79
43
|
!handler.validate(task.is_executed_with__parameter_set)) {
|
80
|
-
await this.update(tx, task, startedOnTime, 'failed', `Invalid parameter set: ${
|
44
|
+
await this.update(tx, task, startedOnTime, 'failed', `Invalid parameter set: ${ajv.errorsText(handler.validate.errors)}`);
|
81
45
|
return;
|
82
46
|
}
|
83
47
|
let status = 'queued';
|
84
48
|
let error;
|
85
49
|
try {
|
86
50
|
const results = await handler.fn({
|
87
|
-
api: new
|
51
|
+
api: new PinejsClient({}),
|
88
52
|
params: task.is_executed_with__parameter_set ?? {},
|
89
53
|
});
|
90
54
|
status = results.status;
|
@@ -162,7 +126,7 @@ class Worker {
|
|
162
126
|
if (handlerNames.length === 0) {
|
163
127
|
return;
|
164
128
|
}
|
165
|
-
await
|
129
|
+
await sbvrUtils.db.transaction(async (tx) => {
|
166
130
|
const result = await tx.executeSql(`SELECT ${selectColumns}
|
167
131
|
FROM task AS t
|
168
132
|
WHERE
|
@@ -188,7 +152,7 @@ class Worker {
|
|
188
152
|
}
|
189
153
|
finally {
|
190
154
|
if (!executed) {
|
191
|
-
await
|
155
|
+
await setTimeout(this.interval);
|
192
156
|
}
|
193
157
|
if (this.running) {
|
194
158
|
this.poll();
|
@@ -200,7 +164,7 @@ class Worker {
|
|
200
164
|
this.running = false;
|
201
165
|
}
|
202
166
|
async start() {
|
203
|
-
if (
|
167
|
+
if (sbvrUtils.db.engine !== 'postgres') {
|
204
168
|
throw new Error('Database does not support tasks, giving up on starting worker');
|
205
169
|
}
|
206
170
|
const handlerNames = Object.keys(this.handlers);
|
@@ -234,5 +198,4 @@ class Worker {
|
|
234
198
|
}
|
235
199
|
}
|
236
200
|
}
|
237
|
-
exports.Worker = Worker;
|
238
201
|
//# sourceMappingURL=worker.js.map
|
package/out/tasks/worker.js.map
CHANGED
@@ -1 +1 @@
|
|
1
|
-
{"version":3,"file":"worker.js","sourceRoot":"","sources":["../../src/tasks/worker.ts"],"names":[],"mappings":"
|
1
|
+
{"version":3,"file":"worker.js","sourceRoot":"","sources":["../../src/tasks/worker.ts"],"names":[],"mappings":"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"}
|
@@ -1,5 +1,5 @@
|
|
1
1
|
import type { WebResourceType as WebResource } from '@balena/sbvr-types';
|
2
|
-
import type { IncomingFile, UploadResponse, WebResourceHandler } from '
|
2
|
+
import type { IncomingFile, UploadResponse, WebResourceHandler } from '../index.js';
|
3
3
|
export declare class NoopHandler implements WebResourceHandler {
|
4
4
|
handleFile(resource: IncomingFile): Promise<UploadResponse>;
|
5
5
|
removeFile(): Promise<void>;
|
@@ -1,7 +1,4 @@
|
|
1
|
-
|
2
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
3
|
-
exports.NoopHandler = void 0;
|
4
|
-
class NoopHandler {
|
1
|
+
export class NoopHandler {
|
5
2
|
async handleFile(resource) {
|
6
3
|
resource.stream.resume();
|
7
4
|
return {
|
@@ -16,5 +13,4 @@ class NoopHandler {
|
|
16
13
|
return webResource;
|
17
14
|
}
|
18
15
|
}
|
19
|
-
exports.NoopHandler = NoopHandler;
|
20
16
|
//# sourceMappingURL=NoopHandler.js.map
|
@@ -1 +1 @@
|
|
1
|
-
{"version":3,"file":"NoopHandler.js","sourceRoot":"","sources":["../../../src/webresource-handler/handlers/NoopHandler.ts"],"names":[],"mappings":"
|
1
|
+
{"version":3,"file":"NoopHandler.js","sourceRoot":"","sources":["../../../src/webresource-handler/handlers/NoopHandler.ts"],"names":[],"mappings":"AAOA,MAAM,OAAO,WAAW;IAChB,KAAK,CAAC,UAAU,CAAC,QAAsB;QAE7C,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,CAAC;QACzB,OAAO;YACN,QAAQ,EAAE,MAAM;YAChB,IAAI,EAAE,CAAC;SACP,CAAC;IACH,CAAC;IAEM,KAAK,CAAC,UAAU;QACtB,OAAO;IACR,CAAC;IAEM,KAAK,CAAC,YAAY,CAAC,WAAwB;QACjD,OAAO,WAAW,CAAC;IACpB,CAAC;CACD"}
|
@@ -1,4 +1,4 @@
|
|
1
|
-
import { type IncomingFile, type UploadResponse, type WebResourceHandler } from '
|
1
|
+
import { type IncomingFile, type UploadResponse, type WebResourceHandler } from '../index.js';
|
2
2
|
import type { WebResourceType as WebResource } from '@balena/sbvr-types';
|
3
3
|
export interface S3HandlerProps {
|
4
4
|
region: string;
|
@@ -1,16 +1,10 @@
|
|
1
|
-
|
2
|
-
|
3
|
-
|
4
|
-
};
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
const client_s3_1 = require("@aws-sdk/client-s3");
|
9
|
-
const lib_storage_1 = require("@aws-sdk/lib-storage");
|
10
|
-
const s3_request_presigner_1 = require("@aws-sdk/s3-request-presigner");
|
11
|
-
const crypto_1 = require("crypto");
|
12
|
-
const memoizee_1 = __importDefault(require("memoizee"));
|
13
|
-
class S3Handler {
|
1
|
+
import { FileSizeExceededError, normalizeHref, WebResourceError, } from '../index.js';
|
2
|
+
import { S3Client, DeleteObjectCommand, GetObjectCommand, } from '@aws-sdk/client-s3';
|
3
|
+
import { Upload } from '@aws-sdk/lib-storage';
|
4
|
+
import { getSignedUrl } from '@aws-sdk/s3-request-presigner';
|
5
|
+
import { randomUUID } from 'crypto';
|
6
|
+
import memoize from 'memoizee';
|
7
|
+
export class S3Handler {
|
14
8
|
config;
|
15
9
|
bucket;
|
16
10
|
maxFileSize;
|
@@ -34,21 +28,21 @@ class S3Handler {
|
|
34
28
|
config.signedUrlCacheExpireTimeSeconds ?? 82800;
|
35
29
|
this.maxFileSize = config.maxSize ?? 52428800;
|
36
30
|
this.bucket = config.bucket;
|
37
|
-
this.client = new
|
38
|
-
this.cachedGetSignedUrl = (
|
31
|
+
this.client = new S3Client(this.config);
|
32
|
+
this.cachedGetSignedUrl = memoize(this.s3SignUrl, {
|
39
33
|
maxAge: this.signedUrlCacheExpireTimeSeconds * 1000,
|
40
34
|
});
|
41
35
|
}
|
42
36
|
async handleFile(resource) {
|
43
37
|
let size = 0;
|
44
|
-
const key = `${resource.fieldname}_${
|
38
|
+
const key = `${resource.fieldname}_${randomUUID()}_${resource.originalname}`;
|
45
39
|
const params = {
|
46
40
|
Bucket: this.bucket,
|
47
41
|
Key: key,
|
48
42
|
Body: resource.stream,
|
49
43
|
ContentType: resource.mimetype,
|
50
44
|
};
|
51
|
-
const upload = new
|
45
|
+
const upload = new Upload({ client: this.client, params });
|
52
46
|
upload.on('httpUploadProgress', async (ev) => {
|
53
47
|
size = ev.total ?? ev.loaded;
|
54
48
|
if (size > this.maxFileSize) {
|
@@ -61,16 +55,16 @@ class S3Handler {
|
|
61
55
|
catch (err) {
|
62
56
|
resource.stream.resume();
|
63
57
|
if (size > this.maxFileSize) {
|
64
|
-
throw new
|
58
|
+
throw new FileSizeExceededError(this.maxFileSize);
|
65
59
|
}
|
66
|
-
throw new
|
60
|
+
throw new WebResourceError(err);
|
67
61
|
}
|
68
62
|
const filename = this.getS3URL(key);
|
69
63
|
return { size, filename };
|
70
64
|
}
|
71
65
|
async removeFile(href) {
|
72
66
|
const fileKey = this.getKeyFromHref(href);
|
73
|
-
const command = new
|
67
|
+
const command = new DeleteObjectCommand({
|
74
68
|
Bucket: this.bucket,
|
75
69
|
Key: fileKey,
|
76
70
|
});
|
@@ -84,11 +78,11 @@ class S3Handler {
|
|
84
78
|
return webResource;
|
85
79
|
}
|
86
80
|
s3SignUrl(fileKey) {
|
87
|
-
const command = new
|
81
|
+
const command = new GetObjectCommand({
|
88
82
|
Bucket: this.bucket,
|
89
83
|
Key: fileKey,
|
90
84
|
});
|
91
|
-
return
|
85
|
+
return getSignedUrl(this.client, command, {
|
92
86
|
expiresIn: this.signedUrlExpireTimeSeconds,
|
93
87
|
});
|
94
88
|
}
|
@@ -96,9 +90,8 @@ class S3Handler {
|
|
96
90
|
return `${this.config.endpoint}/${this.bucket}/${key}`;
|
97
91
|
}
|
98
92
|
getKeyFromHref(href) {
|
99
|
-
const hrefWithoutParams =
|
93
|
+
const hrefWithoutParams = normalizeHref(href);
|
100
94
|
return hrefWithoutParams.substring(hrefWithoutParams.lastIndexOf('/') + 1);
|
101
95
|
}
|
102
96
|
}
|
103
|
-
exports.S3Handler = S3Handler;
|
104
97
|
//# sourceMappingURL=S3Handler.js.map
|
@@ -1 +1 @@
|
|
1
|
-
{"version":3,"file":"S3Handler.js","sourceRoot":"","sources":["../../../src/webresource-handler/handlers/S3Handler.ts"],"names":[],"mappings":"
|
1
|
+
{"version":3,"file":"S3Handler.js","sourceRoot":"","sources":["../../../src/webresource-handler/handlers/S3Handler.ts"],"names":[],"mappings":"AAAA,OAAO,EACN,qBAAqB,EAErB,aAAa,EAEb,gBAAgB,GAEhB,MAAM,aAAa,CAAC;AACrB,OAAO,EACN,QAAQ,EAER,mBAAmB,EAEnB,gBAAgB,GAChB,MAAM,oBAAoB,CAAC;AAC5B,OAAO,EAAE,MAAM,EAAE,MAAM,sBAAsB,CAAC;AAC9C,OAAO,EAAE,YAAY,EAAE,MAAM,+BAA+B,CAAC;AAE7D,OAAO,EAAE,UAAU,EAAE,MAAM,QAAQ,CAAC;AAEpC,OAAO,OAAO,MAAM,UAAU,CAAC;AAa/B,MAAM,OAAO,SAAS;IACJ,MAAM,CAAiB;IACvB,MAAM,CAAS;IACf,WAAW,CAAS;IAElB,0BAA0B,CAAS;IACnC,+BAA+B,CAAS;IACjD,kBAAkB,CAAuC;IAE3D,MAAM,CAAW;IAEzB,YAAY,MAAsB;QACjC,IAAI,CAAC,MAAM,GAAG;YACb,MAAM,EAAE,MAAM,CAAC,MAAM;YACrB,WAAW,EAAE;gBACZ,WAAW,EAAE,MAAM,CAAC,SAAS;gBAC7B,eAAe,EAAE,MAAM,CAAC,SAAS;aACjC;YACD,QAAQ,EAAE,MAAM,CAAC,QAAQ;YACzB,cAAc,EAAE,IAAI;SACpB,CAAC;QAEF,IAAI,CAAC,0BAA0B;YAC9B,MAAM,CAAC,0BAA0B,IAAI,KAAK,CAAC;QAC5C,IAAI,CAAC,+BAA+B;YACnC,MAAM,CAAC,+BAA+B,IAAI,KAAK,CAAC;QAEjD,IAAI,CAAC,WAAW,GAAG,MAAM,CAAC,OAAO,IAAI,QAAQ,CAAC;QAC9C,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC,MAAM,CAAC;QAC5B,IAAI,CAAC,MAAM,GAAG,IAAI,QAAQ,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;QAIxC,IAAI,CAAC,kBAAkB,GAAG,OAAO,CAAC,IAAI,CAAC,SAAS,EAAE;YACjD,MAAM,EAAE,IAAI,CAAC,+BAA+B,GAAG,IAAI;SACnD,CAAC,CAAC;IACJ,CAAC;IAEM,KAAK,CAAC,UAAU,CAAC,QAAsB;QAC7C,IAAI,IAAI,GAAG,CAAC,CAAC;QACb,MAAM,GAAG,GAAG,GAAG,QAAQ,CAAC,SAAS,IAAI,UAAU,EAAE,IAChD,QAAQ,CAAC,YACV,EAAE,CAAC;QACH,MAAM,MAAM,GAA0B;YACrC,MAAM,EAAE,IAAI,CAAC,MAAM;YACnB,GAAG,EAAE,GAAG;YACR,IAAI,EAAE,QAAQ,CAAC,MAAM;YACrB,WAAW,EAAE,QAAQ,CAAC,QAAQ;SAC9B,CAAC;QACF,MAAM,MAAM,GAAG,IAAI,MAAM,CAAC,EAAE,MAAM,EAAE,IAAI,CAAC,MAAM,EAAE,MAAM,EAAE,CAAC,CAAC;QAE3D,MAAM,CAAC,EAAE,CAAC,oBAAoB,EAAE,KAAK,EAAE,EAAE,EAAE,EAAE;YAC5C,IAAI,GAAG,EAAE,CAAC,KAAK,IAAI,EAAE,CAAC,MAAO,CAAC;YAC9B,IAAI,IAAI,GAAG,IAAI,CAAC,WAAW,EAAE,CAAC;gBAC7B,MAAM,MAAM,CAAC,KAAK,EAAE,CAAC;YACtB,CAAC;QACF,CAAC,CAAC,CAAC;QAEH,IAAI,CAAC;YACJ,MAAM,MAAM,CAAC,IAAI,EAAE,CAAC;QACrB,CAAC;QAAC,OAAO,GAAQ,EAAE,CAAC;YACnB,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,CAAC;YACzB,IAAI,IAAI,GAAG,IAAI,CAAC,WAAW,EAAE,CAAC;gBAC7B,MAAM,IAAI,qBAAqB,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;YACnD,CAAC;YACD,MAAM,IAAI,gBAAgB,CAAC,GAAG,CAAC,CAAC;QACjC,CAAC;QAED,MAAM,QAAQ,GAAG,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC;QACpC,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,CAAC;IAC3B,CAAC;IAEM,KAAK,CAAC,UAAU,CAAC,IAAY;QACnC,MAAM,OAAO,GAAG,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC,CAAC;QAE1C,MAAM,OAAO,GAAG,IAAI,mBAAmB,CAAC;YACvC,MAAM,EAAE,IAAI,CAAC,MAAM;YACnB,GAAG,EAAE,OAAO;SACZ,CAAC,CAAC;QAEH,MAAM,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;IACjC,CAAC;IAEM,KAAK,CAAC,YAAY,CAAC,WAAwB;QACjD,IAAI,WAAW,CAAC,IAAI,IAAI,IAAI,EAAE,CAAC;YAC9B,MAAM,OAAO,GAAG,IAAI,CAAC,cAAc,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC;YACtD,WAAW,CAAC,IAAI,GAAG,MAAM,IAAI,CAAC,kBAAkB,CAAC,OAAO,CAAC,CAAC;QAC3D,CAAC;QACD,OAAO,WAAW,CAAC;IACpB,CAAC;IAEO,SAAS,CAAC,OAAe;QAChC,MAAM,OAAO,GAAG,IAAI,gBAAgB,CAAC;YACpC,MAAM,EAAE,IAAI,CAAC,MAAM;YACnB,GAAG,EAAE,OAAO;SACZ,CAAC,CAAC;QACH,OAAO,YAAY,CAAC,IAAI,CAAC,MAAM,EAAE,OAAO,EAAE;YACzC,SAAS,EAAE,IAAI,CAAC,0BAA0B;SAC1C,CAAC,CAAC;IACJ,CAAC;IAEO,QAAQ,CAAC,GAAW;QAC3B,OAAO,GAAG,IAAI,CAAC,MAAM,CAAC,QAAQ,IAAI,IAAI,CAAC,MAAM,IAAI,GAAG,EAAE,CAAC;IACxD,CAAC;IAEO,cAAc,CAAC,IAAY;QAClC,MAAM,iBAAiB,GAAG,aAAa,CAAC,IAAI,CAAC,CAAC;QAC9C,OAAO,iBAAiB,CAAC,SAAS,CAAC,iBAAiB,CAAC,WAAW,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC;IAC5E,CAAC;CACD"}
|
@@ -1,2 +1,2 @@
|
|
1
|
-
export * from './NoopHandler';
|
2
|
-
export * from './S3Handler';
|
1
|
+
export * from './NoopHandler.js';
|
2
|
+
export * from './S3Handler.js';
|
@@ -1,19 +1,3 @@
|
|
1
|
-
|
2
|
-
|
3
|
-
if (k2 === undefined) k2 = k;
|
4
|
-
var desc = Object.getOwnPropertyDescriptor(m, k);
|
5
|
-
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
6
|
-
desc = { enumerable: true, get: function() { return m[k]; } };
|
7
|
-
}
|
8
|
-
Object.defineProperty(o, k2, desc);
|
9
|
-
}) : (function(o, m, k, k2) {
|
10
|
-
if (k2 === undefined) k2 = k;
|
11
|
-
o[k2] = m[k];
|
12
|
-
}));
|
13
|
-
var __exportStar = (this && this.__exportStar) || function(m, exports) {
|
14
|
-
for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
|
15
|
-
};
|
16
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
17
|
-
__exportStar(require("./NoopHandler"), exports);
|
18
|
-
__exportStar(require("./S3Handler"), exports);
|
1
|
+
export * from './NoopHandler.js';
|
2
|
+
export * from './S3Handler.js';
|
19
3
|
//# sourceMappingURL=index.js.map
|
@@ -1 +1 @@
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/webresource-handler/handlers/index.ts"],"names":[],"mappings":"
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/webresource-handler/handlers/index.ts"],"names":[],"mappings":"AAAA,cAAc,kBAAkB,CAAC;AACjC,cAAc,gBAAgB,CAAC"}
|
@@ -1,8 +1,8 @@
|
|
1
|
-
import type
|
2
|
-
import type
|
1
|
+
import type Express from 'express';
|
2
|
+
import type stream from 'node:stream';
|
3
3
|
import type { WebResourceType as WebResource } from '@balena/sbvr-types';
|
4
4
|
import { TypedError } from 'typed-error';
|
5
|
-
export * from './handlers';
|
5
|
+
export * from './handlers/index.js';
|
6
6
|
export interface IncomingFile {
|
7
7
|
fieldname: string;
|
8
8
|
originalname: string;
|
@@ -1,65 +1,21 @@
|
|
1
|
-
|
2
|
-
|
3
|
-
|
4
|
-
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
}));
|
13
|
-
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
14
|
-
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
15
|
-
}) : function(o, v) {
|
16
|
-
o["default"] = v;
|
17
|
-
});
|
18
|
-
var __importStar = (this && this.__importStar) || (function () {
|
19
|
-
var ownKeys = function(o) {
|
20
|
-
ownKeys = Object.getOwnPropertyNames || function (o) {
|
21
|
-
var ar = [];
|
22
|
-
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
23
|
-
return ar;
|
24
|
-
};
|
25
|
-
return ownKeys(o);
|
26
|
-
};
|
27
|
-
return function (mod) {
|
28
|
-
if (mod && mod.__esModule) return mod;
|
29
|
-
var result = {};
|
30
|
-
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
31
|
-
__setModuleDefault(result, mod);
|
32
|
-
return result;
|
33
|
-
};
|
34
|
-
})();
|
35
|
-
var __exportStar = (this && this.__exportStar) || function(m, exports) {
|
36
|
-
for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
|
37
|
-
};
|
38
|
-
var __importDefault = (this && this.__importDefault) || function (mod) {
|
39
|
-
return (mod && mod.__esModule) ? mod : { "default": mod };
|
40
|
-
};
|
41
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
42
|
-
exports.setupUploadHooks = exports.getDefaultHandler = exports.normalizeHref = exports.getUploaderMiddlware = exports.getWebresourceHandler = exports.setupWebresourceHandler = exports.FileSizeExceededError = exports.WebResourceError = void 0;
|
43
|
-
const busboy_1 = __importDefault(require("busboy"));
|
44
|
-
const uriParser = __importStar(require("../sbvr-api/uri-parser"));
|
45
|
-
const sbvrUtils = __importStar(require("../sbvr-api/sbvr-utils"));
|
46
|
-
const sbvr_utils_1 = require("../sbvr-api/sbvr-utils");
|
47
|
-
const permissions_1 = require("../sbvr-api/permissions");
|
48
|
-
const NoopHandler_1 = require("./handlers/NoopHandler");
|
49
|
-
const odata_to_abstract_sql_1 = require("@balena/odata-to-abstract-sql");
|
50
|
-
const module_1 = require("../server-glue/module");
|
51
|
-
const typed_error_1 = require("typed-error");
|
52
|
-
__exportStar(require("./handlers"), exports);
|
53
|
-
class WebResourceError extends typed_error_1.TypedError {
|
1
|
+
import busboy from 'busboy';
|
2
|
+
import * as uriParser from '../sbvr-api/uri-parser.js';
|
3
|
+
import * as sbvrUtils from '../sbvr-api/sbvr-utils.js';
|
4
|
+
import { getApiRoot, getModel } from '../sbvr-api/sbvr-utils.js';
|
5
|
+
import { checkPermissions } from '../sbvr-api/permissions.js';
|
6
|
+
import { NoopHandler } from './handlers/NoopHandler.js';
|
7
|
+
import { odataNameToSqlName, sqlNameToODataName, } from '@balena/odata-to-abstract-sql';
|
8
|
+
import { errors, permissions } from '../server-glue/module.js';
|
9
|
+
import { TypedError } from 'typed-error';
|
10
|
+
export * from './handlers/index.js';
|
11
|
+
export class WebResourceError extends TypedError {
|
54
12
|
}
|
55
|
-
|
56
|
-
class FileSizeExceededError extends WebResourceError {
|
13
|
+
export class FileSizeExceededError extends WebResourceError {
|
57
14
|
name = 'FileSizeExceededError';
|
58
15
|
constructor(maxSize) {
|
59
16
|
super(`File size exceeded the limit of ${maxSize} bytes.`);
|
60
17
|
}
|
61
18
|
}
|
62
|
-
exports.FileSizeExceededError = FileSizeExceededError;
|
63
19
|
const getLogger = (vocab) => {
|
64
20
|
if (vocab) {
|
65
21
|
return sbvrUtils.logger[vocab] ?? console;
|
@@ -67,23 +23,21 @@ const getLogger = (vocab) => {
|
|
67
23
|
return console;
|
68
24
|
};
|
69
25
|
let configuredWebResourceHandler;
|
70
|
-
const setupWebresourceHandler = (handler) => {
|
26
|
+
export const setupWebresourceHandler = (handler) => {
|
71
27
|
configuredWebResourceHandler = handler;
|
72
28
|
};
|
73
|
-
|
74
|
-
const getWebresourceHandler = () => {
|
29
|
+
export const getWebresourceHandler = () => {
|
75
30
|
return configuredWebResourceHandler;
|
76
31
|
};
|
77
|
-
exports.getWebresourceHandler = getWebresourceHandler;
|
78
32
|
const isFileInValidPath = async (fieldname, req) => {
|
79
33
|
if (req.method !== 'POST' && req.method !== 'PATCH') {
|
80
34
|
return false;
|
81
35
|
}
|
82
|
-
const apiRoot =
|
36
|
+
const apiRoot = getApiRoot(req);
|
83
37
|
if (apiRoot == null) {
|
84
38
|
return false;
|
85
39
|
}
|
86
|
-
const model =
|
40
|
+
const model = getModel(apiRoot);
|
87
41
|
const odataRequest = uriParser.parseOData({
|
88
42
|
url: req.url,
|
89
43
|
method: req.method,
|
@@ -95,14 +49,14 @@ const isFileInValidPath = async (fieldname, req) => {
|
|
95
49
|
}
|
96
50
|
const permission = req.method === 'POST' ? 'create' : 'update';
|
97
51
|
const vocab = model.versions[model.versions.length - 1];
|
98
|
-
const hasPermissions = await
|
52
|
+
const hasPermissions = await checkPermissions(req, permission, odataRequest.resourceName, vocab);
|
99
53
|
if (!hasPermissions) {
|
100
54
|
return false;
|
101
55
|
}
|
102
|
-
const dbFieldName =
|
56
|
+
const dbFieldName = odataNameToSqlName(fieldname);
|
103
57
|
return table.fields.some((field) => field.fieldName === dbFieldName && field.dataType === 'WebResource');
|
104
58
|
};
|
105
|
-
const getUploaderMiddlware = (handler) => {
|
59
|
+
export const getUploaderMiddlware = (handler) => {
|
106
60
|
return (req, res, next) => {
|
107
61
|
if (!req.is('multipart')) {
|
108
62
|
next();
|
@@ -110,7 +64,7 @@ const getUploaderMiddlware = (handler) => {
|
|
110
64
|
}
|
111
65
|
const uploadedFilePaths = [];
|
112
66
|
const completeUploads = [];
|
113
|
-
const bb = (
|
67
|
+
const bb = busboy({ headers: req.headers });
|
114
68
|
let isAborting = false;
|
115
69
|
const finishFileUpload = () => {
|
116
70
|
req.unpipe(bb);
|
@@ -124,7 +78,7 @@ const getUploaderMiddlware = (handler) => {
|
|
124
78
|
return await Promise.all(deletions);
|
125
79
|
}
|
126
80
|
catch (err) {
|
127
|
-
getLogger(
|
81
|
+
getLogger(getApiRoot(req)).error('Error deleting file', err);
|
128
82
|
}
|
129
83
|
};
|
130
84
|
bb.on('file', (fieldname, filestream, info) => {
|
@@ -174,9 +128,9 @@ const getUploaderMiddlware = (handler) => {
|
|
174
128
|
finishFileUpload();
|
175
129
|
await clearFiles();
|
176
130
|
if (err instanceof FileSizeExceededError) {
|
177
|
-
return sbvrUtils.handleHttpErrors(req, res, new
|
131
|
+
return sbvrUtils.handleHttpErrors(req, res, new errors.BadRequestError(err.message));
|
178
132
|
}
|
179
|
-
getLogger(
|
133
|
+
getLogger(getApiRoot(req)).error('Error uploading file', err);
|
180
134
|
next(err);
|
181
135
|
}
|
182
136
|
});
|
@@ -184,25 +138,24 @@ const getUploaderMiddlware = (handler) => {
|
|
184
138
|
finishFileUpload();
|
185
139
|
await clearFiles();
|
186
140
|
if (err instanceof FileSizeExceededError) {
|
187
|
-
return sbvrUtils.handleHttpErrors(req, res, new
|
141
|
+
return sbvrUtils.handleHttpErrors(req, res, new errors.BadRequestError(err.message));
|
188
142
|
}
|
189
|
-
getLogger(
|
143
|
+
getLogger(getApiRoot(req)).error('Error uploading file', err);
|
190
144
|
next(err);
|
191
145
|
});
|
192
146
|
req.pipe(bb);
|
193
147
|
};
|
194
148
|
};
|
195
|
-
exports.getUploaderMiddlware = getUploaderMiddlware;
|
196
149
|
const getWebResourceFields = (request, useTranslations = true) => {
|
197
150
|
const resourceName = sbvrUtils.resolveSynonym(request);
|
198
|
-
const sqlResourceName =
|
151
|
+
const sqlResourceName = odataNameToSqlName(resourceName);
|
199
152
|
const model = sbvrUtils.getAbstractSqlModel(request).tables[sqlResourceName];
|
200
153
|
const fields = useTranslations
|
201
154
|
? (model.modifyFields ?? model.fields)
|
202
155
|
: model.fields;
|
203
156
|
return fields
|
204
157
|
.filter((f) => f.dataType === 'WebResource')
|
205
|
-
.map((f) =>
|
158
|
+
.map((f) => sqlNameToODataName(f.fieldName));
|
206
159
|
};
|
207
160
|
const deleteFiles = async (keysToDelete, webResourceHandler) => {
|
208
161
|
const promises = keysToDelete.map((r) => webResourceHandler.removeFile(r));
|
@@ -211,7 +164,7 @@ const deleteFiles = async (keysToDelete, webResourceHandler) => {
|
|
211
164
|
const throwIfWebresourceNotInMultipart = (webResourceFields, { req, request }) => {
|
212
165
|
if (!req.is?.('multipart') &&
|
213
166
|
webResourceFields.some((field) => request.values[field] != null)) {
|
214
|
-
throw new
|
167
|
+
throw new errors.BadRequestError('Use multipart requests to upload a file.');
|
215
168
|
}
|
216
169
|
};
|
217
170
|
const getCreateWebResourceHooks = (webResourceHandler) => {
|
@@ -230,13 +183,12 @@ const getCreateWebResourceHooks = (webResourceHandler) => {
|
|
230
183
|
const getWebResourcesHrefs = (webResources) => {
|
231
184
|
const hrefs = (webResources ?? []).flatMap((resource) => Object.values(resource ?? {})
|
232
185
|
.filter((resourceKey) => resourceKey != null)
|
233
|
-
.map((resourceKey) =>
|
186
|
+
.map((resourceKey) => normalizeHref(resourceKey.href)));
|
234
187
|
return hrefs;
|
235
188
|
};
|
236
|
-
const normalizeHref = (href) => {
|
189
|
+
export const normalizeHref = (href) => {
|
237
190
|
return href.split('?')[0];
|
238
191
|
};
|
239
|
-
exports.normalizeHref = normalizeHref;
|
240
192
|
const getWebResourcesKeysFromRequest = (webResourceFields, { values }) => {
|
241
193
|
return webResourceFields
|
242
194
|
.map((field) => values[field]?.href)
|
@@ -264,7 +216,7 @@ const getRemoveWebResourceHooks = (webResourceHandler) => {
|
|
264
216
|
tx.on('end', () => {
|
265
217
|
deletePendingFiles(keysToDelete, request, webResourceHandler);
|
266
218
|
});
|
267
|
-
throw new
|
219
|
+
throw new errors.BadRequestError('WebResources can only be updated when providing a resource key.');
|
268
220
|
}
|
269
221
|
const ids = await sbvrUtils.getAffectedIds(args);
|
270
222
|
if (ids.length === 0) {
|
@@ -276,7 +228,7 @@ const getRemoveWebResourceHooks = (webResourceHandler) => {
|
|
276
228
|
resource: request.resourceName,
|
277
229
|
passthrough: {
|
278
230
|
tx: args.tx,
|
279
|
-
req:
|
231
|
+
req: permissions.root,
|
280
232
|
},
|
281
233
|
options: {
|
282
234
|
$select: webResourceFields,
|
@@ -309,14 +261,12 @@ const deletePendingFiles = (keysToDelete, request, webResourceHandler) => {
|
|
309
261
|
getLogger(request.vocabulary).error(`Failed to delete pending files`, err);
|
310
262
|
}
|
311
263
|
};
|
312
|
-
const getDefaultHandler = () => {
|
313
|
-
return new
|
264
|
+
export const getDefaultHandler = () => {
|
265
|
+
return new NoopHandler();
|
314
266
|
};
|
315
|
-
|
316
|
-
const setupUploadHooks = (handler, apiRoot, resourceName) => {
|
267
|
+
export const setupUploadHooks = (handler, apiRoot, resourceName) => {
|
317
268
|
sbvrUtils.addPureHook('DELETE', apiRoot, resourceName, getRemoveWebResourceHooks(handler));
|
318
269
|
sbvrUtils.addPureHook('PATCH', apiRoot, resourceName, getRemoveWebResourceHooks(handler));
|
319
270
|
sbvrUtils.addPureHook('POST', apiRoot, resourceName, getCreateWebResourceHooks(handler));
|
320
271
|
};
|
321
|
-
exports.setupUploadHooks = setupUploadHooks;
|
322
272
|
//# sourceMappingURL=index.js.map
|