UNPKG

5.47 kBJavaScriptView Raw
1import { combineLatest, from, of, throwError } from 'rxjs';
2import { catchError, filter, map, startWith, switchMap } from 'rxjs/operators';
3import { asError, createAggregateError, isErrorLike } from './errors';
4import { gql, graphQLContent } from './graphql';
5import { parseJSONCOrError } from './util';
6/**
7 * A controller that exposes functionality for a configuration cascade and querying extensions from the remote
8 * registry.
9 */
10export class Controller {
11 constructor(context) {
12 this.context = context;
13 this.viewerConfiguredExtensionsOrLoading = from(this.context.configurationCascade).pipe(switchMap(cascade => isErrorLike(cascade.merged)
14 ? [cascade.merged]
15 : this.withRegistryMetadata(cascade).pipe(catchError(error => [asError(error)]), startWith(Controller.LOADING))));
16 this.viewerConfiguredExtensions = this.viewerConfiguredExtensionsOrLoading.pipe(filter((extensions) => extensions !== Controller.LOADING), switchMap(extensions => (isErrorLike(extensions) ? throwError(extensions) : [extensions])));
17 }
18 forExtensionID(extensionID, registryExtensionFragment) {
19 return from(this.context.queryGraphQL(gql `
20 query RegistryExtension($extensionID: String!) {
21 extensionRegistry {
22 extension(extensionID: $extensionID) {
23 ...RegistryExtensionFields
24 }
25 }
26 }
27 ${registryExtensionFragment}
28 `[graphQLContent], { extensionID }))
29 .pipe(map(({ data, errors }) => {
30 if (!data || !data.extensionRegistry || !data.extensionRegistry.extension) {
31 throw createAggregateError(errors);
32 }
33 return data.extensionRegistry.extension;
34 }))
35 .pipe(switchMap(registryExtension => this.withConfiguration(of([registryExtension]))), map(configuredExtensions => configuredExtensions[0]));
36 }
37 withRegistryMetadata(cascade) {
38 if (isErrorLike(cascade.merged)) {
39 return throwError(cascade.merged);
40 }
41 if (!cascade.merged || !cascade.merged.extensions) {
42 return of([]);
43 }
44 const extensionIDs = Object.keys(cascade.merged.extensions);
45 return from(this.context.queryGraphQL(gql `
46 query Extensions($first: Int!, $prioritizeExtensionIDs: [String!]!) {
47 extensionRegistry {
48 extensions(first: $first, prioritizeExtensionIDs: $prioritizeExtensionIDs) {
49 nodes {
50 id
51 extensionID
52 url
53 manifest {
54 raw
55 }
56 viewerCanAdminister
57 }
58 }
59 }
60 }
61 `[graphQLContent], {
62 first: extensionIDs.length,
63 prioritizeExtensionIDs: extensionIDs,
64 })).pipe(map(({ data, errors }) => {
65 if (!data ||
66 !data.extensionRegistry ||
67 !data.extensionRegistry.extensions ||
68 !data.extensionRegistry.extensions.nodes) {
69 throw createAggregateError(errors);
70 }
71 return data.extensionRegistry.extensions.nodes.map(({ id, extensionID, url, manifest, viewerCanAdminister }) => ({
72 id,
73 extensionID,
74 url,
75 manifest: manifest ? { raw: manifest.raw } : null,
76 viewerCanAdminister,
77 }));
78 }), map(registryExtensions => {
79 const configuredExtensions = [];
80 for (const extensionID of extensionIDs) {
81 const registryExtension = registryExtensions.find(x => x.extensionID === extensionID);
82 configuredExtensions.push({
83 id: extensionID,
84 manifest: registryExtension && registryExtension.manifest
85 ? parseJSONCOrError(registryExtension.manifest.raw)
86 : null,
87 rawManifest: (registryExtension && registryExtension.manifest && registryExtension.manifest.raw) || null,
88 registryExtension,
89 });
90 }
91 return configuredExtensions;
92 }));
93 }
94 withConfiguration(registryExtensions) {
95 return combineLatest(registryExtensions, this.context.configurationCascade).pipe(map(([registryExtensions, cascade]) => {
96 const configuredExtensions = [];
97 for (const registryExtension of registryExtensions) {
98 configuredExtensions.push({
99 id: registryExtension.extensionID,
100 manifest: registryExtension.manifest
101 ? parseJSONCOrError(registryExtension.manifest.raw)
102 : null,
103 rawManifest: (registryExtension && registryExtension.manifest && registryExtension.manifest.raw) || null,
104 registryExtension,
105 });
106 }
107 return configuredExtensions;
108 }));
109 }
110}
111Controller.LOADING = 'loading';
112//# sourceMappingURL=controller.js.map
\No newline at end of file