@react-native-ohos/realm
Version:
Realm by MongoDB is an offline-first mobile database: an alternative to SQLite and key-value stores
339 lines • 12.9 kB
JavaScript
"use strict";
////////////////////////////////////////////////////////////////////////////
//
// Copyright 2022 Realm Inc.
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file 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.
//
////////////////////////////////////////////////////////////////////////////
Object.defineProperty(exports, "__esModule", { value: true });
exports.User = exports.UserState = void 0;
const binding_1 = require("../binding");
const assert_1 = require("../assert");
const indirect_1 = require("../indirect");
const platform_1 = require("../platform");
const Listeners_1 = require("../Listeners");
const async_iterator_from_response_1 = require("../async-iterator-from-response");
const utils_1 = require("./utils");
const ApiKeyAuth_1 = require("./ApiKeyAuth");
const Credentials_1 = require("./Credentials");
const FunctionsFactory_1 = require("./FunctionsFactory");
const MongoDBCollection_1 = require("./MongoDBCollection");
const PushClient_1 = require("./PushClient");
/**
* The state of a user.
*/
var UserState;
(function (UserState) {
/**
* Authenticated and available to communicate with services.
* @deprecated Will be removed in v13. Please use {@link UserState.LoggedIn}
*/
UserState["Active"] = "active";
/** Authenticated and available to communicate with services. */
UserState["LoggedIn"] = "LoggedIn";
/** Logged out, but ready to be logged in. */
UserState["LoggedOut"] = "LoggedOut";
/** Removed from the app entirely. */
UserState["Removed"] = "Removed";
})(UserState = exports.UserState || (exports.UserState = {}));
/**
* Representation of an authenticated user of an {@link App}.
*/
class User {
/** @internal */
app;
/** @internal */
internal;
/** @internal */
cachedProfile;
/** @internal */
listeners = new Listeners_1.Listeners({
add: (callback) => {
return this.internal.subscribe(callback);
},
remove: (token) => {
this.internal.unsubscribe(token);
},
});
/** @internal */
static get(internal, app) {
// Update the static user reference to the current app
if (app) {
indirect_1.indirect.App.setAppByUser(internal, app);
}
// TODO: Use a WeakRef to memoize the SDK object
return new User(internal, indirect_1.indirect.App.getAppByUser(internal));
}
/** @internal */
constructor(internal, app) {
this.internal = internal;
this.app = app;
this.cachedProfile = undefined;
Object.defineProperty(this, "listeners", {
enumerable: false,
configurable: false,
writable: false,
});
Object.defineProperty(this, "internal", {
enumerable: false,
configurable: false,
writable: false,
});
Object.defineProperty(this, "app", {
enumerable: false,
configurable: false,
writable: false,
});
Object.defineProperty(this, "cachedProfile", {
enumerable: false,
configurable: false,
writable: true,
});
}
/**
* The automatically-generated internal ID of the user.
* @returns The user ID as a string.
*/
get id() {
return this.internal.userId;
}
/**
* The provider type used when authenticating the user. If multiple identities exist,
* the provider type for the first identity found is return.
* @returns The provider type as an enumerated string.
* @deprecated Use {@link User.identities} instead.
*/
get providerType() {
const [identity] = this.internal.identities;
if (!identity) {
throw new Error("No provider found");
}
const type = identity.providerType;
if ((0, Credentials_1.isProviderType)(type)) {
return type;
}
throw new Error(`Unexpected provider type: ${type}`);
}
/**
* The ID of the device.
* @returns The device ID as a string or `null`.
*/
get deviceId() {
return this.internal.deviceId;
}
/**
* The state of the user.
* @returns The state as an enumerated string.
*/
get state() {
const state = this.internal.state;
switch (state) {
case 1 /* binding.SyncUserState.LoggedIn */:
return UserState.LoggedIn;
case 0 /* binding.SyncUserState.LoggedOut */:
return UserState.LoggedOut;
case 2 /* binding.SyncUserState.Removed */:
return UserState.Removed;
default:
throw new Error(`Unsupported SyncUserState value: ${state}`);
}
}
/**
* The logged in state of the user.
* @returns `true` if the user is logged in, `false` otherwise.
*/
get isLoggedIn() {
const syncUser = binding_1.binding.Helpers.appUserAsSyncUser(this.internal);
(0, assert_1.assert)(syncUser);
return syncUser.isLoggedIn;
}
/**
* The identities of the user at any of the app's authentication providers.
* @returns An array of {@link UserIdentity} objects.
*/
get identities() {
return this.internal.identities.map(({ id, providerType }) => ({ id, providerType }));
}
/**
* The access token used when requesting a new access token.
* @returns The access token as a string or `null`.
*/
get accessToken() {
return this.internal.accessToken;
}
/**
* The refresh token used when requesting a new access token.
* @returns The refresh token as a string or `null`.
*/
get refreshToken() {
return this.internal.refreshToken;
}
/**
* You can store arbitrary data about your application users in a MongoDB collection and configure
* Atlas App Services to automatically expose each user’s data in a field of their user object.
* For example, you might store a user’s preferred language, date of birth, or their local timezone.
*
* If this value has not been configured, it will be empty.
* @returns The custom data as an object.
*/
get customData() {
const result = this.internal.customData;
if (result === undefined) {
return {};
}
return result;
}
/**
* A profile containing additional information about the user.
* @returns The user profile data as an object.
*/
get profile() {
if (!this.cachedProfile) {
this.cachedProfile = this.internal.userProfile.data();
}
return this.cachedProfile;
}
/**
* Use this to call functions defined by the Atlas App Services application, as this user.
* @returns A {@link User.UserFunctionsFactoryType} that can be used to call the app's functions.
*/
get functions() {
return (0, FunctionsFactory_1.createFactory)(this, undefined);
}
/**
* Perform operations related to the API-key auth provider.
* @returns An {@link ApiKeyAuth} object that can be used to manage API keys.
*/
get apiKeys() {
// TODO: Add memoization
const internal = this.app.internal.userApiKeyProviderClient();
return new ApiKeyAuth_1.ApiKeyAuth(this.internal, internal);
}
/**
* Log out the user.
* @returns A promise that resolves once the user has been logged out of the app.
*/
async logOut() {
await this.app.internal.logOutUser(this.internal);
}
/**
* Link the user with an identity represented by another set of credentials.
* @param credentials - The credentials to use when linking.
* @returns A promise that resolves once the user has been linked with the credentials.
*/
async linkCredentials(credentials) {
await this.app.internal.linkUser(this.internal, credentials.internal);
}
/**
* Call a remote Atlas App Services Function by its name.
* @note Consider using `functions[name]()` instead of calling this method.
* @param name - Name of the App Services Function.
* @param args - Arguments passed to the Function.
* @returns A promise that resolves to the value returned by the Function.
* @example
* // These are all equivalent:
* await user.callFunction("doThing", a1, a2, a3);
* await user.functions.doThing(a1, a2, a3);
* await user.functions["doThing"](a1, a2, a3);
* @example
* // The methods returned from the functions object are bound, which is why it's okay to store the function in a variable before calling it:
* const doThing = user.functions.doThing;
* await doThing(a1);
* await doThing(a2);
*/
callFunction(name, ...args) {
return this.callFunctionOnService(name, undefined, ...args);
}
/** @internal */
async callFunctionOnService(name, serviceName, ...args) {
return this.app.internal.callFunction(this.internal, name, (0, utils_1.cleanArguments)(args), serviceName);
}
/** @internal */
async callFunctionStreaming(functionName, serviceName, ...functionArgs) {
const request = this.app.internal.makeStreamingRequest(this.internal, functionName, (0, utils_1.cleanArguments)(functionArgs), serviceName);
const response = await platform_1.network.fetch(...binding_1.binding.toFetchArgs(request));
(0, assert_1.assert)(response.ok, () => `Request failed: ${response.statusText} (${response.status})`);
(0, assert_1.assert)(response.body, "Expected a body in the response");
return (0, async_iterator_from_response_1.asyncIteratorFromResponse)(response);
}
/**
* Refresh the access token and derive custom data from it.
* @returns A promise that resolves to the refreshed custom data.
*/
async refreshCustomData() {
await this.app.internal.refreshCustomData(this.internal);
return this.customData;
}
/**
* Use the Push service to enable sending push messages to this user via Firebase Cloud Messaging (FCM).
* @deprecated https://www.mongodb.com/docs/atlas/app-services/reference/push-notifications/
* @returns A {@link PushClient} with methods to register and deregister the device on the user.
*/
push(serviceName) {
const internal = this.app.internal.pushNotificationClient(serviceName);
return new PushClient_1.PushClient(this.internal, internal);
}
/**
* @param serviceName - The name of the MongoDB service to connect to.
* @returns A client enabling access to a MongoDB service.
* @example
* let blueWidgets = user.mongoClient("myService")
* .db("myDb")
* .collection<Widget>("widgets")
* .find({ color: "blue" });
*/
mongoClient(serviceName) {
assert_1.assert.string(serviceName, "serviceName");
(0, assert_1.assert)(serviceName.length, "Please provide the name of the MongoDB service to connect to.");
return {
get serviceName() {
return serviceName;
},
db: (databaseName) => {
return {
get name() {
return databaseName;
},
collection: (collectionName) => {
return new MongoDBCollection_1.MongoDBCollection(this, serviceName, databaseName, collectionName);
},
};
},
};
}
/**
* Adds a listener that will be fired on various user related events.
* This includes auth token refresh, refresh token refresh, refresh custom user data, and logout.
* @param callback - The callback to be fired when the event occurs.
*/
addListener(callback) {
this.listeners.add(callback);
}
/**
* Removes an event listener previously added via {@link User.addListener}.
* @param callback - The callback to be removed.
*/
removeListener(callback) {
this.listeners.remove(callback);
}
/**
* Removes all event listeners previously added via {@link User.addListener}.
*/
removeAllListeners() {
this.listeners.removeAll();
}
}
exports.User = User;
(0, indirect_1.injectIndirect)("User", User);
//# sourceMappingURL=User.js.map