chore: restore lazy load requires in http module (#7052)

This commit is contained in:
Manol Donev
2019-03-22 11:14:37 +02:00
committed by GitHub
parent 31f5554d6d
commit 32646be19c
2 changed files with 73 additions and 34 deletions

View File

@ -1,14 +1,10 @@
/** // imported for definition purposes only
* Android specific http request implementation. import * as httpModule from "../../http";
*/ import * as imageSourceModule from "../../image-source";
import { fromNativeSource } from "../../image-source"; import * as platformModule from "../../platform";
import { screen } from "../../platform"; import * as fsModule from "../../file-system";
import { File } from "../../file-system";
import { getFilenameFromUrl } from "./http-request-common"; import { getFilenameFromUrl } from "./http-request-common";
// this is imported for definition purposes only
import * as http from "../../http";
import { NetworkAgent } from "../../debugger/debugger"; import { NetworkAgent } from "../../debugger/debugger";
export enum HttpResponseEncoding { export enum HttpResponseEncoding {
@ -28,6 +24,27 @@ function parseJSON(source: string): any {
let requestIdCounter = 0; let requestIdCounter = 0;
const pendingRequests = {}; const pendingRequests = {};
let imageSource: typeof imageSourceModule;
function ensureImageSource() {
if (!imageSource) {
imageSource = require("image-source");
}
}
let platform: typeof platformModule;
function ensurePlatform() {
if (!platform) {
platform = require("platform");
}
}
let fs: typeof fsModule;
function ensureFileSystem() {
if (!fs) {
fs = require("file-system");
}
}
let completeCallback: org.nativescript.widgets.Async.CompleteCallback; let completeCallback: org.nativescript.widgets.Async.CompleteCallback;
function ensureCompleteCallback() { function ensureCompleteCallback() {
if (completeCallback) { if (completeCallback) {
@ -55,7 +72,7 @@ function onRequestComplete(requestId: number, result: org.nativescript.widgets.A
} }
// read the headers // read the headers
const headers: http.Headers = {}; const headers: httpModule.Headers = {};
if (result.headers) { if (result.headers) {
const jHeaders = result.headers; const jHeaders = result.headers;
const length = jHeaders.size(); const length = jHeaders.size();
@ -97,9 +114,11 @@ function onRequestComplete(requestId: number, result: org.nativescript.widgets.A
return parseJSON(str); return parseJSON(str);
}, },
toImage: () => { toImage: () => {
ensureImageSource();
return new Promise<any>((resolveImage, rejectImage) => { return new Promise<any>((resolveImage, rejectImage) => {
if (result.responseAsImage != null) { if (result.responseAsImage != null) {
resolveImage(fromNativeSource(result.responseAsImage)); resolveImage(imageSource.fromNativeSource(result.responseAsImage));
} }
else { else {
rejectImage(new Error("Response content may not be converted to an Image")); rejectImage(new Error("Response content may not be converted to an Image"));
@ -107,13 +126,15 @@ function onRequestComplete(requestId: number, result: org.nativescript.widgets.A
}); });
}, },
toFile: (destinationFilePath: string) => { toFile: (destinationFilePath: string) => {
ensureFileSystem();
if (!destinationFilePath) { if (!destinationFilePath) {
destinationFilePath = getFilenameFromUrl(callbacks.url); destinationFilePath = getFilenameFromUrl(callbacks.url);
} }
let stream: java.io.FileOutputStream; let stream: java.io.FileOutputStream;
try { try {
// ensure destination path exists by creating any missing parent directories // ensure destination path exists by creating any missing parent directories
const file = File.fromPath(destinationFilePath); const file = fs.File.fromPath(destinationFilePath);
const javaFile = new java.io.File(destinationFilePath); const javaFile = new java.io.File(destinationFilePath);
stream = new java.io.FileOutputStream(javaFile); stream = new java.io.FileOutputStream(javaFile);
@ -144,7 +165,7 @@ function onRequestError(error: string, requestId: number) {
} }
} }
function buildJavaOptions(options: http.HttpRequestOptions) { function buildJavaOptions(options: httpModule.HttpRequestOptions) {
if (typeof options.url !== "string") { if (typeof options.url !== "string") {
throw new Error("Http request must provide a valid url."); throw new Error("Http request must provide a valid url.");
} }
@ -177,20 +198,23 @@ function buildJavaOptions(options: http.HttpRequestOptions) {
javaOptions.headers = arrayList; javaOptions.headers = arrayList;
} }
ensurePlatform();
// pass the maximum available image size to the request options in case we need a bitmap conversion // pass the maximum available image size to the request options in case we need a bitmap conversion
javaOptions.screenWidth = screen.mainScreen.widthPixels; const screen = platform.screen.mainScreen;
javaOptions.screenHeight = screen.mainScreen.heightPixels; javaOptions.screenWidth = screen.widthPixels;
javaOptions.screenHeight = screen.heightPixels;
return javaOptions; return javaOptions;
} }
export function request(options: http.HttpRequestOptions): Promise<http.HttpResponse> { export function request(options: httpModule.HttpRequestOptions): Promise<httpModule.HttpResponse> {
if (options === undefined || options === null) { if (options === undefined || options === null) {
// TODO: Shouldn't we throw an error here - defensive programming // TODO: Shouldn't we throw an error here - defensive programming
return; return;
} }
return new Promise<http.HttpResponse>((resolve, reject) => { return new Promise<httpModule.HttpResponse>((resolve, reject) => {
try { try {
// initialize the options // initialize the options
const javaOptions = buildJavaOptions(options); const javaOptions = buildJavaOptions(options);
@ -228,7 +252,7 @@ function decodeResponse(raw: any, encoding?: HttpResponseEncoding) {
return raw.toString(charsetName) return raw.toString(charsetName)
} }
export function addHeader(headers: http.Headers, key: string, value: string): void { export function addHeader(headers: httpModule.Headers, key: string, value: string): void {
if (!headers[key]) { if (!headers[key]) {
headers[key] = value; headers[key] = value;
} else if (Array.isArray(headers[key])) { } else if (Array.isArray(headers[key])) {

View File

@ -1,18 +1,15 @@
/** // imported for definition purposes only
* iOS specific http request implementation. import * as httpModule from "../../http";
*/ import * as imageSourceModule from "../../image-source";
import * as fsModule from "../../file-system";
import { HttpRequestOptions, HttpResponse, Headers } from "../../http";
import * as types from "../../utils/types"; import * as types from "../../utils/types";
import { fromNativeSource } from "../../image-source";
import { File } from "../../file-system";
import * as utils from "../../utils/utils"; import * as utils from "../../utils/utils";
import getter = utils.ios.getter;
import * as domainDebugger from "../../debugger/debugger"; import * as domainDebugger from "../../debugger/debugger";
import { getFilenameFromUrl } from "./http-request-common"; import { getFilenameFromUrl } from "./http-request-common";
const getter = utils.ios.getter;
export enum HttpResponseEncoding { export enum HttpResponseEncoding {
UTF8, UTF8,
GBK GBK
@ -59,8 +56,22 @@ function ensureSessionNotFollowingRedirects() {
} }
} }
export function request(options: HttpRequestOptions): Promise<HttpResponse> { let imageSource: typeof imageSourceModule;
return new Promise<HttpResponse>((resolve, reject) => { function ensureImageSource() {
if (!imageSource) {
imageSource = require("image-source");
}
}
let fs: typeof fsModule;
function ensureFileSystem() {
if (!fs) {
fs = require("file-system");
}
}
export function request(options: httpModule.HttpRequestOptions): Promise<httpModule.HttpResponse> {
return new Promise<httpModule.HttpResponse>((resolve, reject) => {
if (!options.url) { if (!options.url) {
reject(new Error("Request url was empty.")); reject(new Error("Request url was empty."));
@ -106,7 +117,7 @@ export function request(options: HttpRequestOptions): Promise<HttpResponse> {
if (error) { if (error) {
reject(new Error(error.localizedDescription)); reject(new Error(error.localizedDescription));
} else { } else {
const headers: Headers = {}; const headers: httpModule.Headers = {};
if (response && response.allHeaderFields) { if (response && response.allHeaderFields) {
const headerFields = response.allHeaderFields; const headerFields = response.allHeaderFields;
@ -136,10 +147,12 @@ export function request(options: HttpRequestOptions): Promise<HttpResponse> {
toString: (encoding?: any) => NSDataToString(data, encoding), toString: (encoding?: any) => NSDataToString(data, encoding),
toJSON: (encoding?: any) => parseJSON(NSDataToString(data, encoding)), toJSON: (encoding?: any) => parseJSON(NSDataToString(data, encoding)),
toImage: () => { toImage: () => {
ensureImageSource();
return new Promise((resolve, reject) => { return new Promise((resolve, reject) => {
(<any>UIImage).tns_decodeImageWithDataCompletion(data, image => { (<any>UIImage).tns_decodeImageWithDataCompletion(data, image => {
if (image) { if (image) {
resolve(fromNativeSource(image)); resolve(imageSource.fromNativeSource(image));
} else { } else {
reject(new Error("Response content may not be converted to an Image")); reject(new Error("Response content may not be converted to an Image"));
} }
@ -147,12 +160,14 @@ export function request(options: HttpRequestOptions): Promise<HttpResponse> {
}); });
}, },
toFile: (destinationFilePath?: string) => { toFile: (destinationFilePath?: string) => {
ensureFileSystem();
if (!destinationFilePath) { if (!destinationFilePath) {
destinationFilePath = getFilenameFromUrl(options.url); destinationFilePath = getFilenameFromUrl(options.url);
} }
if (data instanceof NSData) { if (data instanceof NSData) {
// ensure destination path exists by creating any missing parent directories // ensure destination path exists by creating any missing parent directories
const file = File.fromPath(destinationFilePath); const file = fs.File.fromPath(destinationFilePath);
data.writeToFileAtomically(destinationFilePath, true); data.writeToFileAtomically(destinationFilePath, true);
@ -192,7 +207,7 @@ function NSDataToString(data: any, encoding?: HttpResponseEncoding): string {
return NSString.alloc().initWithDataEncoding(data, code).toString(); return NSString.alloc().initWithDataEncoding(data, code).toString();
} }
export function addHeader(headers: Headers, key: string, value: string): void { export function addHeader(headers: httpModule.Headers, key: string, value: string): void {
if (!headers[key]) { if (!headers[key]) {
headers[key] = value; headers[key] = value;
} else if (Array.isArray(headers[key])) { } else if (Array.isArray(headers[key])) {