remove: Sia Skynet is no longer usable

pull/190/head
tycrek 1 year ago
parent d3f49158da
commit 95339688d2
No known key found for this signature in database
GPG Key ID: FF8A54DCE404885A

15
.github/README.md vendored

@ -72,8 +72,7 @@ ass was designed with developers in mind. If you are a developer & want somethin
- Run locally or in a Docker container
- **Multiple file storage methods**
- Local file system
- Amazon S3, including [DigitalOcean Spaces]
- [Skynet] (free decentralized storage on the [Sia] blockchain)
- Amazon S3, including [DigitalOcean Spaces] (more coming soon)
- **Multiple data storage methods** using [data engines]
- **File**
- JSON (default, [papito])
@ -86,8 +85,6 @@ ass was designed with developers in mind. If you are a developer & want somethin
[Git Submodules]: https://git-scm.com/book/en/v2/Git-Tools-Submodules
[ZWS]: https://zws.im
[DigitalOcean Spaces]: https://www.digitalocean.com/products/spaces/
[Skynet]: https://siasky.net/
[Sia]: https://sia.tech/
[data engines]: #data-engines
[papito]: https://github.com/tycrek/papito
[ass-psql]: https://github.com/tycrek/ass-psql
@ -346,16 +343,6 @@ Any existing object storage server that's compatible with [Amazon S3] can be use
S3 servers are generally very fast & have very good uptime, though this will depend on the hosting provider & plan you choose.
### Skynet
**As of August 12, 2022, [Skynet Labs is shut down].** Skynet *will continue to work*, as such is the nature of decentralized services.
[Skynet] is a decentralized CDN created by [Skynet Labs]. It utilizes the [Sia] blockchain, the leading decentralized cloud storage platform, which boasts "no signups, no servers, no trusted third parties". For hosts who are looking for a reliable, always available storage solution with lots of capacity & no costs, Skynet may be your best option. However, uploads tend to be on the slower side (though speeds will improve as the Sia network grows).
[Skynet Labs is shut down]: https://skynetlabs.com/news/skynet-labs-shutting-down-skynet-remains-online
[Amazon S3]: https://en.wikipedia.org/wiki/Amazon_S3
[Skynet Labs]: https://github.com/SkynetLabs
## New user system (v0.14.0)
The user system was overhauled in v0.14.0 to allow more features and flexibility. New fields on users include `admin`, `passhash`, `unid`, and `meta` (these will be documented more once the system is finalized).

1
package-lock.json generated

