signalk-server
Version:
An implementation of a [Signal K](http://signalk.org) server for boats.
84 lines (83 loc) • 3.12 kB
JavaScript
;
var __importDefault = (this && this.__importDefault) || function (mod) {
return (mod && mod.__esModule) ? mod : { "default": mod };
};
Object.defineProperty(exports, "__esModule", { value: true });
exports.mountSwaggerUi = mountSwaggerUi;
const swagger_ui_express_1 = __importDefault(require("swagger-ui-express"));
const constants_1 = require("../constants");
const openApi_1 = require("./course/openApi");
const openApi_2 = require("./notifications/openApi");
const openApi_3 = require("./resources/openApi");
const openApi_4 = require("./autopilot/openApi");
const openApi_5 = require("./security/openApi");
const openApi_6 = require("./discovery/openApi");
const openApi_7 = require("./weather/openApi");
const openApi_8 = require("./apps/openApi");
const openApi_9 = require("./history/openApi");
const apiDocs = [
openApi_6.discoveryApiRecord,
openApi_8.appsApiRecord,
openApi_4.autopilotApiRecord,
openApi_1.courseApiRecord,
openApi_2.notificationsApiRecord,
openApi_3.resourcesApiRecord,
openApi_7.weatherApiRecord,
openApi_5.securityApiRecord,
openApi_9.historyApiRecord
].reduce((acc, apiRecord) => {
acc[apiRecord.name] = apiRecord;
return acc;
}, {});
function mountSwaggerUi(app, path) {
const allApiNames = () => Object.keys(apiDocs).concat(app.getPluginOpenApiRecords().map(({ name }) => name));
// custom middleware to re-setup swaggerUI, because plugins have
// not been loaded when this is called early in server startup sequence
app.use(path, (req, res, next) => {
swagger_ui_express_1.default.setup(undefined, {
explorer: true,
swaggerOptions: {
urls: allApiNames().map((name) => ({
name,
url: `${constants_1.SERVERROUTESPREFIX}/openapi/${name}`
}))
}
});
next();
});
app.use(path, swagger_ui_express_1.default.serve, swagger_ui_express_1.default.setup(undefined, {
explorer: true,
swaggerOptions: {
urls: Object.keys(apiDocs).map((name) => ({
name,
url: `${constants_1.SERVERROUTESPREFIX}/openapi/${name}`
}))
}
}));
const apiDefinitionHandler = (req, res) => {
let apiRecord;
if (req.params.api) {
apiRecord = apiDocs[req.params.api];
}
else if (req.params.pluginId) {
apiRecord = app.getPluginOpenApi(req.params.pluginId);
}
const apiDoc = apiRecord?.apiDoc;
const apiPath = apiRecord?.path;
if (apiDoc && apiPath !== undefined) {
;
apiDoc.servers = apiDoc.servers ?? [
{
url: `${apiPath}`
}
];
res.json(apiDoc);
}
else {
res.status(404);
res.json('Not found');
}
};
app.get(`${constants_1.SERVERROUTESPREFIX}/openapi/plugins/:pluginId`, apiDefinitionHandler);
app.get(`${constants_1.SERVERROUTESPREFIX}/openapi/:api`, apiDefinitionHandler);
}