| /* |
| * Copyright 2019 The Apache Software Foundation. |
| * |
| * Licensed under the Apache License, Version 2.0 (the "License"); |
| * you may not use this file except in compliance with the License. |
| * You may obtain a copy of the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, software |
| * distributed under the License is distributed on an "AS IS" BASIS, |
| * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| * See the License for the specific language governing permissions and |
| * limitations under the License. |
| */ |
| |
| /* eslint-disable no-console */ |
| 'use strict'; |
| |
| const { openWhiskRenderer } = require('./openwhisk-renderer'); |
| const defaultRenderers = require('./default-renderers'); |
| |
| // Ordered list of renderers, first ones get preference |
| const renderers = [ |
| openWhiskRenderer, |
| defaultRenderers.renderers.json, |
| defaultRenderers.renderers.html, |
| defaultRenderers.renderers.text, |
| ]; |
| |
| async function selectRendererInfo(resourceType, extension) { |
| return new Promise(async resolve => { |
| let i; |
| let result; |
| for(i in renderers) { |
| const rendererInfo = await renderers[i].getRendererInfo(resourceType, extension); |
| if(rendererInfo) { |
| result = { |
| 'renderer': renderers[i], |
| 'info': rendererInfo, |
| }; |
| break; |
| } |
| } |
| resolve(result); |
| }) |
| } |
| |
| async function render(context) { |
| const resource = context.content.resource.content; |
| const { resourceType } = resource; |
| const { extension } = context.request; |
| if(context.debug) { |
| console.log(`rendering for resourceType ${resourceType} extension ${extension}`); |
| } |
| const rendererInfo = await selectRendererInfo(resourceType, extension); |
| if(context.debug) { |
| console.log(`rendererInfo: ${JSON.stringify(rendererInfo, 2, null)}`); |
| } |
| if(!rendererInfo) { |
| throw Error(`Renderer not found for ${resourceType} extension ${extension}`); |
| } |
| const rendered = await rendererInfo.renderer.render(resource, rendererInfo.info); |
| if(!rendered.output) { |
| throw Error('Renderer generated no output'); |
| } |
| context.response.body = rendered.output; |
| context.response.headers = { |
| 'Content-Type': rendererInfo.info.contentType |
| }; |
| |
| return context; |
| } |
| |
| module.exports.render = render; |