1 | import { combineLatest, from, of, throwError } from 'rxjs';
|
2 | import { catchError, filter, map, startWith, switchMap } from 'rxjs/operators';
|
3 | import { asError, createAggregateError, isErrorLike } from './errors';
|
4 | import { gql, graphQLContent } from './graphql';
|
5 | import { parseJSONCOrError } from './util';
|
6 |
|
7 |
|
8 |
|
9 |
|
10 | export 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 | }
|
111 | Controller.LOADING = 'loading';
|
112 |
|
\ | No newline at end of file |