signalk-maintenance-tracker 1.5.1 → 1.6.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/CHANGELOG.md +45 -0
- package/README.md +5 -0
- package/dist/api/router.js +84 -1
- package/dist/api/router.js.map +1 -1
- package/dist/db/files.repo.js +46 -0
- package/dist/db/files.repo.js.map +1 -0
- package/dist/db/migrations.js +22 -0
- package/dist/db/migrations.js.map +1 -1
- package/dist/files/store.js +174 -0
- package/dist/files/store.js.map +1 -0
- package/dist/index.js +2 -0
- package/dist/index.js.map +1 -1
- package/dist/service.js +118 -12
- package/dist/service.js.map +1 -1
- package/package.json +1 -1
- package/public/app/api/hooks.js +78 -1
- package/public/app/components/FilesField.js +162 -0
- package/public/app/components/TaskFormModal.js +12 -0
- package/public/app/lib/files.js +38 -0
- package/public/app/lib/format.js +18 -0
- package/public/app/pages/TaskDetailPage.js +127 -12
- package/public/app/types.js +10 -0
- package/public/styles/main.css +111 -0
package/CHANGELOG.md
CHANGED
|
@@ -1,3 +1,48 @@
|
|
|
1
|
+
# v1.6.1
|
|
2
|
+
|
|
3
|
+
Attachments open in the browser when the browser can show them.
|
|
4
|
+
|
|
5
|
+
- Images, PDFs, plain text, audio and video are now served inline under
|
|
6
|
+
their declared type, so clicking one opens it in a new tab instead of
|
|
7
|
+
forcing a download. Anything XML- or HTML-shaped (SVG included) stays an
|
|
8
|
+
attachment, since it can carry script, and so does anything the browser
|
|
9
|
+
can't render anyway. `nosniff` is kept in both cases, so the declared type
|
|
10
|
+
is the only type and nothing uploaded runs on the SignalK origin.
|
|
11
|
+
- The task detail page gains a **Gallery** section: image attachments move
|
|
12
|
+
out of the Files list into a grid of thumbnails that open the full image
|
|
13
|
+
in a new tab. Either section is dropped when empty.
|
|
14
|
+
|
|
15
|
+
# v1.6.0
|
|
16
|
+
|
|
17
|
+
Tasks can now carry files, and the detail page shows whether the parts for a
|
|
18
|
+
job are actually on board.
|
|
19
|
+
|
|
20
|
+
## Highlights
|
|
21
|
+
|
|
22
|
+
- **File attachments.** Each task can hold attachments — manuals, receipts,
|
|
23
|
+
photos — of any type up to 1 GB. The Edit Task modal gains a **Files**
|
|
24
|
+
field under the description with upload (progress bar) and delete; the
|
|
25
|
+
task detail page lists them under a **Files** header with sizes, each a
|
|
26
|
+
download link. Bytes live under the plugin data directory at
|
|
27
|
+
`files/<task_id>/`, indexed by a new `task_files` table (migration 8).
|
|
28
|
+
Uploads stream to a temp file and are only moved into place once complete
|
|
29
|
+
and within the limit, so an interrupted or oversize upload leaves nothing
|
|
30
|
+
behind. Deleting a task removes its files. Downloads are always served as
|
|
31
|
+
an attachment with `nosniff`, so nothing uploaded can render inline on the
|
|
32
|
+
SignalK origin.
|
|
33
|
+
- **In-stock quantities on the task detail page.** Each consumable now reads
|
|
34
|
+
"Item × required / on hand", pulling live quantities from the
|
|
35
|
+
stowage-mgmt items resource already polled by the stock badge. The figure
|
|
36
|
+
is green when stock covers the job and meets the item's target, orange when
|
|
37
|
+
it covers the job but is below target, and red when there isn't enough.
|
|
38
|
+
Falls back to the plain required qty when stowage is unavailable or the
|
|
39
|
+
item is no longer known.
|
|
40
|
+
|
|
41
|
+
## API
|
|
42
|
+
|
|
43
|
+
- New endpoints: `GET`/`POST /tasks/:slug/files` and `GET`/`DELETE
|
|
44
|
+
/tasks/:slug/files/:id`.
|
|
45
|
+
|
|
1
46
|
# v1.5.1
|
|
2
47
|
|
|
3
48
|
Phone-sized polish for the task list and modals.
|
package/README.md
CHANGED
|
@@ -94,6 +94,11 @@ the SignalK server — currently admin):
|
|
|
94
94
|
|
|
95
95
|
- `GET/POST /tasks`, `GET/PUT/DELETE /tasks/:slug`
|
|
96
96
|
- `GET/POST /tasks/:slug/logs` (POST = mark complete)
|
|
97
|
+
- `GET/POST /tasks/:slug/files`, `GET/DELETE /tasks/:slug/files/:id`
|
|
98
|
+
(attachments: POST streams the raw request body to disk, any type up to
|
|
99
|
+
1 GB, with the filename in an `X-File-Name` header; images, PDFs, text
|
|
100
|
+
and media are served inline and open in the browser, images also as a
|
|
101
|
+
gallery on the task page; everything else downloads)
|
|
97
102
|
- `GET /logs`, `PUT/DELETE /logs/:id`
|
|
98
103
|
- `GET /tags`
|
|
99
104
|
- `GET /health`
|
package/dist/api/router.js
CHANGED
|
@@ -2,6 +2,7 @@
|
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.mountApi = mountApi;
|
|
4
4
|
const auth_1 = require("../auth");
|
|
5
|
+
const store_1 = require("../files/store");
|
|
5
6
|
const service_1 = require("../service");
|
|
6
7
|
/** Cookie/authorization headers from the incoming request, forwarded
|
|
7
8
|
* verbatim when we call out to signalk-stowage-mgmt on the caller's behalf
|
|
@@ -76,6 +77,56 @@ function mountApi(router, getServices) {
|
|
|
76
77
|
s.service.deleteTask(req.params.slug);
|
|
77
78
|
res.status(204).end();
|
|
78
79
|
}));
|
|
80
|
+
// ---- files (§8.6) ----
|
|
81
|
+
router.get('/api/tasks/:slug/files', withServices((s, req, res) => {
|
|
82
|
+
res.json({ data: s.service.listFiles(req.params.slug) });
|
|
83
|
+
}));
|
|
84
|
+
// Raw body upload: the bytes are the request body (any content type), the
|
|
85
|
+
// original filename rides in X-File-Name (percent-encoded, since header
|
|
86
|
+
// values are ASCII) and the client's content type in X-File-Type. No
|
|
87
|
+
// multipart parsing, no buffering — the body streams straight to disk.
|
|
88
|
+
router.post('/api/tasks/:slug/files', withServices(async (s, req, res) => {
|
|
89
|
+
// A JSON content type gets the body parsed (by SignalK or jsonBody)
|
|
90
|
+
// before it reaches here, leaving nothing to stream to disk. Checked
|
|
91
|
+
// by stream state, not req.body: body-parser 1.x sets req.body = {}
|
|
92
|
+
// even on requests it skips.
|
|
93
|
+
if (req.readableEnded || req._body)
|
|
94
|
+
throw new service_1.ApiError(400, 'invalid_upload', 'Send the file bytes as the raw request body with a non-JSON content type (e.g. application/octet-stream)');
|
|
95
|
+
const length = req.headers['content-length'];
|
|
96
|
+
if (length === undefined)
|
|
97
|
+
throw new service_1.ApiError(411, 'length_required', 'Uploads must send a Content-Length header');
|
|
98
|
+
const file = await s.service.addFile(req.params.slug, {
|
|
99
|
+
name: decodeHeader(req.headers['x-file-name']),
|
|
100
|
+
mime: str(req.headers['x-file-type']) ?? null,
|
|
101
|
+
declaredSize: Number.parseInt(String(length), 10) || 0,
|
|
102
|
+
}, req);
|
|
103
|
+
res.status(201).json(file);
|
|
104
|
+
}));
|
|
105
|
+
router.get('/api/tasks/:slug/files/:id', withServices((s, req, res) => {
|
|
106
|
+
const { file, absPath } = s.service.getFile(req.params.slug, intParam(req.params.id));
|
|
107
|
+
// What a browser can show on its own (images, PDF, text, media) is
|
|
108
|
+
// served inline so links open in a tab; everything else is an
|
|
109
|
+
// attachment, whatever the uploader called it, so no uploaded document
|
|
110
|
+
// ever runs on the server's origin. nosniff in both cases: the declared
|
|
111
|
+
// type is the only type.
|
|
112
|
+
if ((0, store_1.isInlineType)(file.mime)) {
|
|
113
|
+
res.type(file.mime);
|
|
114
|
+
res.sendFile(absPath, {
|
|
115
|
+
headers: {
|
|
116
|
+
'Content-Disposition': inlineDisposition(file.name),
|
|
117
|
+
'X-Content-Type-Options': 'nosniff',
|
|
118
|
+
},
|
|
119
|
+
});
|
|
120
|
+
return;
|
|
121
|
+
}
|
|
122
|
+
res.download(absPath, file.name, {
|
|
123
|
+
headers: { 'X-Content-Type-Options': 'nosniff' },
|
|
124
|
+
});
|
|
125
|
+
}));
|
|
126
|
+
router.delete('/api/tasks/:slug/files/:id', withServices((s, req, res) => {
|
|
127
|
+
s.service.deleteFile(req.params.slug, intParam(req.params.id));
|
|
128
|
+
res.status(204).end();
|
|
129
|
+
}));
|
|
79
130
|
// ---- logs (§8.2) ----
|
|
80
131
|
router.get('/api/tasks/:slug/logs', withServices((s, req, res) => {
|
|
81
132
|
res.json({ data: s.service.listTaskLogs(req.params.slug) });
|
|
@@ -131,11 +182,14 @@ function mountApi(router, getServices) {
|
|
|
131
182
|
/**
|
|
132
183
|
* Minimal JSON body reader. SignalK versions differ on whether plugin routers
|
|
133
184
|
* get body-parsing middleware, so parse only if req.body is still unset.
|
|
185
|
+
* File uploads post their bytes as the body and must reach the upload route
|
|
186
|
+
* unread, so a non-JSON content type passes straight through.
|
|
134
187
|
*/
|
|
135
188
|
function jsonBody(req, res, next) {
|
|
136
189
|
if (req.body !== undefined ||
|
|
137
190
|
req.method === 'GET' ||
|
|
138
|
-
req.method === 'DELETE'
|
|
191
|
+
req.method === 'DELETE' ||
|
|
192
|
+
isRawUpload(req)) {
|
|
139
193
|
next();
|
|
140
194
|
return;
|
|
141
195
|
}
|
|
@@ -164,6 +218,24 @@ function jsonBody(req, res, next) {
|
|
|
164
218
|
}
|
|
165
219
|
});
|
|
166
220
|
}
|
|
221
|
+
/** True for a body that is a file, not JSON (see the upload route). */
|
|
222
|
+
function isRawUpload(req) {
|
|
223
|
+
const type = req.headers['content-type'];
|
|
224
|
+
return (req.path.endsWith('/files') &&
|
|
225
|
+
!(typeof type === 'string' && /^\s*application\/json\b/i.test(type)));
|
|
226
|
+
}
|
|
227
|
+
/** A percent-encoded header value (filenames can be any Unicode). */
|
|
228
|
+
function decodeHeader(v) {
|
|
229
|
+
const s = str(Array.isArray(v) ? v[0] : v);
|
|
230
|
+
if (s === undefined)
|
|
231
|
+
return '';
|
|
232
|
+
try {
|
|
233
|
+
return decodeURIComponent(s);
|
|
234
|
+
}
|
|
235
|
+
catch {
|
|
236
|
+
return s;
|
|
237
|
+
}
|
|
238
|
+
}
|
|
167
239
|
function parseTaskListQuery(req) {
|
|
168
240
|
const { page, pageSize } = parsePaging(req);
|
|
169
241
|
return {
|
|
@@ -184,6 +256,17 @@ function parseTaskListQuery(req) {
|
|
|
184
256
|
function parsePaging(req) {
|
|
185
257
|
return { page: int(req.query.page), pageSize: int(req.query.pageSize) };
|
|
186
258
|
}
|
|
259
|
+
/**
|
|
260
|
+
* `Content-Disposition: inline` carrying the original name for "save as"
|
|
261
|
+
* (RFC 6266): an ASCII fallback plus the UTF-8 form for non-ASCII names.
|
|
262
|
+
*/
|
|
263
|
+
function inlineDisposition(name) {
|
|
264
|
+
const ascii = name.replace(/[^\x20-\x7e]/g, '_').replace(/["\\]/g, '_');
|
|
265
|
+
let header = 'inline; filename="' + ascii + '"';
|
|
266
|
+
if (ascii !== name)
|
|
267
|
+
header += "; filename*=UTF-8''" + encodeURIComponent(name);
|
|
268
|
+
return header;
|
|
269
|
+
}
|
|
187
270
|
function str(v) {
|
|
188
271
|
return typeof v === 'string' && v !== '' ? v : undefined;
|
|
189
272
|
}
|
package/dist/api/router.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"router.js","sourceRoot":"","sources":["../../src/api/router.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"router.js","sourceRoot":"","sources":["../../src/api/router.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.FilesRepo = void 0;
|
|
4
|
+
const FILE_COLUMNS = `id, task_id, name, size, mime, path, created_at`;
|
|
5
|
+
class FilesRepo {
|
|
6
|
+
db;
|
|
7
|
+
constructor(db) {
|
|
8
|
+
this.db = db;
|
|
9
|
+
}
|
|
10
|
+
get(id) {
|
|
11
|
+
return this.db
|
|
12
|
+
.prepare(`SELECT ${FILE_COLUMNS} FROM task_files WHERE id = ?`)
|
|
13
|
+
.get(id);
|
|
14
|
+
}
|
|
15
|
+
forTask(taskId) {
|
|
16
|
+
return this.db
|
|
17
|
+
.prepare(`SELECT ${FILE_COLUMNS} FROM task_files
|
|
18
|
+
WHERE task_id = ? ORDER BY name COLLATE NOCASE, id`)
|
|
19
|
+
.all(taskId);
|
|
20
|
+
}
|
|
21
|
+
/** One query for the whole task list: task_id -> files. */
|
|
22
|
+
byTask() {
|
|
23
|
+
const rows = this.db
|
|
24
|
+
.prepare(`SELECT ${FILE_COLUMNS} FROM task_files ORDER BY name COLLATE NOCASE, id`)
|
|
25
|
+
.all();
|
|
26
|
+
const map = new Map();
|
|
27
|
+
for (const r of rows) {
|
|
28
|
+
const list = map.get(r.task_id) ?? [];
|
|
29
|
+
list.push(r);
|
|
30
|
+
map.set(r.task_id, list);
|
|
31
|
+
}
|
|
32
|
+
return map;
|
|
33
|
+
}
|
|
34
|
+
insert(f, nowIso) {
|
|
35
|
+
const result = this.db
|
|
36
|
+
.prepare(`INSERT INTO task_files (task_id, name, size, mime, path, created_at)
|
|
37
|
+
VALUES (?, ?, ?, ?, ?, ?)`)
|
|
38
|
+
.run(f.task_id, f.name, f.size, f.mime, f.path, nowIso);
|
|
39
|
+
return this.get(Number(result.lastInsertRowid));
|
|
40
|
+
}
|
|
41
|
+
delete(id) {
|
|
42
|
+
this.db.prepare(`DELETE FROM task_files WHERE id = ?`).run(id);
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
exports.FilesRepo = FilesRepo;
|
|
46
|
+
//# sourceMappingURL=files.repo.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"files.repo.js","sourceRoot":"","sources":["../../src/db/files.repo.ts"],"names":[],"mappings":";;;AAuBA,MAAM,YAAY,GAAG,iDAAiD,CAAC;AAEvE,MAAa,SAAS;IACA;IAApB,YAAoB,EAAgB;QAAhB,OAAE,GAAF,EAAE,CAAc;IAAG,CAAC;IAExC,GAAG,CAAC,EAAU;QACZ,OAAO,IAAI,CAAC,EAAE;aACX,OAAO,CAAC,UAAU,YAAY,+BAA+B,CAAC;aAC9D,GAAG,CAAC,EAAE,CAAwB,CAAC;IACpC,CAAC;IAED,OAAO,CAAC,MAAc;QACpB,OAAO,IAAI,CAAC,EAAE;aACX,OAAO,CACN,UAAU,YAAY;4DAC8B,CACrD;aACA,GAAG,CAAC,MAAM,CAAyB,CAAC;IACzC,CAAC;IAED,2DAA2D;IAC3D,MAAM;QACJ,MAAM,IAAI,GAAG,IAAI,CAAC,EAAE;aACjB,OAAO,CACN,UAAU,YAAY,mDAAmD,CAC1E;aACA,GAAG,EAA0B,CAAC;QACjC,MAAM,GAAG,GAAG,IAAI,GAAG,EAAqB,CAAC;QACzC,KAAK,MAAM,CAAC,IAAI,IAAI,EAAE,CAAC;YACrB,MAAM,IAAI,GAAG,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,OAAO,CAAC,IAAI,EAAE,CAAC;YACtC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;YACb,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC;QAC3B,CAAC;QACD,OAAO,GAAG,CAAC;IACb,CAAC;IAED,MAAM,CAAC,CAAU,EAAE,MAAc;QAC/B,MAAM,MAAM,GAAG,IAAI,CAAC,EAAE;aACnB,OAAO,CACN;mCAC2B,CAC5B;aACA,GAAG,CAAC,CAAC,CAAC,OAAO,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;QAC1D,OAAO,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,MAAM,CAAC,eAAe,CAAC,CAAE,CAAC;IACnD,CAAC;IAED,MAAM,CAAC,EAAU;QACf,IAAI,CAAC,EAAE,CAAC,OAAO,CAAC,qCAAqC,CAAC,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;IACjE,CAAC;CACF;AA/CD,8BA+CC"}
|
package/dist/db/migrations.js
CHANGED
|
@@ -154,5 +154,27 @@ exports.migrations = [
|
|
|
154
154
|
`);
|
|
155
155
|
},
|
|
156
156
|
},
|
|
157
|
+
{
|
|
158
|
+
version: 8,
|
|
159
|
+
up(db) {
|
|
160
|
+
// Files attached to a task (manuals, receipts, photos). The bytes live
|
|
161
|
+
// on disk under the plugin data directory (files/<task_id>/...); this
|
|
162
|
+
// table is the index: original name, size, and the on-disk path
|
|
163
|
+
// relative to that files root. Rows cascade with the task; the
|
|
164
|
+
// service removes the bytes alongside.
|
|
165
|
+
db.exec(`
|
|
166
|
+
CREATE TABLE task_files (
|
|
167
|
+
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
|
168
|
+
task_id INTEGER NOT NULL REFERENCES tasks(id) ON DELETE CASCADE,
|
|
169
|
+
name TEXT NOT NULL,
|
|
170
|
+
size INTEGER NOT NULL,
|
|
171
|
+
mime TEXT,
|
|
172
|
+
path TEXT NOT NULL UNIQUE,
|
|
173
|
+
created_at TEXT NOT NULL
|
|
174
|
+
);
|
|
175
|
+
CREATE INDEX idx_task_files_task ON task_files (task_id);
|
|
176
|
+
`);
|
|
177
|
+
},
|
|
178
|
+
},
|
|
157
179
|
];
|
|
158
180
|
//# sourceMappingURL=migrations.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"migrations.js","sourceRoot":"","sources":["../../src/db/migrations.ts"],"names":[],"mappings":";;;AAOa,QAAA,UAAU,GAAgB;IACrC;QACE,OAAO,EAAE,CAAC;QACV,EAAE,CAAC,EAAE;YACH,EAAE,CAAC,IAAI,CAAC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;OA6CP,CAAC,CAAC;QACL,CAAC;KACF;IACD;QACE,OAAO,EAAE,CAAC;QACV,EAAE,CAAC,EAAE;YACH,EAAE,CAAC,IAAI,CAAC;;;;;;;;;;;;;;;;;;;OAmBP,CAAC,CAAC;QACL,CAAC;KACF;IACD;QACE,OAAO,EAAE,CAAC;QACV,EAAE,CAAC,EAAE;YACH,qEAAqE;YACrE,yEAAyE;YACzE,8CAA8C;YAC9C,EAAE,CAAC,IAAI,CAAC,6CAA6C,CAAC,CAAC;QACzD,CAAC;KACF;IACD;QACE,OAAO,EAAE,CAAC;QACV,EAAE,CAAC,EAAE;YACH,uEAAuE;YACvE,yEAAyE;YACzE,mEAAmE;YACnE,wEAAwE;YACxE,wEAAwE;YACxE,EAAE,CAAC,IAAI,CAAC,0DAA0D,CAAC,CAAC;YACpE,EAAE,CAAC,IAAI,CAAC,sDAAsD,CAAC,CAAC;QAClE,CAAC;KACF;IACD;QACE,OAAO,EAAE,CAAC;QACV,EAAE,CAAC,EAAE;YACH,mEAAmE;YACnE,mEAAmE;YACnE,kEAAkE;YAClE,EAAE,CAAC,IAAI,CACL,sEAAsE,CACvE,CAAC;QACJ,CAAC;KACF;IACD;QACE,OAAO,EAAE,CAAC;QACV,EAAE,CAAC,EAAE;YACH,uEAAuE;YACvE,wEAAwE;YACxE,uEAAuE;YACvE,sEAAsE;YACtE,uDAAuD;YACvD,EAAE,CAAC,IAAI,CAAC;;;;;;;;;;;;;;;;;;;OAmBP,CAAC,CAAC;QACL,CAAC;KACF;IACD;QACE,OAAO,EAAE,CAAC;QACV,EAAE,CAAC,EAAE;YACH,sEAAsE;YACtE,oEAAoE;YACpE,mEAAmE;YACnE,mEAAmE;YACnE,8CAA8C;YAC9C,EAAE,CAAC,IAAI,CACL,uEAAuE,CACxE,CAAC;YACF,EAAE,CAAC,IAAI,CAAC;;;;OAIP,CAAC,CAAC;QACL,CAAC;KACF;CACF,CAAC"}
|
|
1
|
+
{"version":3,"file":"migrations.js","sourceRoot":"","sources":["../../src/db/migrations.ts"],"names":[],"mappings":";;;AAOa,QAAA,UAAU,GAAgB;IACrC;QACE,OAAO,EAAE,CAAC;QACV,EAAE,CAAC,EAAE;YACH,EAAE,CAAC,IAAI,CAAC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;OA6CP,CAAC,CAAC;QACL,CAAC;KACF;IACD;QACE,OAAO,EAAE,CAAC;QACV,EAAE,CAAC,EAAE;YACH,EAAE,CAAC,IAAI,CAAC;;;;;;;;;;;;;;;;;;;OAmBP,CAAC,CAAC;QACL,CAAC;KACF;IACD;QACE,OAAO,EAAE,CAAC;QACV,EAAE,CAAC,EAAE;YACH,qEAAqE;YACrE,yEAAyE;YACzE,8CAA8C;YAC9C,EAAE,CAAC,IAAI,CAAC,6CAA6C,CAAC,CAAC;QACzD,CAAC;KACF;IACD;QACE,OAAO,EAAE,CAAC;QACV,EAAE,CAAC,EAAE;YACH,uEAAuE;YACvE,yEAAyE;YACzE,mEAAmE;YACnE,wEAAwE;YACxE,wEAAwE;YACxE,EAAE,CAAC,IAAI,CAAC,0DAA0D,CAAC,CAAC;YACpE,EAAE,CAAC,IAAI,CAAC,sDAAsD,CAAC,CAAC;QAClE,CAAC;KACF;IACD;QACE,OAAO,EAAE,CAAC;QACV,EAAE,CAAC,EAAE;YACH,mEAAmE;YACnE,mEAAmE;YACnE,kEAAkE;YAClE,EAAE,CAAC,IAAI,CACL,sEAAsE,CACvE,CAAC;QACJ,CAAC;KACF;IACD;QACE,OAAO,EAAE,CAAC;QACV,EAAE,CAAC,EAAE;YACH,uEAAuE;YACvE,wEAAwE;YACxE,uEAAuE;YACvE,sEAAsE;YACtE,uDAAuD;YACvD,EAAE,CAAC,IAAI,CAAC;;;;;;;;;;;;;;;;;;;OAmBP,CAAC,CAAC;QACL,CAAC;KACF;IACD;QACE,OAAO,EAAE,CAAC;QACV,EAAE,CAAC,EAAE;YACH,sEAAsE;YACtE,oEAAoE;YACpE,mEAAmE;YACnE,mEAAmE;YACnE,8CAA8C;YAC9C,EAAE,CAAC,IAAI,CACL,uEAAuE,CACxE,CAAC;YACF,EAAE,CAAC,IAAI,CAAC;;;;OAIP,CAAC,CAAC;QACL,CAAC;KACF;IACD;QACE,OAAO,EAAE,CAAC;QACV,EAAE,CAAC,EAAE;YACH,uEAAuE;YACvE,sEAAsE;YACtE,gEAAgE;YAChE,+DAA+D;YAC/D,uCAAuC;YACvC,EAAE,CAAC,IAAI,CAAC;;;;;;;;;;;OAWP,CAAC,CAAC;QACL,CAAC;KACF;CACF,CAAC"}
|
|
@@ -0,0 +1,174 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
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 __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.FileStore = exports.FileTooLargeError = exports.MAX_FILE_BYTES = void 0;
|
|
37
|
+
exports.isInlineType = isInlineType;
|
|
38
|
+
exports.isInlineImage = isInlineImage;
|
|
39
|
+
const crypto = __importStar(require("node:crypto"));
|
|
40
|
+
const fs = __importStar(require("node:fs"));
|
|
41
|
+
const path = __importStar(require("node:path"));
|
|
42
|
+
/** Largest single upload accepted: 1 GiB. */
|
|
43
|
+
exports.MAX_FILE_BYTES = 1024 * 1024 * 1024;
|
|
44
|
+
/**
|
|
45
|
+
* Whether a file of this (uploader-declared) type may be served inline, i.e.
|
|
46
|
+
* rendered by the browser on the server's origin rather than saved. Only
|
|
47
|
+
* what browsers display natively and that carries no script: raster images,
|
|
48
|
+
* PDF, plain text, audio and video. SVG and anything XML/HTML-shaped are
|
|
49
|
+
* documents that can run script, so they stay downloads whatever the label.
|
|
50
|
+
* Anything else (Word, spreadsheets, archives…) the browser would download
|
|
51
|
+
* anyway.
|
|
52
|
+
*/
|
|
53
|
+
function isInlineType(mime) {
|
|
54
|
+
const t = normalizeMime(mime);
|
|
55
|
+
if (t === null || /xml|html/.test(t))
|
|
56
|
+
return false;
|
|
57
|
+
if (t === 'application/pdf' || t === 'text/plain')
|
|
58
|
+
return true;
|
|
59
|
+
return /^(image|audio|video)\//.test(t);
|
|
60
|
+
}
|
|
61
|
+
/** Whether a file of this type is a raster image: inline, and a picture. */
|
|
62
|
+
function isInlineImage(mime) {
|
|
63
|
+
const t = normalizeMime(mime);
|
|
64
|
+
return t !== null && t.startsWith('image/') && isInlineType(t);
|
|
65
|
+
}
|
|
66
|
+
/** The bare `type/subtype`, lowercased, or null when absent. */
|
|
67
|
+
function normalizeMime(mime) {
|
|
68
|
+
if (!mime)
|
|
69
|
+
return null;
|
|
70
|
+
const t = mime.split(';')[0].trim().toLowerCase();
|
|
71
|
+
return t.includes('/') ? t : null;
|
|
72
|
+
}
|
|
73
|
+
/** Thrown by write() when the stream runs past `maxBytes`. */
|
|
74
|
+
class FileTooLargeError extends Error {
|
|
75
|
+
maxBytes;
|
|
76
|
+
constructor(maxBytes) {
|
|
77
|
+
super(`File exceeds the ${maxBytes} byte limit`);
|
|
78
|
+
this.maxBytes = maxBytes;
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
exports.FileTooLargeError = FileTooLargeError;
|
|
82
|
+
/**
|
|
83
|
+
* On-disk home for task attachments: `<root>/<task_id>/<token>-<name>`, with
|
|
84
|
+
* `<root>` under the plugin data directory. The database row (FilesRepo)
|
|
85
|
+
* holds the path relative to `<root>`, so the data directory can move as a
|
|
86
|
+
* whole. Uploads stream into `<root>/tmp` and are renamed into place only
|
|
87
|
+
* once fully written, so a crash or an over-limit upload never leaves a
|
|
88
|
+
* half-file where a task would find it.
|
|
89
|
+
*/
|
|
90
|
+
class FileStore {
|
|
91
|
+
root;
|
|
92
|
+
constructor(root) {
|
|
93
|
+
this.root = root;
|
|
94
|
+
}
|
|
95
|
+
absolute(relPath) {
|
|
96
|
+
return path.join(this.root, relPath);
|
|
97
|
+
}
|
|
98
|
+
/**
|
|
99
|
+
* Stream an upload to a temp file, enforcing `maxBytes`. Resolves with the
|
|
100
|
+
* temp path and byte count; rejects (temp removed) on error or overflow.
|
|
101
|
+
*/
|
|
102
|
+
writeTemp(source, maxBytes) {
|
|
103
|
+
const tmpDir = path.join(this.root, 'tmp');
|
|
104
|
+
fs.mkdirSync(tmpDir, { recursive: true });
|
|
105
|
+
const tmpPath = path.join(tmpDir, crypto.randomBytes(12).toString('hex'));
|
|
106
|
+
return new Promise((resolve, reject) => {
|
|
107
|
+
const out = fs.createWriteStream(tmpPath, { flags: 'wx' });
|
|
108
|
+
let size = 0;
|
|
109
|
+
let settled = false;
|
|
110
|
+
const fail = (err) => {
|
|
111
|
+
if (settled)
|
|
112
|
+
return;
|
|
113
|
+
settled = true;
|
|
114
|
+
source.unpipe(out);
|
|
115
|
+
out.destroy();
|
|
116
|
+
fs.rm(tmpPath, { force: true }, () => reject(err));
|
|
117
|
+
};
|
|
118
|
+
source.on('data', (chunk) => {
|
|
119
|
+
size += chunk.length;
|
|
120
|
+
if (size > maxBytes)
|
|
121
|
+
fail(new FileTooLargeError(maxBytes));
|
|
122
|
+
});
|
|
123
|
+
source.on('error', fail);
|
|
124
|
+
// An IncomingMessage cut off mid-body closes with complete === false
|
|
125
|
+
// (a plain Readable has no such flag and simply ends).
|
|
126
|
+
source.on('close', () => {
|
|
127
|
+
if (source.complete === false)
|
|
128
|
+
fail(new Error('Upload aborted'));
|
|
129
|
+
});
|
|
130
|
+
out.on('error', fail);
|
|
131
|
+
out.on('finish', () => {
|
|
132
|
+
if (settled)
|
|
133
|
+
return;
|
|
134
|
+
settled = true;
|
|
135
|
+
resolve({ tmpPath, size });
|
|
136
|
+
});
|
|
137
|
+
source.pipe(out);
|
|
138
|
+
});
|
|
139
|
+
}
|
|
140
|
+
/** Move a finished temp file under its task; returns the relative path. */
|
|
141
|
+
commit(tmpPath, taskId, name) {
|
|
142
|
+
const token = crypto.randomBytes(4).toString('hex');
|
|
143
|
+
const relPath = path.join(String(taskId), `${token}-${safeName(name)}`);
|
|
144
|
+
const dest = this.absolute(relPath);
|
|
145
|
+
fs.mkdirSync(path.dirname(dest), { recursive: true });
|
|
146
|
+
fs.renameSync(tmpPath, dest);
|
|
147
|
+
return relPath;
|
|
148
|
+
}
|
|
149
|
+
discard(tmpPath) {
|
|
150
|
+
fs.rmSync(tmpPath, { force: true });
|
|
151
|
+
}
|
|
152
|
+
remove(relPath) {
|
|
153
|
+
fs.rmSync(this.absolute(relPath), { force: true });
|
|
154
|
+
}
|
|
155
|
+
/** Drop a task's whole directory (task deleted). */
|
|
156
|
+
removeTask(taskId) {
|
|
157
|
+
fs.rmSync(path.join(this.root, String(taskId)), {
|
|
158
|
+
recursive: true,
|
|
159
|
+
force: true,
|
|
160
|
+
});
|
|
161
|
+
}
|
|
162
|
+
}
|
|
163
|
+
exports.FileStore = FileStore;
|
|
164
|
+
/**
|
|
165
|
+
* The on-disk name only exists for someone browsing the data directory; the
|
|
166
|
+
* real name lives in the database. Anything that isn't a plain filename
|
|
167
|
+
* character is squashed so path separators, control characters and the like
|
|
168
|
+
* can't influence where the file lands.
|
|
169
|
+
*/
|
|
170
|
+
function safeName(name) {
|
|
171
|
+
const cleaned = name.replace(/[^A-Za-z0-9._-]+/g, '_').replace(/^\.+/, '');
|
|
172
|
+
return (cleaned || 'file').slice(0, 100);
|
|
173
|
+
}
|
|
174
|
+
//# sourceMappingURL=store.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"store.js","sourceRoot":"","sources":["../../src/files/store.ts"],"names":[],"mappings":"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"}
|
package/dist/index.js
CHANGED
|
@@ -41,6 +41,7 @@ const paths_1 = require("./signalk/paths");
|
|
|
41
41
|
const runtime_1 = require("./signalk/runtime");
|
|
42
42
|
const router_1 = require("./api/router");
|
|
43
43
|
const client_1 = require("./stowage/client");
|
|
44
|
+
const store_1 = require("./files/store");
|
|
44
45
|
// eslint-disable-next-line @typescript-eslint/no-require-imports
|
|
45
46
|
const { version: PLUGIN_VERSION } = require('../package.json');
|
|
46
47
|
const PLUGIN_ID = 'signalk-maintenance-tracker';
|
|
@@ -99,6 +100,7 @@ module.exports = function (app) {
|
|
|
99
100
|
stowageClient: opts.stowageMgmtUrl
|
|
100
101
|
? new client_1.StowageClient({ baseUrl: opts.stowageMgmtUrl })
|
|
101
102
|
: undefined,
|
|
103
|
+
fileStore: new store_1.FileStore(path.join(app.getDataDirPath(), 'files')),
|
|
102
104
|
});
|
|
103
105
|
runtime.onUpdate(() => recomputeNotifications());
|
|
104
106
|
services = { service, runtime, version: PLUGIN_VERSION };
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,gDAAkC;AAGlC,qCAA+D;AAC/D,4CAA6C;AAC7C,uCAA+C;AAC/C,2DAA8D;AAC9D,2CAAgD;AAChD,+CAAmD;AACnD,yCAAkD;AAClD,6CAAiD;
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|