s3-autoindex
Version:
Serve the contents of a S3 bucket (private or public) over HTTP
99 lines (89 loc) • 3.41 kB
text/typescript
// import * as express from 'express';
// var argv = require('minimist')(process.argv.slice(2));
// import * as path from 'path';
// import * as leftPad from 'left-pad';
import * as https from 'https';
import * as http from 'http';
import * as net from 'net';
import * as rxme from 'rxme';
// import { NextFunction, Response, Request } from 'express-serve-static-core';
// import { RxMe, MatcherCallback } from 'rxme';
// import { Endpoint } from 'aws-sdk/lib/endpoint';
// import { removeAllListeners } from 'cluster';
// import { RxExpress } from './rx-express';
// import * as leftPad from 'left-pad';
// import { Request } from 'aws-sdk/lib/request';
import * as simqle from 'simqle';
import QWorker from './q-worker';
import { RxHttp } from './rx-http';
import fileMatcher from './file-matcher';
import directoryMatcher from './directory-matcher';
import parseConfig from './parse-config';
import * as AWSReal from 'aws-sdk';
import * as AWSMock from 'mock-aws-s3';
export type Server = http.Server | https.Server | net.Server;
export function RxHttpMatcher(cb:
(t: Server, sub?: rxme.Subject) => rxme.MatchReturn): rxme.MatcherCallback {
return (rx, sub): rxme.MatchReturn => {
if (rx.data instanceof net.Server ||
rx.data instanceof http.Server ||
rx.data instanceof https.Server) {
return cb(rx.data, sub);
}
};
}
interface HttpHandler {
(req: http.IncomingMessage, res: http.ServerResponse): void;
}
function RxMsgHttp(rapp: rxme.Subject): HttpHandler {
return (rq, rs) => {
rapp.next(RxHttp(rq, rs));
};
}
export function server(argv: string[]): rxme.Observable {
let runningServer: Server;
let runningQueue: simqle.Queue;
return rxme.Observable.create(rxo => {
const config = parseConfig(argv);
let s3: any;
if (config.aws_module == 'aws') {
rxo.next(rxme.Msg.LogInfo(`booting AWSReal:`, JSON.stringify(config)));
s3 = new AWSReal.S3(config.aws);
} else {
rxo.next(rxme.Msg.LogInfo(`booting AWSMock:`, JSON.stringify(config)));
s3 = new AWSMock.S3(config.aws);
}
rxo.next(rxme.Msg.Observer(rxo));
const rapp = new rxme.Subject();
simqle.start({ taskTimer: 60000 }).match(simqle.MatchQ(rq => {
runningQueue = rq;
Array(config.s3.Concurrent).fill(0).forEach(a => {
rq.addWorker(QWorker);
});
rxo.next(rxme.Msg.LogInfo(`Started Q with ${config.s3.Concurrent} workers.`));
rapp
.match(directoryMatcher(rq, rapp, s3, config))
.match(fileMatcher(rq, rapp, s3, config))
.passTo(rxo);
// app.use('/', (req, res, next) => { rapp.next(RxExpress(req, res, next)); });
if (config.https) {
const httpServer = https.createServer(config.https, RxMsgHttp(rapp));
rxo.next(rxme.Msg.LogInfo(`Listen on: https ${config.port}`));
httpServer.listen(config.port);
rxo.next(rxme.Msg.Type(httpServer));
runningServer = httpServer;
} else {
const httpServer = http.createServer(RxMsgHttp(rapp));
rxo.next(rxme.Msg.LogInfo(`Listen on: http ${config.port}`));
httpServer.listen(config.port);
rxo.next(rxme.Msg.Type(httpServer));
runningServer = httpServer;
}
})).passTo(rapp);
}).match(rxme.Matcher.Complete(() => {
console.log(`got complete`);
runningQueue.stop().passTo();
runningServer.close();
}));
}
export default server;