@inweb/client
Version:
JavaScript REST API client for the Open Cloud Server
105 lines (93 loc) • 3.71 kB
text/typescript
///////////////////////////////////////////////////////////////////////////////
// Copyright (C) 2002-2025, Open Design Alliance (the "Alliance").
// All rights reserved.
//
// This software and its documentation and related materials are owned by
// the Alliance. The software may only be incorporated into application
// programs owned by members of the Alliance, subject to a signed
// Membership Agreement and Supplemental Software License Agreement with the
// Alliance. The structure and organization of this software are the valuable
// trade secrets of the Alliance and its suppliers. The software is also
// protected by copyright law and international treaty provisions. Application
// programs incorporating this software must include the following statement
// with their copyright notices:
//
// This application incorporates Open Design Alliance software pursuant to a
// license agreement with Open Design Alliance.
// Open Design Alliance Copyright (C) 2002-2025 by Open Design Alliance.
// All rights reserved.
//
// By use of this software, its documentation or related materials, you
// acknowledge and accept the above terms.
///////////////////////////////////////////////////////////////////////////////
function delay(ms: number, signal: AbortSignal): Promise<boolean> {
return new Promise((resolve) => {
let timeoutId = 0;
const abortHandler = () => {
clearTimeout(timeoutId);
resolve(true);
};
timeoutId = window.setTimeout(() => {
signal.removeEventListener("abort", abortHandler);
resolve(false);
}, ms);
signal.addEventListener("abort", abortHandler, { once: true });
});
}
export async function waitFor(
func: (params: any) => Promise<boolean>,
params: {
timeout?: number;
interval?: number;
signal?: AbortSignal;
abortError?: DOMException;
timeoutError?: DOMException;
result?: any;
} = {}
): Promise<any> {
const timeout = params.timeout || 600000;
const interval = params.interval || 3000;
const signal = params.signal ?? new AbortController().signal;
const abortError = params.abortError ?? new DOMException("Aborted", "AbortError");
const timeoutError = params.timeoutError ?? new DOMException("Timeout", "TimeoutError");
const end = performance.now() + timeout;
let count = timeout / interval;
do {
if (await func(params)) return Promise.resolve(params.result);
if ((await delay(interval, signal)) || signal.aborted) return Promise.reject(abortError);
} while (performance.now() < end && --count > 0);
return Promise.reject(timeoutError);
}
export function parseArgs(args?: string | object): object {
if (typeof args === "string") {
const firstArg = args.indexOf("--");
if (firstArg !== -1) args = args.slice(firstArg);
const argArray = args
.split("--")
.map((x) =>
x
.split("=")
.map((y) => y.split(" "))
.flat()
)
.filter((x) => x[0])
.map((x) => x.concat([""]));
return Object.fromEntries(argArray);
}
return args || {};
}
export function userFullName(firstName: string | any, lastName = "", userName = ""): string {
if (firstName && typeof firstName !== "string") {
return userFullName(firstName.firstName ?? firstName.name, firstName.lastName, firstName.userName);
}
return `${firstName ?? ""} ${lastName ?? ""}`.trim() || userName;
}
export function userInitials(fullName = ""): string {
const names = fullName.split(" ").filter((x) => x);
return names
.reduce((initials, name, index) => {
if (index === 0 || index === names.length - 1) initials += name.charAt(0);
return initials;
}, "")
.toUpperCase();
}