Skip to content

Commit 2cde37d

Browse files
Merge pull request #1273 from opencomponents/nested-renderer-to-promise
[CB-INTERNAL] move nested renderer to promises
2 parents 17a1797 + a131d90 commit 2cde37d

File tree

3 files changed

+144
-249
lines changed

3 files changed

+144
-249
lines changed

src/registry/domain/nested-renderer.ts

Lines changed: 64 additions & 122 deletions
Original file line numberDiff line numberDiff line change
@@ -1,145 +1,87 @@
1-
import async from 'async';
2-
import _ from 'lodash';
3-
41
import settings from '../../resources/settings';
52
import strings from '../../resources';
63
import { Config } from '../../types';
4+
import {
5+
GetComponentResult,
6+
RendererOptions
7+
} from '../routes/helpers/get-component';
78

8-
type Cb = (err: string | null, data: string) => void;
9-
type Options = {
9+
interface Options {
10+
ip?: string;
1011
version?: string;
1112
name?: string;
1213
headers?: Record<string, string>;
1314
parameters?: Record<string, string>;
14-
};
15-
type Params = {
16-
components: Options[];
17-
options: Options;
18-
callback: Cb;
19-
};
20-
21-
const sanitise = {
22-
componentParams(component: string, options: Options | Cb, callback?: Cb) {
23-
return {
24-
...sanitise.options(options, callback),
25-
componentName: component
26-
};
27-
},
28-
componentsParams(
29-
components: Options[],
30-
options: Options | Cb,
31-
callback: Cb
32-
): Params {
33-
return {
34-
...sanitise.options(options, callback),
35-
components: components
36-
};
37-
},
38-
headers(h = {}) {
39-
return {
40-
...h,
41-
accept: settings.registry.acceptRenderedHeader
42-
};
43-
},
44-
options(
45-
options: Options | Cb,
46-
callback?: Cb
47-
): { options: Options; callback: Cb } {
48-
const cb = !callback && typeof options === 'function' ? options : callback;
49-
const opts = typeof options === 'function' ? {} : options;
50-
51-
return { callback: cb!, options: opts };
52-
}
53-
};
54-
55-
const validate = {
56-
callback(c: Cb) {
57-
if (!c || typeof c !== 'function') {
58-
throw new Error(
59-
strings.errors.registry.NESTED_RENDERER_CALLBACK_IS_NOT_VALID
60-
);
61-
}
62-
},
63-
componentParams(params: { componentName: string; callback: Cb }) {
64-
if (!params.componentName) {
65-
throw new Error(
66-
strings.errors.registry.NESTED_RENDERER_COMPONENT_NAME_IS_NOT_VALID
67-
);
68-
}
69-
70-
validate.callback(params.callback);
71-
},
72-
componentsParams(params: Params) {
73-
if (_.isEmpty(params.components)) {
74-
throw new Error(
75-
strings.errors.registry.NESTED_RENDERER_COMPONENTS_IS_NOT_VALID
76-
);
77-
}
15+
}
7816

79-
validate.callback(params.callback);
80-
}
81-
};
17+
export default function nestedRenderer(
18+
rendererWithCallback: (
19+
options: RendererOptions,
20+
cb: (result: GetComponentResult) => void
21+
) => void,
22+
conf: Config
23+
) {
24+
const renderer = (options: RendererOptions) =>
25+
new Promise<string>((res, rej) => {
26+
rendererWithCallback(options, result => {
27+
if (result.response.error) {
28+
rej(result.response.error);
29+
} else {
30+
res(result.response.html!);
31+
}
32+
});
33+
});
8234

83-
export default function nestedRenderer(renderer: any, conf: Config) {
8435
return {
8536
renderComponent(
8637
componentName: string,
87-
renderOptions: Options | Cb,
88-
callback?: Cb
89-
) {
90-
const p = sanitise.componentParams(
91-
componentName,
92-
renderOptions,
93-
callback
94-
);
95-
validate.componentParams(p);
38+
options: Options = {}
39+
): Promise<string> {
40+
if (!componentName) {
41+
throw new Error(
42+
strings.errors.registry.NESTED_RENDERER_COMPONENT_NAME_IS_NOT_VALID
43+
);
44+
}
9645

97-
return renderer(
98-
{
99-
conf: conf,
100-
headers: sanitise.headers(p.options.headers),
101-
name: componentName,
102-
parameters: p.options.parameters || {},
103-
version: p.options.version || ''
46+
return renderer({
47+
conf: conf,
48+
ip: options.ip || '',
49+
headers: {
50+
...options.headers,
51+
accept: settings.registry.acceptRenderedHeader
10452
},
105-
(result: any) => {
106-
if (result.response.error) {
107-
return p.callback(result.response.error, undefined as any);
108-
} else {
109-
return p.callback(null, result.response.html);
110-
}
111-
}
112-
);
53+
name: componentName,
54+
parameters: options.parameters || {},
55+
version: options.version || ''
56+
});
11357
},
11458
renderComponents(
11559
components: Options[],
116-
renderOptions: Options,
117-
callback: Cb
118-
) {
119-
const p = sanitise.componentsParams(components, renderOptions, callback);
120-
validate.componentsParams(p);
60+
options: Options = {}
61+
): Promise<Array<string | Error>> {
62+
if (!components || !components.length) {
63+
throw new Error(
64+
strings.errors.registry.NESTED_RENDERER_COMPONENTS_IS_NOT_VALID
65+
);
66+
}
12167

122-
async.map(
123-
p.components,
124-
(component, cb) => {
125-
renderer(
126-
{
127-
conf: conf,
128-
headers: sanitise.headers(p.options.headers),
129-
name: component.name,
130-
parameters: {
131-
...p.options.parameters,
132-
...component.parameters
133-
},
134-
version: component.version || ''
68+
return Promise.all(
69+
components.map(component => {
70+
return renderer({
71+
conf: conf,
72+
headers: {
73+
...options.headers,
74+
accept: settings.registry.acceptRenderedHeader
13575
},
136-
(result: any) => {
137-
const error = result.response.error;
138-
cb(null, error ? new Error(error) : result.response.html);
139-
}
140-
);
141-
},
142-
p.callback as any
76+
ip: component.ip || '',
77+
name: component.name!,
78+
parameters: {
79+
...options.parameters,
80+
...component.parameters
81+
},
82+
version: component.version || ''
83+
}).catch(err => new Error(err));
84+
})
14385
);
14486
}
14587
};

src/registry/routes/helpers/get-component.ts

Lines changed: 7 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,7 @@ import { Config, Repository } from '../../../types';
2222
import { IncomingHttpHeaders } from 'http';
2323
import { fromPromise } from 'universalify';
2424

25-
interface Options {
25+
export interface RendererOptions {
2626
conf: Config;
2727
headers: IncomingHttpHeaders;
2828
ip: string;
@@ -32,14 +32,15 @@ interface Options {
3232
omitHref?: boolean;
3333
}
3434

35-
export type GetComponentResult = {
35+
export interface GetComponentResult {
3636
status: number;
3737
headers?: Record<string, string>;
3838
response: {
3939
type?: string;
4040
code?: string;
4141
error?: unknown;
4242
version?: string;
43+
html?: string;
4344
requestVersion?: string;
4445
name?: string;
4546
details?: {
@@ -50,7 +51,7 @@ export type GetComponentResult = {
5051
missingPlugins?: string[];
5152
missingDependencies?: string[];
5253
};
53-
};
54+
}
5455

5556
export default function getComponent(conf: Config, repository: Repository) {
5657
const client = Client({ templates: conf.templates });
@@ -60,7 +61,7 @@ export default function getComponent(conf: Config, repository: Repository) {
6061
});
6162

6263
const renderer = function (
63-
options: Options,
64+
options: RendererOptions,
6465
cb: (result: GetComponentResult) => void
6566
) {
6667
const nestedRenderer = NestedRenderer(renderer, options.conf);
@@ -420,8 +421,8 @@ export default function getComponent(conf: Config, repository: Repository) {
420421
env: conf.env,
421422
params,
422423
plugins: conf.plugins,
423-
renderComponent: nestedRenderer.renderComponent,
424-
renderComponents: nestedRenderer.renderComponents,
424+
renderComponent: fromPromise(nestedRenderer.renderComponent),
425+
renderComponents: fromPromise(nestedRenderer.renderComponents),
425426
requestHeaders: options.headers,
426427
requestIp: options.ip,
427428
setEmptyResponse,

0 commit comments

Comments
 (0)