UNPKG

@react-native-firebase/app

Version:

A well tested, feature rich Firebase implementation for React Native, supporting iOS & Android. Individual module support for Admob, Analytics, Auth, Crash Reporting, Cloud Firestore, Database, Dynamic Links, Functions, Messaging (FCM), Remote Config, Sto

92 lines (75 loc) 2.82 kB
/* * 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. * */ const PUSH_CHARS = '-0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ_abcdefghijklmnopqrstuvwxyz'; const AUTO_ID_CHARS = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789'; // timestamp of last push, used to prevent local collisions if you push twice in one ms. let lastPushTime = 0; // we generate 72-bits of randomness which get turned into 12 characters and appended to the // timestamp to prevent collisions with other clients. We store the last characters we // generated because in the event of a collision, we'll use those same characters except // "incremented" by one. const lastRandChars: number[] = []; /** * Generate a firebase id - for use with ref().push(val, cb) - e.g. -KXMr7k2tXUFQqiaZRY4' * @param serverTimeOffset - pass in server time offset from native side * @returns {string} */ export function generateDatabaseId(serverTimeOffset: number = 0): string { const timeStampChars = new Array(8); let now = new Date().getTime() + serverTimeOffset; const duplicateTime = now === lastPushTime; lastPushTime = now; for (let i = 7; i >= 0; i -= 1) { timeStampChars[i] = PUSH_CHARS.charAt(now % 64); now = Math.floor(now / 64); } if (now !== 0) { throw new Error('We should have converted the entire timestamp.'); } let id = timeStampChars.join(''); if (!duplicateTime) { for (let i = 0; i < 12; i += 1) { lastRandChars[i] = Math.floor(Math.random() * 64); } } else { // if the timestamp hasn't changed since last push, // use the same random number, but increment it by 1. let i; for (i = 11; i >= 0 && lastRandChars[i] === 63; i -= 1) { lastRandChars[i] = 0; } lastRandChars[i]! += 1; } for (let i = 0; i < 12; i++) { id += PUSH_CHARS.charAt(lastRandChars[i]!); } if (id.length !== 20) { throw new Error('Length should be 20.'); } return id; } /** * Generate a firestore auto id for use with collection/document .add() * @return {string} */ export function generateFirestoreId(): string { let autoId = ''; for (let i = 0; i < 20; i++) { autoId += AUTO_ID_CHARS.charAt(Math.floor(Math.random() * AUTO_ID_CHARS.length)); } return autoId; }