Extend main config with FILE_VIEWERS_CONFIG_URL
[arvados-workbench2.git] / src / common / config.ts
1 // Copyright (C) The Arvados Authors. All rights reserved.
2 //
3 // SPDX-License-Identifier: AGPL-3.0
4
5 import Axios from "axios";
6
7 export const CONFIG_URL = process.env.REACT_APP_ARVADOS_CONFIG_URL || "/config.json";
8
9 export interface Config {
10     auth: {};
11     basePath: string;
12     baseUrl: string;
13     batchPath: string;
14     blobSignatureTtl: number;
15     crunchLimitLogBytesPerJob: number;
16     crunchLogBytesPerEvent: number;
17     crunchLogPartialLineThrottlePeriod: number;
18     crunchLogSecondsBetweenEvents: number;
19     crunchLogThrottleBytes: number;
20     crunchLogThrottleLines: number;
21     crunchLogThrottlePeriod: number;
22     defaultCollectionReplication: number;
23     defaultTrashLifetime: number;
24     description: string;
25     discoveryVersion: string;
26     dockerImageFormats: string[];
27     documentationLink: string;
28     generatedAt: string;
29     gitUrl: string;
30     id: string;
31     keepWebServiceUrl: string;
32     kind: string;
33     maxRequestSize: number;
34     name: string;
35     packageVersion: string;
36     parameters: {};
37     protocol: string;
38     remoteHosts: string;
39     remoteHostsViaDNS: boolean;
40     resources: {};
41     revision: string;
42     rootUrl: string;
43     schemas: {};
44     servicePath: string;
45     sourceVersion: string;
46     source_version: string;
47     title: string;
48     uuidPrefix: string;
49     version: string;
50     websocketUrl: string;
51     workbenchUrl: string;
52     vocabularyUrl: string;
53     fileViewersConfigUrl: string;
54 }
55
56 export const fetchConfig = () => {
57     return Axios
58         .get<ConfigJSON>(CONFIG_URL + "?nocache=" + (new Date()).getTime())
59         .then(response => response.data)
60         .catch(() => Promise.resolve(getDefaultConfig()))
61         .then(config => Axios
62             .get<Config>(getDiscoveryURL(config.API_HOST))
63             .then(response => ({ 
64                 // TODO: After tests delete `|| '/vocabulary-example.json'`
65                 config: {...response.data, vocabularyUrl: config.VOCABULARY_URL || '/vocabulary-example.json' }, 
66                 apiHost: config.API_HOST, 
67             })));
68
69 };
70
71 export const mockConfig = (config: Partial<Config>): Config => ({
72     auth: {},
73     basePath: '',
74     baseUrl: '',
75     batchPath: '',
76     blobSignatureTtl: 0,
77     crunchLimitLogBytesPerJob: 0,
78     crunchLogBytesPerEvent: 0,
79     crunchLogPartialLineThrottlePeriod: 0,
80     crunchLogSecondsBetweenEvents: 0,
81     crunchLogThrottleBytes: 0,
82     crunchLogThrottleLines: 0,
83     crunchLogThrottlePeriod: 0,
84     defaultCollectionReplication: 0,
85     defaultTrashLifetime: 0,
86     description: '',
87     discoveryVersion: '',
88     dockerImageFormats: [],
89     documentationLink: '',
90     generatedAt: '',
91     gitUrl: '',
92     id: '',
93     keepWebServiceUrl: '',
94     kind: '',
95     maxRequestSize: 0,
96     name: '',
97     packageVersion: '',
98     parameters: {},
99     protocol: '',
100     remoteHosts: '',
101     remoteHostsViaDNS: false,
102     resources: {},
103     revision: '',
104     rootUrl: '',
105     schemas: {},
106     servicePath: '',
107     sourceVersion: '',
108     source_version: '',
109     title: '',
110     uuidPrefix: '',
111     version: '',
112     websocketUrl: '',
113     workbenchUrl: '',
114     vocabularyUrl: '',
115     fileViewersConfigUrl: '',
116     ...config
117 });
118
119 interface ConfigJSON {
120     API_HOST: string;
121     VOCABULARY_URL: string;
122     FILE_VIEWERS_CONFIG_URL: string;
123 }
124
125 const getDefaultConfig = (): ConfigJSON => ({
126     API_HOST: process.env.REACT_APP_ARVADOS_API_HOST || "",
127     VOCABULARY_URL: "",
128     FILE_VIEWERS_CONFIG_URL: "",
129 });
130
131 const getDiscoveryURL = (apiHost: string) => `${window.location.protocol}//${apiHost}/discovery/v1/apis/arvados/v1/rest`;