Use continuous module IDs for random access bundles

Reviewed By: bestander

Differential Revision: D3292980

fbshipit-source-id: ab5791d31add42a26cf55a0309564330c383eaa2
This commit is contained in:
David Aurelio 2016-05-12 17:13:12 -07:00 committed by Facebook Github Bot 5
parent 3f1cd5aa4e
commit b4e970f6c3
8 changed files with 93 additions and 63 deletions

View File

@ -12,7 +12,11 @@ const asIndexedFile = require('./as-indexed-file');
const asAssets = require('./as-assets'); const asAssets = require('./as-assets');
function buildBundle(packagerClient, requestOptions) { function buildBundle(packagerClient, requestOptions) {
return packagerClient.buildBundle({...requestOptions, unbundle: true}); return packagerClient.buildBundle({
...requestOptions,
unbundle: true,
isolateModuleIDs: true,
});
} }
function saveUnbundle(bundle, options, log) { function saveUnbundle(bundle, options, log) {

View File

@ -1,5 +1,5 @@
{ {
"version": "0.3.1", "version": "0.3.2",
"name": "react-native-packager", "name": "react-native-packager",
"description": "Build native apps with React!", "description": "Build native apps with React!",
"repository": { "repository": {

View File

@ -128,6 +128,7 @@ describe('Bundler', function() {
mainModuleId: 'foo', mainModuleId: 'foo',
dependencies: modules, dependencies: modules,
transformOptions, transformOptions,
getModuleId: () => 123,
}) })
); );
@ -207,7 +208,8 @@ describe('Bundler', function() {
pit('gets the list of dependencies from the resolver', function() { pit('gets the list of dependencies from the resolver', function() {
const entryFile = '/root/foo.js'; const entryFile = '/root/foo.js';
return bundler.getDependencies({entryFile, recursive: true}).then(() => return bundler.getDependencies({entryFile, recursive: true}).then(() =>
expect(getDependencies).toBeCalledWith( // jest calledWith does not support jasmine.any
expect(getDependencies.mock.calls[0].slice(0, -2)).toEqual([
'/root/foo.js', '/root/foo.js',
{ dev: true, recursive: true }, { dev: true, recursive: true },
{ minify: false, { minify: false,
@ -219,8 +221,7 @@ describe('Bundler', function() {
projectRoots, projectRoots,
} }
}, },
undefined, ])
)
); );
}); });

View File

@ -141,7 +141,6 @@ class Bundler {
fileWatcher: opts.fileWatcher, fileWatcher: opts.fileWatcher,
assetExts: opts.assetExts, assetExts: opts.assetExts,
cache: this._cache, cache: this._cache,
getModuleId: this._getModuleId,
transformCode: transformCode:
(module, code, options) => (module, code, options) =>
this._transformer.transformFile(module.path, code, options), this._transformer.transformFile(module.path, code, options),
@ -169,9 +168,9 @@ class Bundler {
const moduleSystemDeps = const moduleSystemDeps =
this._resolver.getModuleSystemDependencies({dev, unbundle}); this._resolver.getModuleSystemDependencies({dev, unbundle});
return this._bundle({ return this._bundle({
...options,
bundle: new Bundle({dev, minify, sourceMapUrl: options.sourceMapUrl}), bundle: new Bundle({dev, minify, sourceMapUrl: options.sourceMapUrl}),
moduleSystemDeps, moduleSystemDeps,
...options,
}); });
} }
@ -247,9 +246,10 @@ class Bundler {
unbundle, unbundle,
entryModuleOnly, entryModuleOnly,
resolutionResponse, resolutionResponse,
isolateModuleIDs,
}) { }) {
const onResolutionResponse = response => { const onResolutionResponse = response => {
bundle.setMainModuleId(this._getModuleId(getMainModule(response))); bundle.setMainModuleId(response.getModuleId(getMainModule(response)));
if (bundle.setNumPrependedModules) { if (bundle.setNumPrependedModules) {
bundle.setNumPrependedModules( bundle.setNumPrependedModules(
response.numPrependedDependencies + moduleSystemDeps.length response.numPrependedDependencies + moduleSystemDeps.length
@ -273,7 +273,7 @@ class Bundler {
? runBeforeMainModule ? runBeforeMainModule
.map(name => modulesByName[name]) .map(name => modulesByName[name])
.filter(Boolean) .filter(Boolean)
.map(this._getModuleId, this) .map(response.getModuleId)
: undefined; : undefined;
bundle.finalize({ bundle.finalize({
@ -294,6 +294,7 @@ class Bundler {
resolutionResponse, resolutionResponse,
onResolutionResponse, onResolutionResponse,
finalizeBundle, finalizeBundle,
isolateModuleIDs,
}); });
} }
@ -344,6 +345,7 @@ class Bundler {
hot, hot,
unbundle, unbundle,
resolutionResponse, resolutionResponse,
isolateModuleIDs,
onResolutionResponse = noop, onResolutionResponse = noop,
onModuleTransformed = noop, onModuleTransformed = noop,
finalizeBundle = noop, finalizeBundle = noop,
@ -371,6 +373,7 @@ class Bundler {
hot, hot,
onProgress, onProgress,
minify, minify,
isolateModuleIDs,
generateSourceMaps: unbundle, generateSourceMaps: unbundle,
}); });
} }
@ -398,6 +401,7 @@ class Bundler {
bundle, bundle,
entryFilePath, entryFilePath,
transformOptions: response.transformOptions, transformOptions: response.transformOptions,
getModuleId: response.getModuleId,
}).then(transformed => { }).then(transformed => {
modulesByName[transformed.name] = module; modulesByName[transformed.name] = module;
onModuleTransformed({ onModuleTransformed({
@ -467,6 +471,7 @@ class Bundler {
hot = false, hot = false,
recursive = true, recursive = true,
generateSourceMaps = false, generateSourceMaps = false,
isolateModuleIDs = false,
onProgress, onProgress,
}) { }) {
return this.getTransformOptions( return this.getTransformOptions(
@ -491,6 +496,7 @@ class Bundler {
{dev, platform, recursive}, {dev, platform, recursive},
transformOptions, transformOptions,
onProgress, onProgress,
isolateModuleIDs ? createModuleIdFactory() : this._getModuleId,
); );
}); });
} }
@ -527,13 +533,14 @@ class Bundler {
); );
} }
_toModuleTransport({module, bundle, entryFilePath, transformOptions}) { _toModuleTransport({module, bundle, entryFilePath, transformOptions, getModuleId}) {
let moduleTransport; let moduleTransport;
if (module.isAsset_DEPRECATED()) { if (module.isAsset_DEPRECATED()) {
moduleTransport = this._generateAssetModule_DEPRECATED(bundle, module); moduleTransport =
this._generateAssetModule_DEPRECATED(bundle, module, getModuleId);
} else if (module.isAsset()) { } else if (module.isAsset()) {
moduleTransport = this._generateAssetModule( moduleTransport = this._generateAssetModule(
bundle, module, transformOptions.platform); bundle, module, getModuleId, transformOptions.platform);
} }
if (moduleTransport) { if (moduleTransport) {
@ -554,7 +561,7 @@ class Bundler {
return new ModuleTransport({ return new ModuleTransport({
name, name,
id: this._getModuleId(module), id: getModuleId(module),
code, code,
map, map,
meta: {dependencies, dependencyOffsets, preloaded}, meta: {dependencies, dependencyOffsets, preloaded},
@ -568,7 +575,7 @@ class Bundler {
return this._resolver.getDebugInfo(); return this._resolver.getDebugInfo();
} }
_generateAssetModule_DEPRECATED(bundle, module) { _generateAssetModule_DEPRECATED(bundle, module, getModuleId) {
return Promise.all([ return Promise.all([
sizeOf(module.path), sizeOf(module.path),
module.getName(), module.getName(),
@ -588,7 +595,7 @@ class Bundler {
return new ModuleTransport({ return new ModuleTransport({
name: id, name: id,
id: this._getModuleId(module), id: getModuleId(module),
code: code, code: code,
sourceCode: code, sourceCode: code,
sourcePath: module.path, sourcePath: module.path,
@ -647,7 +654,7 @@ class Bundler {
} }
_generateAssetModule(bundle, module, platform = null) { _generateAssetModule(bundle, module, getModuleId, platform = null) {
return Promise.all([ return Promise.all([
module.getName(), module.getName(),
this._generateAssetObjAndCode(module, platform), this._generateAssetObjAndCode(module, platform),
@ -655,7 +662,7 @@ class Bundler {
bundle.addAsset(asset); bundle.addAsset(asset);
return new ModuleTransport({ return new ModuleTransport({
name, name,
id: this._getModuleId(module), id: getModuleId(module),
code, code,
meta: meta, meta: meta,
sourceCode: code, sourceCode: code,

View File

@ -50,6 +50,7 @@ describe('Resolver', function() {
constructor({dependencies, mainModuleId}) { constructor({dependencies, mainModuleId}) {
this.dependencies = dependencies; this.dependencies = dependencies;
this.mainModuleId = mainModuleId; this.mainModuleId = mainModuleId;
this.getModuleId = createGetModuleId();
} }
prependDependency(dependency) { prependDependency(dependency) {
@ -95,7 +96,7 @@ describe('Resolver', function() {
DependencyGraph.prototype.getDependencies.mockImplementation( DependencyGraph.prototype.getDependencies.mockImplementation(
() => Promise.reject()); () => Promise.reject());
new Resolver({projectRoot: '/root', }) new Resolver({projectRoot: '/root'})
.getDependencies(entry, {platform}, transformOptions); .getDependencies(entry, {platform}, transformOptions);
expect(DependencyGraph.prototype.getDependencies).toBeCalledWith({ expect(DependencyGraph.prototype.getDependencies).toBeCalledWith({
entryPath: entry, entryPath: entry,
@ -110,7 +111,6 @@ describe('Resolver', function() {
var deps = [module]; var deps = [module];
var depResolver = new Resolver({ var depResolver = new Resolver({
getModuleId: createGetModuleId(),
projectRoot: '/root', projectRoot: '/root',
}); });
@ -121,8 +121,14 @@ describe('Resolver', function() {
})); }));
}); });
return depResolver.getDependencies('/root/index.js', { dev: false }) return depResolver
.then(function(result) { .getDependencies(
'/root/index.js',
{ dev: false },
undefined,
undefined,
createGetModuleId()
).then(function(result) {
expect(result.mainModuleId).toEqual('index'); expect(result.mainModuleId).toEqual('index');
expect(result.dependencies[result.dependencies.length - 1]).toBe(module); expect(result.dependencies[result.dependencies.length - 1]).toBe(module);
expect(DependencyGraph.prototype.createPolyfill.mock.calls.map((call) => call[0])).toEqual([ expect(DependencyGraph.prototype.createPolyfill.mock.calls.map((call) => call[0])).toEqual([
@ -227,8 +233,14 @@ describe('Resolver', function() {
const polyfill = {}; const polyfill = {};
DependencyGraph.prototype.createPolyfill.mockReturnValueOnce(polyfill); DependencyGraph.prototype.createPolyfill.mockReturnValueOnce(polyfill);
return depResolver.getDependencies('/root/index.js', { dev: true }) return depResolver
.then(function(result) { .getDependencies(
'/root/index.js',
{ dev: true },
undefined,
undefined,
createGetModuleId()
).then(function(result) {
expect(result.mainModuleId).toEqual('index'); expect(result.mainModuleId).toEqual('index');
expect(DependencyGraph.mock.instances[0].getDependencies) expect(DependencyGraph.mock.instances[0].getDependencies)
.toBeCalledWith({entryPath: '/root/index.js', recursive: true}); .toBeCalledWith({entryPath: '/root/index.js', recursive: true});
@ -254,8 +266,14 @@ describe('Resolver', function() {
})); }));
}); });
return depResolver.getDependencies('/root/index.js', { dev: false }) return depResolver
.then((result) => { .getDependencies(
'/root/index.js',
{ dev: false },
undefined,
undefined,
createGetModuleId()
).then((result) => {
expect(result.mainModuleId).toEqual('index'); expect(result.mainModuleId).toEqual('index');
expect(DependencyGraph.prototype.createPolyfill.mock.calls[result.dependencies.length - 2]).toEqual([ expect(DependencyGraph.prototype.createPolyfill.mock.calls[result.dependencies.length - 2]).toEqual([
{ file: 'some module', { file: 'some module',
@ -278,12 +296,10 @@ describe('Resolver', function() {
}); });
describe('wrapModule', function() { describe('wrapModule', function() {
let depResolver, getModuleId; let depResolver;
beforeEach(() => { beforeEach(() => {
getModuleId = createGetModuleId();
depResolver = new Resolver({ depResolver = new Resolver({
depResolver, depResolver,
getModuleId,
projectRoot: '/root', projectRoot: '/root',
}); });
}); });
@ -325,7 +341,8 @@ describe('Resolver', function() {
const moduleIds = new Map( const moduleIds = new Map(
resolutionResponse resolutionResponse
.getResolvedDependencyPairs() .getResolvedDependencyPairs()
.map(([importId, module]) => [importId, getModuleId(module)]) .map(([importId, module]) =>
[importId, resolutionResponse.getModuleId(module)])
); );
return depResolver.wrapModule({ return depResolver.wrapModule({
@ -337,7 +354,7 @@ describe('Resolver', function() {
dev: false, dev: false,
}).then(({code: processedCode}) => { }).then(({code: processedCode}) => {
expect(processedCode).toEqual([ expect(processedCode).toEqual([
`__d(${getModuleId(module)} /* test module */, function(global, require, module, exports) {` + `__d(${resolutionResponse.getModuleId(module)} /* test module */, function(global, require, module, exports) {` +
// require // require
`require(${moduleIds.get('x')} /* x */)`, `require(${moduleIds.get('x')} /* x */)`,
`require(${moduleIds.get('y')} /* y */)`, `require(${moduleIds.get('y')} /* y */)`,
@ -364,7 +381,7 @@ describe('Resolver', function() {
dev: true, dev: true,
}).then(({code: processedCode}) => }).then(({code: processedCode}) =>
expect(processedCode).toEqual([ expect(processedCode).toEqual([
`__d(${getModuleId(module)} /* test module */, function(global, require, module, exports) {` + `__d(${resolutionResponse.getModuleId(module)} /* test module */, function(global, require, module, exports) {` +
code, code,
'}, "test module");' '}, "test module");'
].join('\n')) ].join('\n'))
@ -413,7 +430,7 @@ describe('Resolver', function() {
let depResolver, module, resolutionResponse; let depResolver, module, resolutionResponse;
beforeEach(() => { beforeEach(() => {
depResolver = new Resolver({getModuleId, projectRoot: '/root'}); depResolver = new Resolver({projectRoot: '/root'});
module = createJsonModule(id); module = createJsonModule(id);
resolutionResponse = new ResolutionResponseMock({ resolutionResponse = new ResolutionResponseMock({
dependencies: [module], dependencies: [module],
@ -426,7 +443,7 @@ describe('Resolver', function() {
.wrapModule({resolutionResponse, module, name: id, code, dev: false}) .wrapModule({resolutionResponse, module, name: id, code, dev: false})
.then(({code: processedCode}) => .then(({code: processedCode}) =>
expect(processedCode).toEqual([ expect(processedCode).toEqual([
`__d(${getModuleId(module)} /* ${id} */, function(global, require, module, exports) {`, `__d(${resolutionResponse.getModuleId(module)} /* ${id} */, function(global, require, module, exports) {`,
`module.exports = ${code}\n});`, `module.exports = ${code}\n});`,
].join(''))); ].join('')));
}); });
@ -442,7 +459,6 @@ describe('Resolver', function() {
Promise.resolve({code, map})); Promise.resolve({code, map}));
depResolver = new Resolver({ depResolver = new Resolver({
projectRoot: '/root', projectRoot: '/root',
getModuleId,
minifyCode, minifyCode,
}); });
module = createModule(id); module = createModule(id);
@ -455,7 +471,7 @@ describe('Resolver', function() {
}); });
pit('should invoke the minifier with the wrapped code', () => { pit('should invoke the minifier with the wrapped code', () => {
const wrappedCode = `__d(${getModuleId(module)} /* ${id} */, function(global, require, module, exports) {${code}\n});` const wrappedCode = `__d(${resolutionResponse.getModuleId(module)} /* ${id} */, function(global, require, module, exports) {${code}\n});`
return depResolver return depResolver
.wrapModule({ .wrapModule({
resolutionResponse, resolutionResponse,

View File

@ -47,10 +47,6 @@ const validateOpts = declareOpts({
type: 'object', type: 'object',
required: true, required: true,
}, },
getModuleId: {
type: 'function',
required: true,
},
transformCode: { transformCode: {
type: 'function', type: 'function',
}, },
@ -115,7 +111,6 @@ class Resolver {
assetDependencies: ['react-native/Libraries/Image/AssetRegistry'], assetDependencies: ['react-native/Libraries/Image/AssetRegistry'],
}); });
this._getModuleId = options.getModuleId;
this._minifyCode = opts.minifyCode; this._minifyCode = opts.minifyCode;
this._polyfillModuleNames = opts.polyfillModuleNames || []; this._polyfillModuleNames = opts.polyfillModuleNames || [];
@ -137,7 +132,7 @@ class Resolver {
return this._depGraph.getModuleForPath(entryFile); return this._depGraph.getModuleForPath(entryFile);
} }
getDependencies(entryPath, options, transformOptions, onProgress) { getDependencies(entryPath, options, transformOptions, onProgress, getModuleId) {
const {platform, recursive} = getDependenciesValidateOpts(options); const {platform, recursive} = getDependenciesValidateOpts(options);
return this._depGraph.getDependencies({ return this._depGraph.getDependencies({
entryPath, entryPath,
@ -150,8 +145,7 @@ class Resolver {
polyfill => resolutionResponse.prependDependency(polyfill) polyfill => resolutionResponse.prependDependency(polyfill)
); );
// currently used by HMR resolutionResponse.getModuleId = getModuleId;
resolutionResponse.getModuleId = this._getModuleId;
return resolutionResponse.finalize(); return resolutionResponse.finalize();
}); });
} }
@ -205,7 +199,7 @@ class Resolver {
resolutionResponse.getResolvedDependencyPairs(module) resolutionResponse.getResolvedDependencyPairs(module)
.forEach(([depName, depModule]) => { .forEach(([depName, depModule]) => {
if (depModule) { if (depModule) {
resolvedDeps[depName] = this._getModuleId(depModule); resolvedDeps[depName] = resolutionResponse.getModuleId(depModule);
} }
}); });
@ -251,7 +245,7 @@ class Resolver {
if (module.isPolyfill()) { if (module.isPolyfill()) {
code = definePolyfillCode(code); code = definePolyfillCode(code);
} else { } else {
const moduleId = this._getModuleId(module); const moduleId = resolutionResponse.getModuleId(module);
code = this.resolveRequires( code = this.resolveRequires(
resolutionResponse, resolutionResponse,
module, module,

View File

@ -22,14 +22,14 @@ jest.setMock('worker-farm', function() { return () => {}; })
const Promise = require('promise'); const Promise = require('promise');
var Bundler = require('../../Bundler'); const Bundler = require('../../Bundler');
var Server = require('../'); const Server = require('../');
var AssetServer = require('../../AssetServer'); const AssetServer = require('../../AssetServer');
var FileWatcher; let FileWatcher;
describe('processRequest', () => { describe('processRequest', () => {
var server; let server;
const options = { const options = {
projectRoots: ['root'], projectRoots: ['root'],
@ -56,8 +56,8 @@ describe('processRequest', () => {
const invalidatorFunc = jest.fn(); const invalidatorFunc = jest.fn();
const watcherFunc = jest.fn(); const watcherFunc = jest.fn();
var requestHandler; let requestHandler;
var triggerFileChange; let triggerFileChange;
beforeEach(() => { beforeEach(() => {
FileWatcher = require('node-haste').FileWatcher; FileWatcher = require('node-haste').FileWatcher;
@ -135,7 +135,7 @@ describe('processRequest', () => {
requestHandler, requestHandler,
'index.ios.includeRequire.bundle' 'index.ios.includeRequire.bundle'
).then(response => { ).then(response => {
expect(response.body).toEqual('this is the source'); expect(response.body).toEqual('this is the source')
expect(Bundler.prototype.bundle).toBeCalledWith({ expect(Bundler.prototype.bundle).toBeCalledWith({
entryFile: 'index.ios.js', entryFile: 'index.ios.js',
inlineSourceMap: false, inlineSourceMap: false,
@ -148,6 +148,7 @@ describe('processRequest', () => {
runBeforeMainModule: ['InitializeJavaScriptAppEngine'], runBeforeMainModule: ['InitializeJavaScriptAppEngine'],
unbundle: false, unbundle: false,
entryModuleOnly: false, entryModuleOnly: false,
isolateModuleIDs: false,
}); });
}); });
}); });
@ -170,6 +171,7 @@ describe('processRequest', () => {
runBeforeMainModule: ['InitializeJavaScriptAppEngine'], runBeforeMainModule: ['InitializeJavaScriptAppEngine'],
unbundle: false, unbundle: false,
entryModuleOnly: false, entryModuleOnly: false,
isolateModuleIDs: false,
}); });
}); });
}); });
@ -291,9 +293,9 @@ describe('processRequest', () => {
}); });
describe('/onchange endpoint', () => { describe('/onchange endpoint', () => {
var EventEmitter; let EventEmitter;
var req; let req;
var res; let res;
beforeEach(() => { beforeEach(() => {
EventEmitter = require.requireActual('events').EventEmitter; EventEmitter = require.requireActual('events').EventEmitter;
@ -363,6 +365,7 @@ describe('processRequest', () => {
runBeforeMainModule: ['InitializeJavaScriptAppEngine'], runBeforeMainModule: ['InitializeJavaScriptAppEngine'],
unbundle: false, unbundle: false,
entryModuleOnly: false, entryModuleOnly: false,
isolateModuleIDs: false,
}) })
); );
}); });
@ -384,6 +387,7 @@ describe('processRequest', () => {
runBeforeMainModule: ['InitializeJavaScriptAppEngine'], runBeforeMainModule: ['InitializeJavaScriptAppEngine'],
unbundle: false, unbundle: false,
entryModuleOnly: false, entryModuleOnly: false,
isolateModuleIDs: false,
}) })
); );
}); });

View File

@ -131,6 +131,10 @@ const bundleOpts = declareOpts({
type: 'boolean', type: 'boolean',
default: false, default: false,
}, },
isolateModuleIDs: {
type: 'boolean',
default: false
}
}); });
const dependencyOpts = declareOpts({ const dependencyOpts = declareOpts({
@ -167,7 +171,7 @@ class Server {
const assetGlobs = opts.assetExts.map(ext => '**/*.' + ext); const assetGlobs = opts.assetExts.map(ext => '**/*.' + ext);
var watchRootConfigs = opts.projectRoots.map(dir => { let watchRootConfigs = opts.projectRoots.map(dir => {
return { return {
dir: dir, dir: dir,
globs: [ globs: [
@ -338,7 +342,7 @@ class Server {
} }
_processDebugRequest(reqUrl, res) { _processDebugRequest(reqUrl, res) {
var ret = '<!doctype html>'; let ret = '<!doctype html>';
const pathname = url.parse(reqUrl).pathname; const pathname = url.parse(reqUrl).pathname;
const parts = pathname.split('/').filter(Boolean); const parts = pathname.split('/').filter(Boolean);
if (parts.length === 1) { if (parts.length === 1) {
@ -406,9 +410,9 @@ class Server {
processRequest(req, res, next) { processRequest(req, res, next) {
const urlObj = url.parse(req.url, true); const urlObj = url.parse(req.url, true);
var pathname = urlObj.pathname; const pathname = urlObj.pathname;
var requestType; let requestType;
if (pathname.match(/\.bundle$/)) { if (pathname.match(/\.bundle$/)) {
requestType = 'bundle'; requestType = 'bundle';
} else if (pathname.match(/\.map$/)) { } else if (pathname.match(/\.map$/)) {
@ -438,7 +442,7 @@ class Server {
building.then( building.then(
p => { p => {
if (requestType === 'bundle') { if (requestType === 'bundle') {
var bundleSource = p.getSource({ const bundleSource = p.getSource({
inlineSourceMap: options.inlineSourceMap, inlineSourceMap: options.inlineSourceMap,
minify: options.minify, minify: options.minify,
dev: options.dev, dev: options.dev,
@ -453,7 +457,7 @@ class Server {
} }
Activity.endEvent(startReqEventId); Activity.endEvent(startReqEventId);
} else if (requestType === 'map') { } else if (requestType === 'map') {
var sourceMap = p.getSourceMap({ let sourceMap = p.getSourceMap({
minify: options.minify, minify: options.minify,
dev: options.dev, dev: options.dev,
}); });
@ -466,7 +470,7 @@ class Server {
res.end(sourceMap); res.end(sourceMap);
Activity.endEvent(startReqEventId); Activity.endEvent(startReqEventId);
} else if (requestType === 'assets') { } else if (requestType === 'assets') {
var assetsList = JSON.stringify(p.getAssets()); const assetsList = JSON.stringify(p.getAssets());
res.setHeader('Content-Type', 'application/json'); res.setHeader('Content-Type', 'application/json');
res.end(assetsList); res.end(assetsList);
Activity.endEvent(startReqEventId); Activity.endEvent(startReqEventId);