Skip to content

Commit c88b841

Browse files
author
Brian Chen
committed
Surface transaction errors in browser (#2017)
1 parent f28372f commit c88b841

File tree

2 files changed

+33
-13
lines changed

2 files changed

+33
-13
lines changed

packages/firestore/src/platform_browser/webchannel_connection.ts

Lines changed: 18 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -31,8 +31,8 @@ import { DatabaseId, DatabaseInfo } from '../core/database_info';
3131
import { SDK_VERSION } from '../core/version';
3232
import { Connection, Stream } from '../remote/connection';
3333
import {
34-
mapCodeFromHttpStatus,
35-
mapCodeFromRpcStatus
34+
mapCodeFromRpcStatus,
35+
mapCodeFromHttpResponseErrorStatus
3636
} from '../remote/rpc_error';
3737
import { StreamBridge } from '../remote/stream_bridge';
3838
import { assert, fail } from '../util/assert';
@@ -123,20 +123,25 @@ export class WebChannelConnection implements Connection {
123123
xhr.getResponseText()
124124
);
125125
if (status > 0) {
126-
const response = xhr.getResponseJson().error;
127-
if (!!response) {
128-
const serverError = response.status
129-
.toLowerCase()
130-
.replace('_', '-');
131-
const firestoreError: Code =
132-
Object.values(Code).indexOf(serverError) >= 0
133-
? (serverError as Code)
134-
: Code.UNKNOWN;
135-
reject(new FirestoreError(firestoreError, response.message));
126+
const responseError = xhr.getResponseJson().error;
127+
if (
128+
!!responseError &&
129+
!!responseError.status &&
130+
!!responseError.message
131+
) {
132+
const firestoreErrorCode = mapCodeFromHttpResponseErrorStatus(
133+
responseError.status
134+
);
135+
reject(
136+
new FirestoreError(
137+
firestoreErrorCode,
138+
responseError.message
139+
)
140+
);
136141
} else {
137142
reject(
138143
new FirestoreError(
139-
mapCodeFromHttpStatus(status),
144+
Code.UNKNOWN,
140145
'Server responded with status ' + xhr.getStatus()
141146
)
142147
);

packages/firestore/src/remote/rpc_error.ts

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -298,3 +298,18 @@ export function mapCodeFromHttpStatus(status: number): Code {
298298
return Code.UNKNOWN;
299299
}
300300
}
301+
302+
/**
303+
* Converts an HTTP response's error status to the equivalent error code.
304+
*
305+
* @param status An HTTP error response status ("FAILED_PRECONDITION",
306+
* "UNKNOWN", etc.)
307+
* @returns The equivalent Code. Non-matching responses are mapped to
308+
* Code.UNKNOWN.
309+
*/
310+
export function mapCodeFromHttpResponseErrorStatus(status: string): Code {
311+
const serverError = status.toLowerCase().replace('_', '-');
312+
return Object.values(Code).indexOf(serverError as Code) >= 0
313+
? (serverError as Code)
314+
: Code.UNKNOWN;
315+
}

0 commit comments

Comments
 (0)