feat(package): add waitFor and sleep functions

This commit is contained in:
Linden
2024-01-17 17:39:16 +11:00
parent 0f7d1c165f
commit c0832cbe72
2 changed files with 59 additions and 18 deletions

View File

@@ -1,4 +1,6 @@
function streamingRequest(
import { waitFor } from 'shared';
async function streamingRequest(
request: Function,
hasLoaded: Function,
assetType: string,
@@ -6,23 +8,17 @@ function streamingRequest(
timeout?: number,
...args: any
): Promise<any> {
return new Promise((resolve, reject) => {
if (hasLoaded(asset)) resolve(asset);
if (hasLoaded(asset)) return asset;
request(asset, ...args);
request(asset, ...args);
if (typeof timeout !== 'number') timeout = 500;
let i = 0;
setTick(() => {
if (hasLoaded(asset)) resolve(asset);
i++;
if (i === timeout) reject(`failed to load ${assetType} '${asset}' after ${timeout} ticks`);
});
});
waitFor(
() => {
if (hasLoaded(asset)) return asset;
},
`failed to load ${assetType} '${asset}' after ${timeout} ticks`,
timeout || 500
);
}
export const requestAnimDict = (animDict: string, timeout?: number): Promise<string> => {
@@ -50,5 +46,18 @@ export const requestScaleformMovie = (scaleformName: string, timeout?: number):
export const requestStreamedTextureDict = (textureDict: string, timeout?: number): Promise<string> =>
streamingRequest(RequestStreamedTextureDict, HasStreamedTextureDictLoaded, 'textureDict', textureDict, timeout);
export const requestWeaponAsset = (weaponHash: string | number, timeout?: number, weaponResourceFlags: number = 31, extraWeaponComponentFlags: number = 0): Promise<string | number> =>
streamingRequest(RequestWeaponAsset, HasWeaponAssetLoaded, 'weaponHash', weaponHash, timeout, weaponResourceFlags, extraWeaponComponentFlags);
export const requestWeaponAsset = (
weaponHash: string | number,
timeout?: number,
weaponResourceFlags: number = 31,
extraWeaponComponentFlags: number = 0
): Promise<string | number> =>
streamingRequest(
RequestWeaponAsset,
HasWeaponAssetLoaded,
'weaponHash',
weaponHash,
timeout,
weaponResourceFlags,
extraWeaponComponentFlags
);

View File

@@ -6,3 +6,35 @@ export type FlattenObjectKeys<T extends Record<string, unknown>, Key = keyof T>
? `${Key}.${FlattenObjectKeys<T[Key]>}`
: `${Key}`
: never;
export function sleep(ms: number) {
return new Promise((resolve) => setTimeout(resolve, ms, null));
}
export async function waitFor<T>(cb: () => T, errMessage: string | void, timeout = 1000): Promise<T> {
let value = await cb();
if (value !== undefined) return value;
if (IsDuplicityVersion()) timeout /= 50;
else timeout -= GetFrameTime() * 1000;
const start = GetGameTimer();
let id: number;
let i = 0;
const p = new Promise<T>((resolve, reject) => {
id = setTick(async () => {
i++;
if (i > timeout)
return reject(`${errMessage || 'failed to resolve callback'} (waited ${(GetGameTimer() - start) / 1000}ms)`);
value = await cb();
if (value !== undefined) resolve(value);
});
}).finally(() => clearTick(id));
return p;
}