ditto/src/middleware/uploaderMiddleware.ts
2024-10-13 17:29:04 -05:00

53 lines
1.8 KiB
TypeScript

import { MiddlewareHandler } from '@hono/hono';
import { type NostrSigner, NUploader } from '@nostrify/nostrify';
import { BlossomUploader, NostrBuildUploader } from '@nostrify/nostrify/uploaders';
import { Conf } from '@/config.ts';
import { DenoUploader } from '@/uploaders/DenoUploader.ts';
import { IPFSUploader } from '@/uploaders/IPFSUploader.ts';
import { S3Uploader } from '@/uploaders/S3Uploader.ts';
import { fetchWorker } from '@/workers/fetch.ts';
/** Set an uploader for the user. */
export const uploaderMiddleware: MiddlewareHandler<{ Variables: { signer?: NostrSigner; uploader?: NUploader } }> =
async (c, next) => {
const signer = c.get('signer');
switch (Conf.uploader) {
case 's3':
c.set(
'uploader',
new S3Uploader({
accessKey: Conf.s3.accessKey,
bucket: Conf.s3.bucket,
endPoint: Conf.s3.endPoint!,
pathStyle: Conf.s3.pathStyle,
port: Conf.s3.port,
region: Conf.s3.region!,
secretKey: Conf.s3.secretKey,
sessionToken: Conf.s3.sessionToken,
useSSL: Conf.s3.useSSL,
}),
);
break;
case 'ipfs':
c.set(
'uploader',
new IPFSUploader({ baseUrl: Conf.mediaDomain, apiUrl: Conf.ipfs.apiUrl, fetch: fetchWorker }),
);
break;
case 'local':
c.set('uploader', new DenoUploader({ baseUrl: Conf.mediaDomain, dir: Conf.uploadsDir }));
break;
case 'nostrbuild':
c.set('uploader', new NostrBuildUploader({ endpoint: Conf.nostrbuildEndpoint, signer, fetch: fetchWorker }));
break;
case 'blossom':
if (signer) {
c.set('uploader', new BlossomUploader({ servers: Conf.blossomServers, signer, fetch: fetchWorker }));
}
break;
}
await next();
};