@ -9,7 +9,6 @@
"version": "0.14.0-alpha.1",
"license": "ISC",
"dependencies": {
"@skynetlabs/skynet-nodejs": "^2.3.0",
"@tsconfig/node16": "^1.0.1",
"@tycrek/discord-hookr": "^0.1.0",
"@tycrek/express-nofavicon": "^1.0.3",

@ -42,7 +42,6 @@
"url": "https://patreon.com/tycrek"
},
"dependencies": {
"@skynetlabs/skynet-nodejs": "^2.3.0",
"@tsconfig/node16": "^1.0.1",
"@tycrek/discord-hookr": "^0.1.0",
"@tycrek/express-nofavicon": "^1.0.3",

@ -24,7 +24,7 @@ if (!fs.existsSync(configPath) || fs.readFileSync(configPath).toString().length
//#endregion
// Load the JSON
const { host, port, useSsl, isProxied, s3enabled, frontendName, useSia, diskFilePath }: Config = fs.readJsonSync(path('config.json'));
const { host, port, useSsl, isProxied, s3enabled, frontendName, diskFilePath }: Config = fs.readJsonSync(path('config.json'));
const { CODE_INTERNAL_SERVER_ERROR }: MagicNumbers = fs.readJsonSync(path('MagicNumbers.json'));
const { name, version, homepage }: Package = fs.readJsonSync(path('package.json'));
@ -142,5 +142,5 @@ app.use((err: ErrWrap, _req: Request, res: Response) => log.error(err.message).e
.info('Frontend', ASS_FRONTEND.enabled ? ASS_FRONTEND.brand : 'disabled', `${ASS_FRONTEND.enabled ? `${getTrueHttp()}${getTrueDomain()}${ASS_FRONTEND.endpoint}` : ''}`)
.info('Custom index', ASS_INDEX ?? 'disabled')
.blank()
.express()!.Host(app, port, host, () => log.success('Ready for uploads', `Storing resources ${s3enabled ? 'in S3' : useSia ? 'on Sia blockchain' : 'on disk'}`));
.express()!.Host(app, port, host, () => log.success('Ready for uploads', `Storing resources ${s3enabled ? 'in S3' : 'on disk'}`));
})();

@ -6,10 +6,9 @@ import escape from 'escape-html';
import fetch, { Response as FetchResponse } from 'node-fetch';
import { Request, Response } from 'express';
import { deleteS3 } from '../storage';
import { SkynetDelete, SkynetDownload } from '../skynet';
import { checkIfZws } from '../generators/zws';
import { path, log, getTrueHttp, getTrueDomain, formatBytes, formatTimestamp, getS3url, getDirectUrl, getResourceColor, replaceholder } from '../utils';
const { diskFilePath, s3enabled, viewDirect, useIdInViewer, idInViewerExtension, useSia }: Config = fs.readJsonSync(path('config.json'));
const { diskFilePath, s3enabled, viewDirect, useIdInViewer, idInViewerExtension }: Config = fs.readJsonSync(path('config.json'));
const { CODE_UNAUTHORIZED, CODE_NOT_FOUND, }: MagicNumbers = fs.readJsonSync(path('MagicNumbers.json'));
import { data } from '../data';
import { users } from '../auth';
@ -96,9 +95,6 @@ router.get('/direct*', (req: Request, res: Response, next) => data().get(req.ass
file.headers.forEach((value, header) => res.setHeader(header, value));
file.body?.pipe(res);
}),
sia: () => SkynetDownload(fileData)
.then((stream) => stream.pipe(res))
.then(() => SkynetDelete(fileData)),
local: () => fs.pathExists(path(fileData.path))
.then((exists) => new Promise((resolve, reject) => !exists
? reject(new Error('File does not exist'))
@ -108,7 +104,7 @@ router.get('/direct*', (req: Request, res: Response, next) => data().get(req.ass
.sendFile(path(fileData.path), (err) => err ? reject(err) : resolve(void 0))))
};
return uploaders[fileData.randomId.startsWith('sia://') ? 'sia' : s3enabled ? 's3' : 'local']();
return uploaders[s3enabled ? 's3' : 'local']();
}).catch(next));
// Thumbnail response
@ -155,7 +151,7 @@ router.get('/delete/:deleteId', (req: Request, res: Response, next) => {
// Save the file information
return Promise.all([
s3enabled ? deleteS3(fileData) : !useSia ? fs.rmSync(path(fileData.path)) : () => Promise.resolve(),
s3enabled ? deleteS3(fileData) : fs.rmSync(path(fileData.path)),
(!fileData.is || (fileData.is.image || fileData.is.video)) && fs.existsSync(path(diskFilePath, 'thumbnails/', fileData.thumbnail))
? fs.rmSync(path(diskFilePath, 'thumbnails/', fileData.thumbnail)) : () => Promise.resolve()]);
})

