fix: wire response + init error handling
This commit is contained in:
@@ -51,7 +51,10 @@ export const sendNetworkRequest = (req: any) =>
|
||||
export function createRESTNetworkRequestStream(
|
||||
req: EffectiveHoppRESTRequest
|
||||
): Observable<HoppRESTResponse> {
|
||||
const response = new BehaviorSubject<HoppRESTResponse>({ type: "loading" })
|
||||
const response = new BehaviorSubject<HoppRESTResponse>({
|
||||
type: "loading",
|
||||
req,
|
||||
})
|
||||
|
||||
const headers = req.effectiveFinalHeaders.reduce((acc, { key, value }) => {
|
||||
return Object.assign(acc, { [key]: value })
|
||||
@@ -60,32 +63,73 @@ export function createRESTNetworkRequestStream(
|
||||
const timeStart = Date.now()
|
||||
|
||||
runAppropriateStrategy({
|
||||
method: req.method as any,
|
||||
url: req.effectiveFinalURL,
|
||||
headers,
|
||||
}).then((res: any) => {
|
||||
const timeEnd = Date.now()
|
||||
|
||||
const contentLength = res.headers["content-length"]
|
||||
? parseInt(res.headers["content-length"])
|
||||
: (res.data as ArrayBuffer).byteLength
|
||||
|
||||
const resObj: HoppRESTResponse = {
|
||||
type: "success",
|
||||
statusCode: res.status,
|
||||
body: res.data,
|
||||
headers: Object.keys(res.headers).map((x) => ({
|
||||
key: x,
|
||||
value: res.headers[x],
|
||||
})),
|
||||
meta: {
|
||||
responseSize: contentLength,
|
||||
responseDuration: timeEnd - timeStart,
|
||||
},
|
||||
}
|
||||
response.next(resObj)
|
||||
|
||||
response.complete()
|
||||
})
|
||||
.then((res: any) => {
|
||||
const timeEnd = Date.now()
|
||||
|
||||
const contentLength = res.headers["content-length"]
|
||||
? parseInt(res.headers["content-length"])
|
||||
: (res.data as ArrayBuffer).byteLength
|
||||
|
||||
const resObj: HoppRESTResponse = {
|
||||
type: "success",
|
||||
statusCode: res.status,
|
||||
body: res.data,
|
||||
headers: Object.keys(res.headers).map((x) => ({
|
||||
key: x,
|
||||
value: res.headers[x],
|
||||
})),
|
||||
meta: {
|
||||
responseSize: contentLength,
|
||||
responseDuration: timeEnd - timeStart,
|
||||
},
|
||||
req,
|
||||
}
|
||||
response.next(resObj)
|
||||
|
||||
response.complete()
|
||||
})
|
||||
.catch((err) => {
|
||||
if (err.response) {
|
||||
const timeEnd = Date.now()
|
||||
|
||||
const contentLength = err.response.headers["content-length"]
|
||||
? parseInt(err.response.headers["content-length"])
|
||||
: (err.response.data as ArrayBuffer).byteLength
|
||||
|
||||
const resObj: HoppRESTResponse = {
|
||||
type: "fail",
|
||||
body: err.response.data,
|
||||
headers: Object.keys(err.response.headers).map((x) => ({
|
||||
key: x,
|
||||
value: err.response.headers[x],
|
||||
})),
|
||||
meta: {
|
||||
responseDuration: timeEnd - timeStart,
|
||||
responseSize: contentLength,
|
||||
},
|
||||
req,
|
||||
statusCode: err.response.status,
|
||||
}
|
||||
|
||||
response.next(resObj)
|
||||
|
||||
response.complete()
|
||||
} else {
|
||||
const resObj: HoppRESTResponse = {
|
||||
type: "network_fail",
|
||||
error: err,
|
||||
req,
|
||||
}
|
||||
|
||||
response.next(resObj)
|
||||
|
||||
response.complete()
|
||||
}
|
||||
})
|
||||
|
||||
return response
|
||||
}
|
||||
|
||||
@@ -1,3 +1,5 @@
|
||||
export const RESTReqSchemaVersion = "1"
|
||||
|
||||
export type HoppRESTParam = {
|
||||
key: string
|
||||
value: string
|
||||
@@ -11,8 +13,44 @@ export type HoppRESTHeader = {
|
||||
}
|
||||
|
||||
export interface HoppRESTRequest {
|
||||
v: string
|
||||
|
||||
method: string
|
||||
endpoint: string
|
||||
params: HoppRESTParam[]
|
||||
headers: HoppRESTHeader[]
|
||||
}
|
||||
|
||||
export function isHoppRESTRequest(x: any): x is HoppRESTRequest {
|
||||
return x && typeof x === "object" && "v" in x
|
||||
}
|
||||
|
||||
export function translateToNewRequest(x: any): HoppRESTRequest {
|
||||
if (isHoppRESTRequest(x)) {
|
||||
return x
|
||||
} else {
|
||||
// Old format
|
||||
const endpoint: string = `${x.url}${x.path}`
|
||||
|
||||
const headers: HoppRESTHeader[] = x.headers
|
||||
|
||||
// Remove old keys from params
|
||||
const params: HoppRESTParam[] = (x.params as any[]).map(
|
||||
({ key, value, active }) => ({
|
||||
key,
|
||||
value,
|
||||
active,
|
||||
})
|
||||
)
|
||||
|
||||
const method = x.method
|
||||
|
||||
return {
|
||||
endpoint,
|
||||
headers,
|
||||
params,
|
||||
method,
|
||||
v: RESTReqSchemaVersion,
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,14 +1,25 @@
|
||||
import { HoppRESTRequest } from "./HoppRESTRequest"
|
||||
|
||||
export type HoppRESTResponse =
|
||||
| { type: "loading" }
|
||||
| { type: "loading"; req: HoppRESTRequest }
|
||||
| {
|
||||
type: "fail"
|
||||
headers: { key: string; value: string }[]
|
||||
body: ArrayBuffer
|
||||
statusCode: number
|
||||
|
||||
meta: {
|
||||
responseSize: number // in bytes
|
||||
responseDuration: number // in millis
|
||||
}
|
||||
|
||||
req: HoppRESTRequest
|
||||
}
|
||||
| {
|
||||
type: "network_fail"
|
||||
error: Error
|
||||
|
||||
req: HoppRESTRequest
|
||||
}
|
||||
| {
|
||||
type: "success"
|
||||
@@ -19,4 +30,6 @@ export type HoppRESTResponse =
|
||||
responseSize: number // in bytes
|
||||
responseDuration: number // in millis
|
||||
}
|
||||
|
||||
req: HoppRESTRequest
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user