Skip to content

Commit

Permalink
Merge pull request #6516 from realm/kh/realm-core-14.0.1-feedback
Browse files Browse the repository at this point in the history
Suggested changes to `kneth/realm-core-14.0.1`
  • Loading branch information
kneth committed Feb 28, 2024
2 parents 8710d0d + b09b0fe commit ef0aa0a
Show file tree
Hide file tree
Showing 2 changed files with 66 additions and 40 deletions.
30 changes: 16 additions & 14 deletions packages/realm/src/Logger.ts
Original file line number Diff line number Diff line change
Expand Up @@ -146,7 +146,7 @@ export enum LogCategory {
/**
* Type for `Realm.setLogLevel`
*/
export type LogArgs = {
export type LogOptions = {
level: LogLevel;
category?: LogCategory;
};
Expand All @@ -161,27 +161,29 @@ export type Logger = (level: NumericLogLevel, message: string) => void;

/**
* A callback passed to `Realm.setLogger`.
*
* @param level - The level of the log entry.
* @param message - The message of the log entry.
* @since 12.0.0
* @deprecated Will be removed in v13.0.0
*/
export type LoggerCallback1 = (level: LogLevel, message: string) => void;
export type LoggerCallbackArgs = {

/**
* Represents an entry in the log.
*/
export type LogEntry = {
/** The category (origin) of the log entry. */
category: LogCategory;
/** The level of the log entry. */
level: LogLevel;
/** The message of the log entry. */
message: string;
};
/**
* A callback passed to `Realm.setLogger`. Arguments are passed as a POJO.
*
* @param category - The category (origin) of the log entry.
* @param level - The level of the log entry.
* @param message - The message of the log entry.
* @since
* A callback passed to `Realm.setLogger`. Arguments are passed as an object.
* @since 12.7.0
*/
export type LoggerCallback2 = (args: LoggerCallbackArgs) => void;
export type LoggerCallback2 = (entry: LogEntry) => void;
export type LoggerCallback = LoggerCallback1 | LoggerCallback2;

/** @internal */
Expand Down Expand Up @@ -219,12 +221,12 @@ export function fromBindingLoggerLevelToLogLevel(arg: binding.LoggerLevel): LogL
}

/** @internal */
export const defaultLogger: LoggerCallback = function (logLevel: LogLevel, message: string) {
const formattedLogMessage = `[${logLevel}] ${message}`;
export const defaultLogger: LoggerCallback2 = function ({ category, level, message }) {
const formattedLogMessage = `[${category} - ${level}] ${message}`;
/* eslint-disable no-console */
if (logLevel === "error" || logLevel === "fatal") {
if (level === "error" || level === "fatal") {
console.error(formattedLogMessage);
} else if (logLevel === "warn") {
} else if (level === "warn") {
console.warn(formattedLogMessage);
} else {
console.log(formattedLogMessage);
Expand Down
76 changes: 50 additions & 26 deletions packages/realm/src/Realm.ts
Original file line number Diff line number Diff line change
Expand Up @@ -29,9 +29,9 @@ import {
INTERNAL,
InitialSubscriptions,
List,
LogArgs,
LogCategory,
LogLevel,
LogOptions,
LoggerCallback,
LoggerCallback1,
LoggerCallback2,
Expand Down Expand Up @@ -111,50 +111,74 @@ export class Realm {
private static internals = new Set<binding.WeakRef<binding.Realm>>();

/**
* Sets the log level.
* Sets the log level across all levels.
* @param level - The log level to be used by the logger. The default value is `info`.
* @param category - The category/component to set the log level for. If omitted, log level is set for all known categories.
* @note The log level can be changed during the lifetime of the application.
* @since 12.0.0
* @example
* Realm.setLogLevel("all");
*/
static setLogLevel(level: LogLevel): void;

/**
* Sets the log level for a specific category.
* @note The log level can be changed during the lifetime of the application.
* @since 12.0.0
* @example
* Realm.setLogLevel({ category: LogCategory.Realm, level: "all" });
*/
// eslint-disable-next-line @typescript-eslint/no-unused-vars
static setLogLevel(_: LogLevel | LogArgs) {
// It is not possible to overload a static function: https://github.com/microsoft/TypeScript/issues/18945
static setLogLevel(options: LogOptions): void;

static setLogLevel(arg: LogLevel | LogOptions) {
const setLevel = (category: LogCategory, level: LogLevel) => {
assert(Object.values(LogCategory).includes(category));
const ref = binding.LogCategoryRef;
const c = ref.getCategory(category);
c.setDefaultLevelThreshold(toBindingLoggerLevel(level));
const categoryRef = ref.getCategory(category);
categoryRef.setDefaultLevelThreshold(toBindingLoggerLevel(level));
};

// FIXME: don't use `arguments` but find a proper type
if (arguments.length === 1) {
// eslint-disable-next-line prefer-rest-params
const arg = arguments[0];
if (arg.level) {
const level = arg.level as LogLevel;
if (arg.category) {
const category = arg.category as LogCategory;
setLevel(category, level);
} else {
Object.values(LogCategory).forEach((category) => {
setLevel(category, level);
});
}
if (typeof arg === "string") {
for (const category of Object.values(LogCategory)) {
setLevel(category, arg);
}
} else {
const { level, category } = arg;
if (category) {
setLevel(category, level);
} else {
const level = arg as LogLevel;
Object.values(LogCategory).forEach((category) => {
for (const category of Object.values(LogCategory)) {
setLevel(category, level);
});
}
}
} else {
throw new Error(`Wrong number of arguments - expected 1, got ${arguments.length}`);
}
}

/**
* Sets the logger callback.
* @param loggerCallback - The callback invoked by the logger. The default callback uses `console.log`, `console.warn` and `console.error`, depending on the level of the message.
* @note The logger callback needs to be setup before opening the first Realm.
* @since 12.0.0
* @deprecated Pass a callback taking a single object argument instead.
* @example
* Realm.setLogger((level, message) => {
* console.log(`[${level}] ${message}`);
* });
*/
static setLogger(loggerCallback: LoggerCallback1): void;

/**
* Sets the logger callback.
* @param loggerCallback - The callback invoked by the logger. The default callback uses `console.log`, `console.warn` and `console.error`, depending on the level of the message.
* @note The logger callback needs to be setup before opening the first Realm.
* @since 12.0.0
* @example
* Realm.setLogger(({ category, level, message }) => {
* console.log(`[${category} - ${level}] ${message}`);
* });
*/
static setLogger(loggerCallback: LoggerCallback2): void;

/**
* Sets the logger callback.
* @param loggerCallback - The callback invoked by the logger. The default callback uses `console.log`, `console.warn` and `console.error`, depending on the level of the message.
Expand Down

0 comments on commit ef0aa0a

Please sign in to comment.