@ -1,39 +1,41 @@
const fs = require ( 'fs-extra' ) ;
const Path = require ( 'path' ) ;
const TLog = require ( '@tycrek/log' ) ;
const fetch = require ( 'node-fetch' ) ;
const sanitize = require ( 'sanitize-filename' ) ;
const { DateTime } = require ( 'luxon' ) ;
const token = require ( './generators/token' ) ;
const zwsGen = require ( './generators/zws' ) ;
const randomGen = require ( './generators/random' ) ;
const gfyGen = require ( './generators/gfycat' ) ;
import { AssRequest , FileData } from './definitions' ;
import fs from 'fs-extra' ;
import Path from 'path' ;
import fetch from 'node-fetch' ;
import sanitize from 'sanitize-filename' ;
import { DateTime } from 'luxon' ;
import token from './generators/token' ;
import zwsGen from './generators/zws' ;
import randomGen from './generators/random' ;
import gfyGen from './generators/gfycat' ;
import logger from './logger' ;
const { HTTP , HTTPS , KILOBYTES } = require ( '../MagicNumbers.json' ) ;
// Catch config.json not existing when running setup script
try {
var { useSsl , port , domain , isProxied , diskFilePath , saveWithDate , s3bucket , s3endpoint , s3usePathStyle } = require ( '../config.json' ) ; // skipcq: JS-0239, JS-0102
} catch ( ex ) {
// @ts-ignore
if ( ex . code !== 'MODULE_NOT_FOUND' ) console . error ( ex ) ;
}
function getTrueHttp() {
export function getTrueHttp() {
return ( 'http' ) . concat ( useSsl ? 's' : '' ) . concat ( '://' ) ;
}
function getTrueDomain ( d = domain ) {
export function getTrueDomain ( d = domain ) {
return d . concat ( ( port === HTTP || port === HTTPS || isProxied ) ? '' : ` : ${ port } ` ) ;
}
function getS3url ( s3key , ext ) {
export function getS3url ( s3key : string , ext : string ) {
return ` https:// ${ s3usePathStyle ? ` ${ s3endpoint } / ${ s3bucket } ` : ` ${ s3bucket } . ${ s3endpoint } ` } / ${ s3key } ${ ext } ` ;
}
function getDirectUrl ( resourceId ) {
export function getDirectUrl ( resourceId : string ) {
return ` ${ getTrueHttp ( ) } ${ getTrueDomain ( ) } / ${ resourceId } /direct ` ;
}
function randomHexColour() { // From: https://www.geeksforgeeks.org/javascript-generate-random-hex-codes-color/
export function randomHexColour() { // From: https://www.geeksforgeeks.org/javascript-generate-random-hex-codes-color/
const letters = '0123456789ABCDEF' ;
let colour = '#' ;
for ( let i = 0 ; i < 6 ; i ++ ) // skipcq: JS-0074
@ -41,29 +43,29 @@ function randomHexColour() { // From: https://www.geeksforgeeks.org/javascript-g
return colour ;
}
function getResourceColor ( colorValue , vibrantValue ) {
export function getResourceColor ( colorValue : string , vibrantValue : string ) {
return colorValue === '&random' ? randomHexColour ( ) : colorValue === '&vibrant' ? vibrantValue : colorValue ;
}
function formatTimestamp ( timestamp ) {
export function formatTimestamp ( timestamp : number ) {
return DateTime . fromMillis ( timestamp ) . toLocaleString ( DateTime . DATETIME_MED ) ;
}
function formatBytes ( bytes , decimals = 2 ) { // skipcq: JS-0074
export function formatBytes ( bytes : number , decimals = 2 ) { // skipcq: JS-0074
if ( bytes === 0 ) return '0 Bytes' ;
const sizes = [ 'Bytes' , 'KB' , 'MB' , 'GB' , 'TB' , 'PB' , 'EB' , 'ZB' , 'YB' ] ;
const i = Math . floor ( Math . log ( bytes ) / Math . log ( KILOBYTES ) ) ;
return parseFloat ( ( bytes / Math . pow ( KILOBYTES , i ) ) . toFixed ( decimals < 0 ? 0 : decimals ) ) . toString ( ) . concat ( ` ${ sizes [ i ] } ` ) ;
}
function replaceholder ( data , size , timestamp , originalname ) {
export function replaceholder ( data : string , size : number , timestamp : number , originalname : string ) {
return data
. replace ( /&size/g , formatBytes ( size ) )
. replace ( /&filename/g , originalname )
. replace ( /×tamp/g , formatTimestamp ( timestamp ) ) ;
}
function getDatedDirname() {
export function getDatedDirname() {
if ( ! saveWithDate ) return diskFilePath ;
// Get current month and year
@ -73,19 +75,13 @@ function getDatedDirname() {
return ` ${ diskFilePath } ${ diskFilePath . endsWith ( '/' ) ? '' : '/' } ${ year } - ${ ` 0 ${ month } ` . slice ( - 2 ) } ` ; // skipcq: JS-0074
}
// Set up pathing & the logger
const path = ( . . . paths ) = > Path . join ( process . cwd ( ) , . . . paths ) ; // '..' was added to make it easier to run files after moving the project to src/
const logger = new TLog ( {
level : process.env.LOG_LEVEL || ( process . env . NODE_ENV === 'production' ? 'info' : 'debug' ) ,
timestamp : {
enabled : true ,
colour : 'grey' ,
preset : 'DATETIME_MED'
} ,
} ) ;
export function arrayEquals ( arr1 : any [ ] , arr2 : any [ ] ) {
return arr1 . length === arr2 . length && arr1 . slice ( ) . sort ( ) . every ( ( value : string , index : number ) = > value === arr2 . slice ( ) . sort ( ) [ index ] )
} ;
// Enable the Express logger
logger . enable . express ( { handle500 : false } ) . debug ( 'Plugin enabled' , 'Express' ) ;
// Set up pathing
export const path = ( . . . paths : string [ ] ) = > Path . join ( process . cwd ( ) , . . . paths ) ; // '..' was added to make it easier to run files after moving the project to src/
const idModes = {
zws : 'zws' , // Zero-width spaces (see: https://zws.im/)
@ -99,8 +95,8 @@ GENERATORS.set(idModes.zws, zwsGen);
GENERATORS . set ( idModes . r , randomGen ) ;
GENERATORS . set ( idModes . gfy , gfyGen ) ;
export const isProd = require ( '@tycrek/isprod' ) ( ) ;
module .exports = {
isProd : require ( '@tycrek/isprod' ) ( ) ,
path ,
getTrueHttp ,
getTrueDomain ,
@ -113,26 +109,27 @@ module.exports = {
getDatedDirname ,
randomHexColour ,
sanitize ,
verify : ( req , users ) = > req . headers . authorization && Object . prototype . hasOwnProperty . call ( users , req . headers . authorization ) ,
renameFile : ( req , newName ) = > new Promise ( ( resolve , reject ) = > {
verify : ( req : AssRequest , users : JSON ) = > req . headers . authorization && Object . prototype . hasOwnProperty . call ( users , req . headers . authorization ) ,
renameFile : ( req : AssRequest , newName : string ) = > new Promise ( ( resolve : Function , reject ) = > {
try {
const paths = [ req . file . destination , newName ] ;
fs . rename ( path ( req . file . path ) , path ( . . . paths ) ) ;
req . file . path = Path . join ( . . . paths ) ;
const paths = [ req . file ! . destination , newName ] ;
fs . rename ( path ( req . file ! . path ) , path ( . . . paths ) ) ;
req . file ! . path = Path . join ( . . . paths ) ;
resolve ( ) ;
} catch ( err ) {
reject ( err ) ;
}
} ) ,
generateToken : ( ) = > token ( ) ,
generateId : ( mode , length , gfyLength , originalName ) = > ( GENERATORS . has ( mode ) ? GENERATORS . get ( mode ) ( { length , gfyLength } ) : originalName ) ,
arrayEquals : ( arr1 , arr2 ) = > arr1 . length === arr2 . length && arr1 . slice ( ) . sort ( ) . every ( ( value , index ) = > value === arr2 . slice ( ) . sort ( ) [ index ] ) ,
downloadTempS3 : ( file ) = > new Promise ( ( resolve , reject ) = >
generateId : ( mode : string , length : number , gfyLength : number , originalName : string ) = > ( GENERATORS . has ( mode ) ? GENERATORS . get ( mode ) ( { length , gfyLength } ) : originalName ) ,
arrayEquals ,
downloadTempS3 : ( file : FileData ) = > new Promise ( ( resolve : Function , reject ) = >
fetch ( getS3url ( file . randomId , file . ext ) )
. then ( ( f2 ) = > f2 . body . pipe ( fs . createWriteStream ( Path . join ( __dirname , diskFilePath , sanitize ( file . originalname ) ) ) . on ( 'close' , ( ) = > resolve ( ) ) ) )
. catch ( reject ) ) ,
}
export const log = logger ;
/ * *
* @type { TLog }
* /