@ -16,7 +16,6 @@ const config = {
idInViewerExtension: false,
dataEngine: '@tycrek/papito',
frontendName: 'ass-x',
useSia: false,
savePerDay: false,
adminWebhookEnabled: false,
s3enabled: false,
@ -47,6 +46,7 @@ const oldConfig = {
diskFilePath: 'uploads/',
saveWithDate: true, // Some systems don't like dirs with massive amounts of files
saveAsOriginal: false, // Prone to conflicts, which ass doesn't handle
useSia: false, // Sia has been shut down in 2022, uploads fail as of 2022-12-26
};
function getConfirmSchema(description) {
@ -195,12 +195,6 @@ function doSetup() {
default: config.frontendName,
required: false
},
useSia: {
description: 'Use Sia Skynet for decentralized file storage?',
type: 'boolean',
default: config.useSia,
required: false
},
savePerDay: {
description: 'Save uploads in folders by day (YYYY-MM-DD) instead of by month (YYYY-MM)',
type: 'boolean',

@ -1,37 +0,0 @@
import { FileData } from './types/definitions';
import fs, { ReadStream } from 'fs-extra';
import { path } from './utils';
import { SkynetClient } from '@skynetlabs/skynet-nodejs';
function getFullPath(fileData: FileData) {
return path('share', '.skynet', `${fileData.randomId}${fileData.ext}`.replace(/sia\:\/\//gi, ''));
}
// Create the SkyNet client
export const Skynet = new SkynetClient();
export function SkynetUpload(path: string): Promise<string> {
return new Promise(async (resolve, reject) => {
try {
const skylink = await Skynet.uploadFile(path);
resolve(skylink);
} catch (error) {
reject(error);
}
});
}
export function SkynetDownload(fileData: FileData): Promise<ReadStream> {
return new Promise((resolve: Function, reject) =>
fs.ensureDir(path('share', '.skynet'))
.then(async () => {
await Skynet.downloadFile(getFullPath(fileData), fileData.randomId);
return fs.createReadStream(getFullPath(fileData))
})
.then((stream) => resolve(stream))
.catch(reject));
}
export function SkynetDelete(fileData: FileData) {
return fs.remove(getFullPath(fileData));
}

@ -9,10 +9,9 @@ import Thumbnail from './thumbnails';
import Vibrant from './vibrant';
import Hash from './hash';
import { path, generateId, log } from './utils';
import { SkynetUpload } from './skynet';
import { Request, Response } from 'express';
import { removeGPS } from './nightmare';
const { s3enabled, s3endpoint, s3bucket, s3usePathStyle, s3accessKey, s3secretKey, diskFilePath, saveAsOriginal, saveWithDate, savePerDay, mediaStrict, maxUploadSize, useSia }: Config = fs.readJsonSync(path('config.json'));
const { s3enabled, s3endpoint, s3bucket, s3usePathStyle, s3accessKey, s3secretKey, diskFilePath, saveAsOriginal, saveWithDate, savePerDay, mediaStrict, maxUploadSize }: Config = fs.readJsonSync(path('config.json'));
const { CODE_UNSUPPORTED_MEDIA_TYPE }: MagicNumbers = fs.readJsonSync(path('MagicNumbers.json'));
const ID_GEN_LENGTH = 32;
@ -129,7 +128,7 @@ export function processUploaded(req: Request, res: Response, next: Function) { /
.catch((err) => log.debug('!! EXIF GPS data could not be removed', err))
// Save file
.then(() => log.debug('Saving file', req.file.originalname, s3enabled ? 'in S3' : useSia ? 'on Sia blockchain' : 'on disk'))
.then(() => log.debug('Saving file', req.file.originalname, s3enabled ? 'in S3' : 'on disk'))
.then(() =>
// skipcq: JS-0229
new Promise((resolve, reject) => {
@ -143,18 +142,13 @@ export function processUploaded(req: Request, res: Response, next: Function) { /
Body: fs.createReadStream(req.file.path)
}).promise().then(resolve).catch(reject);
// Use Sia Skynet
else if (useSia) return SkynetUpload(req.file.path)
.then((skylink) => req.file.randomId = skylink)
.then(resolve).catch(reject);
// Save to local storage
else return fs.ensureDir(getDatedDirname())
.then(() => tempFileName = getLocalFilename(req))
.then(() => fs.copy(req.file.path, tempFileName, { preserveTimestamps: true }))
.then(resolve).catch(reject);
}))
.then(() => log.debug('File saved', req.file.originalname, s3enabled ? 'in S3' : useSia ? 'on Sia blockchain' : 'on disk'))
.then(() => log.debug('File saved', req.file.originalname, s3enabled ? 'in S3' : 'on disk'))
.catch((err) => next(err))
// Delete the file

@ -17,7 +17,6 @@ declare module 'ass-json' {
dataEngine: string
frontendName: string
indexFile: string
useSia: boolean
savePerDay: boolean
adminWebhookEnabled: boolean
adminWebhookUrl: string

Loading…
Cancel
Save