From 7e100ac7a225bd5f03dc97a828f414b9f862e1ff Mon Sep 17 00:00:00 2001 From: Alex Kotliarskyi Date: Wed, 1 Jun 2016 13:50:30 -0700 Subject: [PATCH] Extract getDevServerURL into reusable module Summary: Many RN devtools (inspector, source maps, etc.) rely on packager. This refactors individual SourceCode.scriptURL parsing into one function that will be easier to change in the future. Reviewed By: javache Differential Revision: D3348465 fbshipit-source-id: 5a55939ea59e1517cb63bcbe4963f57f02ab15f3 --- Libraries/Inspector/ElementProperties.js | 7 +--- .../Initialization/ExceptionsManager.js | 11 +++-- .../Initialization/getDevServer.js | 40 +++++++++++++++++++ 3 files changed, 49 insertions(+), 9 deletions(-) create mode 100644 Libraries/JavaScriptAppEngine/Initialization/getDevServer.js diff --git a/Libraries/Inspector/ElementProperties.js b/Libraries/Inspector/ElementProperties.js index c0b11a388..f7698cdef 100644 --- a/Libraries/Inspector/ElementProperties.js +++ b/Libraries/Inspector/ElementProperties.js @@ -20,11 +20,11 @@ var Text = require('Text'); var TouchableHighlight = require('TouchableHighlight'); var TouchableWithoutFeedback = require('TouchableWithoutFeedback'); var View = require('View'); -var {SourceCode} = require('NativeModules'); var {fetch} = require('fetch'); var flattenStyle = require('flattenStyle'); var mapWithSeparator = require('mapWithSeparator'); +var getDevServer = require('getDevServer'); var ElementProperties = React.createClass({ propTypes: { @@ -97,10 +97,7 @@ var ElementProperties = React.createClass({ }, _openFile: function(fileName: string, lineNumber: number) { - var match = SourceCode.scriptURL && SourceCode.scriptURL.match(/^https?:\/\/.*?\//); - var baseURL = match ? match[0] : 'http://localhost:8081/'; - - fetch(baseURL + 'open-stack-frame', { + fetch(getDevServer().url + 'open-stack-frame', { method: 'POST', body: JSON.stringify({file: fileName, lineNumber}), }); diff --git a/Libraries/JavaScriptAppEngine/Initialization/ExceptionsManager.js b/Libraries/JavaScriptAppEngine/Initialization/ExceptionsManager.js index 19d651336..42c8e9d1d 100644 --- a/Libraries/JavaScriptAppEngine/Initialization/ExceptionsManager.js +++ b/Libraries/JavaScriptAppEngine/Initialization/ExceptionsManager.js @@ -35,12 +35,15 @@ function reportException(e: Error, isFatal: bool) { } function symbolicateAndUpdateStack(id, message, stack) { + const getDevServer = require('getDevServer'); const {fetch} = require('fetch'); - const {SourceCode, ExceptionsManager} = require('NativeModules'); - const match = SourceCode.scriptURL && SourceCode.scriptURL.match(/^https?:\/\/.*?\//); - const endpoint = (match && match[0] : 'http://localhost:8081/') + 'symbolicate'; + const {ExceptionsManager} = require('NativeModules'); + const devServer = getDevServer(); + if (!devServer.bundleLoadedFromServer) { + return; + } - fetch(endpoint, { method: 'POST', body: JSON.stringify({stack}) }) + fetch(devServer.url + 'symbolicate', { method: 'POST', body: JSON.stringify({stack}) }) .then(response => response.json()) .then(response => ExceptionsManager.updateExceptionMessage(message, response.stack, id)) diff --git a/Libraries/JavaScriptAppEngine/Initialization/getDevServer.js b/Libraries/JavaScriptAppEngine/Initialization/getDevServer.js new file mode 100644 index 000000000..b733c2f5c --- /dev/null +++ b/Libraries/JavaScriptAppEngine/Initialization/getDevServer.js @@ -0,0 +1,40 @@ +/** + * Copyright (c) 2015-present, Facebook, Inc. + * All rights reserved. + * + * This source code is licensed under the BSD-style license found in the + * LICENSE file in the root directory of this source tree. An additional grant + * of patent rights can be found in the PATENTS file in the same directory. + * + * @providesModule getDevServer + * @flow + */ +'use strict'; + +const {SourceCode} = require('NativeModules'); + +let _cachedDevServerURL: ?string; +const FALLBACK = 'http://localhost:8081/'; + +type DevServerInfo = { + url: string; + bundleLoadedFromServer: boolean; +}; + +/** + * Many RN development tools rely on the development server (packager) running + * @return URL to packager with trailing slash + */ +function getDevServer(): DevServerInfo { + if (_cachedDevServerURL === undefined) { + const match = SourceCode.scriptURL && SourceCode.scriptURL.match(/^https?:\/\/.*?\//); + _cachedDevServerURL = match ? match[0] : null; + } + + return { + url: _cachedDevServerURL || FALLBACK, + bundleLoadedFromServer: _cachedDevServerURL !== null, + }; +} + +module.exports = getDevServer;