mirror of
https://github.com/zhigang1992/react-native-firebase.git
synced 2026-04-13 09:38:53 +08:00
Added support for configurable function timeout which allows you to set the timeout for a cloud function call in milliseconds.
128 lines
3.7 KiB
JavaScript
128 lines
3.7 KiB
JavaScript
/*
|
|
* Copyright (c) 2016-present Invertase Limited & Contributors
|
|
*
|
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
* you may not use this library except in compliance with the License.
|
|
* You may obtain a copy of the License at
|
|
*
|
|
* http://www.apache.org/licenses/LICENSE-2.0
|
|
*
|
|
* Unless required by applicable law or agreed to in writing, software
|
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
* See the License for the specific language governing permissions and
|
|
* limitations under the License.
|
|
*
|
|
*/
|
|
|
|
import { isAndroid, isNumber } from '@react-native-firebase/app/lib/common';
|
|
import {
|
|
createModuleNamespace,
|
|
FirebaseModule,
|
|
getFirebaseRoot,
|
|
} from '@react-native-firebase/app/lib/internal';
|
|
import HttpsError from './HttpsError';
|
|
import version from './version';
|
|
|
|
const namespace = 'functions';
|
|
const nativeModuleName = 'RNFBFunctionsModule';
|
|
|
|
// import { HttpsErrorCode } from '@react-native-firebase/functions';
|
|
export const HttpsErrorCode = {
|
|
OK: 'ok',
|
|
CANCELLED: 'cancelled',
|
|
UNKNOWN: 'unknown',
|
|
INVALID_ARGUMENT: 'invalid-argument',
|
|
DEADLINE_EXCEEDED: 'deadline-exceeded',
|
|
NOT_FOUND: 'not-found',
|
|
ALREADY_EXISTS: 'already-exists',
|
|
PERMISSION_DENIED: 'permission-denied',
|
|
UNAUTHENTICATED: 'unauthenticated',
|
|
RESOURCE_EXHAUSTED: 'resource-exhausted',
|
|
FAILED_PRECONDITION: 'failed-precondition',
|
|
ABORTED: 'aborted',
|
|
OUT_OF_RANGE: 'out-of-range',
|
|
UNIMPLEMENTED: 'unimplemented',
|
|
INTERNAL: 'internal',
|
|
UNAVAILABLE: 'unavailable',
|
|
DATA_LOSS: 'data-loss',
|
|
};
|
|
|
|
const statics = {
|
|
HttpsErrorCode,
|
|
};
|
|
|
|
class FirebaseFunctionsModule extends FirebaseModule {
|
|
constructor(...args) {
|
|
super(...args);
|
|
this._customUrlOrRegion = this._customUrlOrRegion || 'us-central1';
|
|
this._useFunctionsEmulatorOrigin = null;
|
|
}
|
|
|
|
httpsCallable(name, options = {}) {
|
|
if (options.timeout) {
|
|
if (isNumber(options.timeout)) {
|
|
options.timeout = options.timeout / 1000;
|
|
} else {
|
|
throw new Error('HttpsCallableOptions.timeout expected a Number in milliseconds');
|
|
}
|
|
}
|
|
|
|
return data => {
|
|
const nativePromise = this.native.httpsCallable(
|
|
this._useFunctionsEmulatorOrigin,
|
|
name,
|
|
{
|
|
data,
|
|
},
|
|
options,
|
|
);
|
|
return nativePromise.catch(nativeError => {
|
|
const { code, message, details } = nativeError.userInfo || {};
|
|
return Promise.reject(
|
|
new HttpsError(
|
|
HttpsErrorCode[code] || HttpsErrorCode.UNKNOWN,
|
|
message || nativeError.message,
|
|
details || null,
|
|
nativeError,
|
|
),
|
|
);
|
|
});
|
|
};
|
|
}
|
|
|
|
useFunctionsEmulator(origin) {
|
|
let _origin = origin;
|
|
if (isAndroid && _origin) {
|
|
if (_origin.startsWith('http://localhost')) {
|
|
_origin = _origin.replace('http://localhost', 'http://10.0.2.2');
|
|
}
|
|
if (_origin.startsWith('http://127.0.0.1')) {
|
|
_origin = _origin.replace('http://127.0.0.1', 'http://10.0.2.2');
|
|
}
|
|
}
|
|
this._useFunctionsEmulatorOrigin = _origin || null;
|
|
}
|
|
}
|
|
|
|
// import { SDK_VERSION } from '@react-native-firebase/functions';
|
|
export const SDK_VERSION = version;
|
|
|
|
// import functions from '@react-native-firebase/functions';
|
|
// functions().logEvent(...);
|
|
export default createModuleNamespace({
|
|
statics,
|
|
version,
|
|
namespace,
|
|
nativeModuleName,
|
|
nativeEvents: false,
|
|
hasMultiAppSupport: true,
|
|
hasCustomUrlOrRegionSupport: true,
|
|
ModuleClass: FirebaseFunctionsModule,
|
|
});
|
|
|
|
// import functions, { firebase } from '@react-native-firebase/functions';
|
|
// functions().logEvent(...);
|
|
// firebase.functions().logEvent(...);
|
|
export const firebase = getFirebaseRoot();
|