diff --git a/.npmrc b/.npmrc new file mode 100644 index 0000000..91bb892 --- /dev/null +++ b/.npmrc @@ -0,0 +1 @@ +@tycrek:registry=https://npm.pkg.github.com \ No newline at end of file diff --git a/README.md b/README.md index fa3e348..7ea80b2 100755 --- a/README.md +++ b/README.md @@ -72,13 +72,13 @@ ass was designed with developers in mind. If you are a developer & want somethin - **Multiple file storage methods** - Local file system - Amazon S3 (including [DigitalOcean Spaces]) -- **Multiple data storage methods** using [ass StorageEngines] (JSON by default) +- **Multiple data storage methods** using [ass StorageEngines] - **File** - JSON (default, [ass-storage-engine]) - YAML (soon!) - **Database** - PostgreSQL ([ass-psql]) - - Mongo (soon!) + - MongoDB ([ass-mongoose][GH AMongoose]) - MySQL (soon!) [Git Submodules]: https://git-scm.com/book/en/v2/Git-Tools-Submodules @@ -340,9 +340,21 @@ module.exports = { **Supported StorageEngines:** | Name | Description | Links | -| ---- | ----------- | ----- | -| **JSON** | JSON-based data storage. On disk, data is stored in a JSON file. In memory, data is stored in a [Map](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Map). This is the default StorageEngine. | [GitHub](https://github.com/tycrek/ass-storage-engine/), [npm](https://www.npmjs.com/package/@tycrek/ass-storage-engine) | -| **PostgreSQL** | Data storage using a [PostgreSQL](https://www.postgresql.org/) database. [node-postgres](https://node-postgres.com/) is used for communicating with the database. | [GitHub](https://github.com/tycrek/ass-psql/), [npm](https://www.npmjs.com/package/@tycrek/ass-psql) | +| :--: | ----------- | :---: | +| **JSON** | JSON-based data storage. On disk, data is stored in a JSON file. In memory, data is stored in a [Map]. This is the default StorageEngine. | [GitHub][GH ASE] | +| **PostgreSQL** | Data storage using a [PostgreSQL] database. [node-postgres] is used for communicating with the database. | [GitHub][GH APSQL] | +| **Mongoose** | Data storage using a [MongoDB]() database. [mongoose] is used for communicating with the database. Created by [@dylancl] | [GitHub][GH AMongoose]
[NPM][NPM AMongoose] | + +[Map]: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Map +[GH ASE]: https://github.com/tycrek/ass-storage-engine/ +[PostgreSQL]: https://www.postgresql.org/ +[node-postgres]: https://node-postgres.com/ +[GH APSQL]: https://github.com/tycrek/ass-psql/ +[MongoDB]: https://www.mongodb.com/ +[mongoose]: https://mongoosejs.com/ +[GH AMongoose]: https://github.com/dylancl/ass-mongoose +[NPM AMongoose]: https://www.npmjs.com/package/ass-mongoose +[@dylancl]: https://github.com/dylancl An ass StorageEngine implements support for one type of database (or file, such as JSON or YAML). This lets ass server hosts pick their database of choice, because all they'll have to do is plugin the connection/authentication details, then ass will handle the rest, using the resource ID as the key. diff --git a/ass.js b/ass.js index 579479d..ddc7cac 100755 --- a/ass.js +++ b/ass.js @@ -18,12 +18,13 @@ const { host, port, useSsl, isProxied, s3enabled } = require('./config.json'); //#region Imports const fs = require('fs-extra'); const express = require('express'); +const nofavicon = require('@tycrek/express-nofavicon'); const helmet = require('helmet'); const marked = require('marked'); const uploadRouter = require('./routers/upload'); const resourceRouter = require('./routers/resource'); const { path, log, getTrueHttp, getTrueDomain } = require('./utils'); -const { CODE_NO_CONTENT, CODE_INTERNAL_SERVER_ERROR } = require('./MagicNumbers.json'); +const { CODE_INTERNAL_SERVER_ERROR } = require('./MagicNumbers.json'); const { name: ASS_NAME, version: ASS_VERSION } = require('./package.json'); //#endregion @@ -65,8 +66,8 @@ app.use(helmet.referrerPolicy()); app.use(helmet.dnsPrefetchControl()); useSsl && app.use(helmet.hsts({ preload: true })); // skipcq: JS-0093 -// Don't process favicon requests (custom middleware) -app.use((req, res, next) => (req.url.includes('favicon.ico') ? res.sendStatus(CODE_NO_CONTENT) : next())); +// Don't process favicon requests +app.use(nofavicon); // Index can be overridden by a frontend app.get('/', (req, res, next) => diff --git a/package-lock.json b/package-lock.json index f3445b3..1d18108 100755 --- a/package-lock.json +++ b/package-lock.json @@ -1,15 +1,17 @@ { "name": "ass", - "version": "0.8.0", + "version": "0.8.1", "lockfileVersion": 2, "requires": true, "packages": { "": { "name": "ass", - "version": "0.8.0", + "version": "0.8.1", "license": "ISC", "dependencies": { - "@tycrek/ass-storage-engine": "0.2.6", + "@tycrek/ass-storage-engine": "0.2.7", + "@tycrek/express-nofavicon": "^1.0.2", + "@tycrek/isprod": "^2.0.2", "@tycrek/log": ">=0.5.x", "any-shell-escape": "^0.1.1", "aws-sdk": "^2.930.0", @@ -25,7 +27,7 @@ "jimp": "^0.16.1", "luxon": "^1.26.0", "marked": "^2.0.7", - "multer": "^2.0.0-rc.2", + "multer": "2.0.0-rc.2", "node-fetch": "^2.6.1", "node-vibrant": "*", "prompt": "^1.1.0", @@ -563,19 +565,12 @@ } }, "node_modules/@tycrek/ass-storage-engine": { - "version": "0.2.6", - "resolved": "https://registry.npmjs.org/@tycrek/ass-storage-engine/-/ass-storage-engine-0.2.6.tgz", - "integrity": "sha512-jSzeM8pBFEO4TNX+l9YXb+9qOFiz+U8GRc01zf9lC9kMD2mHxUIPvezTTHkXV30vGJ0XNd0TiwMKSn171fG1tg==", + "version": "0.2.7", + "resolved": "https://npm.pkg.github.com/download/@tycrek/ass-storage-engine/0.2.7/df4ac2b8dec3295304758a737a8f5b2866b1a3c450a17aea6a2b6a0b93231fee", + "integrity": "sha512-vSYB2sdq6hu+u6LHjbM177nmbXt3dMIAD4P1h2MsdFB5A0735ZF6gfl/vh+YpXd+nOl0Mk8QiGVKXCmJqMwBRQ==", + "license": "ISC", "dependencies": { "fs-extra": "^10.0.0" - }, - "engines": { - "node": ">=14.x.x", - "npm": ">=7.x.x" - }, - "funding": { - "type": "patreon", - "url": "https://patreon.com/tycrek" } }, "node_modules/@tycrek/ass-storage-engine/node_modules/fs-extra": { @@ -591,10 +586,23 @@ "node": ">=12" } }, + "node_modules/@tycrek/express-nofavicon": { + "version": "1.0.3", + "resolved": "https://npm.pkg.github.com/download/@tycrek/express-nofavicon/1.0.3/45d58ff8a8d0b996d6432634e06d592ca8e385a69ffe19d84b30ee27bddae7de", + "integrity": "sha512-GPqmhJZ5308/PrMSYYIZCXTCaZHUJfeB/Tvc4oYUHri8T4tprnxbbjC5p1/W8bpJFTqZPhFKcRq9cnZ2vvJ/2A==", + "license": "ISC" + }, + "node_modules/@tycrek/isprod": { + "version": "2.0.2", + "resolved": "https://npm.pkg.github.com/download/@tycrek/isprod/2.0.2/a627b888d478fc858a16f41af45ba040e852d29cb1c05324b33dc540f4057dbc", + "integrity": "sha512-01JluxLzmRb61o3cpdA44Eeg0BAXDrTJyZ4HQsEaKgaq3UP1nJ5dnqBW3ZUmYTDpjepdftzy2ns90/HmMnJSdg==", + "license": "ISC" + }, "node_modules/@tycrek/log": { - "version": "0.5.5", - "resolved": "https://registry.npmjs.org/@tycrek/log/-/log-0.5.5.tgz", - "integrity": "sha512-yBZQ8iRnxrYd3OeU73UcU6Qht44r/ScdqHJDIzdZNZd+A+3B8WomnGOvIxj12/54OHOXyOUbs/EpgzE1Y/iBrQ==", + "version": "0.5.6", + "resolved": "https://npm.pkg.github.com/download/@tycrek/log/0.5.6/53ef4c9e0da0eac0fb47d97f434f304c3833a94319dabb3708bc372ca5642a2f", + "integrity": "sha512-rGGUNowoNhtr7pPuoMKJUL52gUraMPUvDfuyoIdAb16esLsXMp01HstQPMr0tMWIAIs1fm6tWUhw/Q4uSa++gA==", + "license": "ISC", "dependencies": { "chalk": "^4.1.1", "deepmerge": "^4.2.2", @@ -932,9 +940,9 @@ } }, "node_modules/aws-sdk": { - "version": "2.956.0", - "resolved": "https://registry.npmjs.org/aws-sdk/-/aws-sdk-2.956.0.tgz", - "integrity": "sha512-vSzL66tjeRSBPnLR2Pkx4qS7SPqADT7K9QBjWdMhVd9BF5spyMvJ9hReIEShILp3hq99sHI+MvO+uTUm5s023g==", + "version": "2.957.0", + "resolved": "https://registry.npmjs.org/aws-sdk/-/aws-sdk-2.957.0.tgz", + "integrity": "sha512-TtRv/ebZL7gWgAW8XGlRizs5xhyzlDt2KbrxoPcHcxPTH8KHlbEyOmAXafyB7K/Jf3En5TDdJN1daJ4idSKWSg==", "hasInstallScript": true, "dependencies": { "buffer": "4.9.2", @@ -1089,9 +1097,9 @@ } }, "node_modules/buffer-from": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.1.tgz", - "integrity": "sha512-MQcXEUbCKtEo7bhqEs6560Hyd4XaovZlO/k9V3hjVUF/zwW7KBVdSK4gIt/bzwS9MbR5qob+F5jusZsb0YQK2A==" + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", + "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==" }, "node_modules/busboy": { "version": "0.3.1", @@ -1138,9 +1146,9 @@ "integrity": "sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw=" }, "node_modules/chalk": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.1.tgz", - "integrity": "sha512-diHzdDKxcU+bAsUboHLPEDQiw0qEe0qd7SYUn3HgcFlWgbDcfLGswOHYeGrHKzG9z6UYf01d9VFMfZxPM1xZSg==", + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", "dependencies": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" @@ -4176,9 +4184,9 @@ } }, "@tycrek/ass-storage-engine": { - "version": "0.2.6", - "resolved": "https://registry.npmjs.org/@tycrek/ass-storage-engine/-/ass-storage-engine-0.2.6.tgz", - "integrity": "sha512-jSzeM8pBFEO4TNX+l9YXb+9qOFiz+U8GRc01zf9lC9kMD2mHxUIPvezTTHkXV30vGJ0XNd0TiwMKSn171fG1tg==", + "version": "0.2.7", + "resolved": "https://npm.pkg.github.com/download/@tycrek/ass-storage-engine/0.2.7/df4ac2b8dec3295304758a737a8f5b2866b1a3c450a17aea6a2b6a0b93231fee", + "integrity": "sha512-vSYB2sdq6hu+u6LHjbM177nmbXt3dMIAD4P1h2MsdFB5A0735ZF6gfl/vh+YpXd+nOl0Mk8QiGVKXCmJqMwBRQ==", "requires": { "fs-extra": "^10.0.0" }, @@ -4195,10 +4203,20 @@ } } }, + "@tycrek/express-nofavicon": { + "version": "1.0.3", + "resolved": "https://npm.pkg.github.com/download/@tycrek/express-nofavicon/1.0.3/45d58ff8a8d0b996d6432634e06d592ca8e385a69ffe19d84b30ee27bddae7de", + "integrity": "sha512-GPqmhJZ5308/PrMSYYIZCXTCaZHUJfeB/Tvc4oYUHri8T4tprnxbbjC5p1/W8bpJFTqZPhFKcRq9cnZ2vvJ/2A==" + }, + "@tycrek/isprod": { + "version": "2.0.2", + "resolved": "https://npm.pkg.github.com/download/@tycrek/isprod/2.0.2/a627b888d478fc858a16f41af45ba040e852d29cb1c05324b33dc540f4057dbc", + "integrity": "sha512-01JluxLzmRb61o3cpdA44Eeg0BAXDrTJyZ4HQsEaKgaq3UP1nJ5dnqBW3ZUmYTDpjepdftzy2ns90/HmMnJSdg==" + }, "@tycrek/log": { - "version": "0.5.5", - "resolved": "https://registry.npmjs.org/@tycrek/log/-/log-0.5.5.tgz", - "integrity": "sha512-yBZQ8iRnxrYd3OeU73UcU6Qht44r/ScdqHJDIzdZNZd+A+3B8WomnGOvIxj12/54OHOXyOUbs/EpgzE1Y/iBrQ==", + "version": "0.5.6", + "resolved": "https://npm.pkg.github.com/download/@tycrek/log/0.5.6/53ef4c9e0da0eac0fb47d97f434f304c3833a94319dabb3708bc372ca5642a2f", + "integrity": "sha512-rGGUNowoNhtr7pPuoMKJUL52gUraMPUvDfuyoIdAb16esLsXMp01HstQPMr0tMWIAIs1fm6tWUhw/Q4uSa++gA==", "requires": { "chalk": "^4.1.1", "deepmerge": "^4.2.2", @@ -4475,9 +4493,9 @@ "integrity": "sha512-+q/t7Ekv1EDY2l6Gda6LLiX14rU9TV20Wa3ofeQmwPFZbOMo9DXrLbOjFaaclkXKWidIaopwAObQDqwWtGUjqg==" }, "aws-sdk": { - "version": "2.956.0", - "resolved": "https://registry.npmjs.org/aws-sdk/-/aws-sdk-2.956.0.tgz", - "integrity": "sha512-vSzL66tjeRSBPnLR2Pkx4qS7SPqADT7K9QBjWdMhVd9BF5spyMvJ9hReIEShILp3hq99sHI+MvO+uTUm5s023g==", + "version": "2.957.0", + "resolved": "https://registry.npmjs.org/aws-sdk/-/aws-sdk-2.957.0.tgz", + "integrity": "sha512-TtRv/ebZL7gWgAW8XGlRizs5xhyzlDt2KbrxoPcHcxPTH8KHlbEyOmAXafyB7K/Jf3En5TDdJN1daJ4idSKWSg==", "requires": { "buffer": "4.9.2", "events": "1.1.1", @@ -4596,9 +4614,9 @@ "integrity": "sha1-kbx0sR6kBbyRa8aqkI+q+ltKrEs=" }, "buffer-from": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.1.tgz", - "integrity": "sha512-MQcXEUbCKtEo7bhqEs6560Hyd4XaovZlO/k9V3hjVUF/zwW7KBVdSK4gIt/bzwS9MbR5qob+F5jusZsb0YQK2A==" + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", + "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==" }, "busboy": { "version": "0.3.1", @@ -4633,9 +4651,9 @@ "integrity": "sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw=" }, "chalk": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.1.tgz", - "integrity": "sha512-diHzdDKxcU+bAsUboHLPEDQiw0qEe0qd7SYUn3HgcFlWgbDcfLGswOHYeGrHKzG9z6UYf01d9VFMfZxPM1xZSg==", + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", "requires": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" diff --git a/package.json b/package.json index 170bafd..58ae60f 100755 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "ass", - "version": "0.8.0", + "version": "0.8.1", "description": "The superior self-hosted ShareX server", "main": "ass.js", "engines": { @@ -35,7 +35,9 @@ "url": "https://patreon.com/tycrek" }, "dependencies": { - "@tycrek/ass-storage-engine": "0.2.6", + "@tycrek/ass-storage-engine": "0.2.7", + "@tycrek/express-nofavicon": "^1.0.2", + "@tycrek/isprod": "^2.0.2", "@tycrek/log": ">=0.5.x", "any-shell-escape": "^0.1.1", "aws-sdk": "^2.930.0", @@ -51,7 +53,7 @@ "jimp": "^0.16.1", "luxon": "^1.26.0", "marked": "^2.0.7", - "multer": "^2.0.0-rc.2", + "multer": "2.0.0-rc.2", "node-fetch": "^2.6.1", "node-vibrant": "*", "prompt": "^1.1.0", diff --git a/thumbnails.js b/thumbnails.js index b2f5d35..1648323 100644 --- a/thumbnails.js +++ b/thumbnails.js @@ -2,7 +2,7 @@ const ffmpeg = require('ffmpeg-static'); const Jimp = require('jimp'); const shell = require('any-shell-escape'); const { exec } = require('child_process'); -const { path } = require('./utils'); +const { isProd, path } = require('./utils'); const { diskFilePath } = require('./config.json'); // Thumbnail parameters @@ -21,7 +21,7 @@ const THUMBNAIL = { function getCommand(src, dest) { return shell([ ffmpeg, '-y', - '-v', (process.env.NODE_ENV === 'production' ? 'error' : 'debug'), // Log level + '-v', (isProd ? 'error' : 'debug'), // Log level '-i', src, // Input file '-ss', '00:00:01.000', // Timestamp of frame to grab '-frames:v', '1', // Number of frames to grab diff --git a/utils.js b/utils.js index f0a17e1..d459a37 100755 --- a/utils.js +++ b/utils.js @@ -104,6 +104,7 @@ GENERATORS.set(idModes.r, randomGen); GENERATORS.set(idModes.gfy, gfyGen); module.exports = { + isProd: require('@tycrek/isprod')(), path, getTrueHttp, getTrueDomain,