@fnlb-project/shared 1.5.68 → 1.5.70

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -466,6 +466,7 @@ export declare enum Locales {
466
466
  Ar = "ar",
467
467
  De = "de",
468
468
  Fr = "fr",
469
+ He = "he",
469
470
  Id = "id",
470
471
  It = "it",
471
472
  Ja = "ja",
@@ -1 +1 @@
1
- var r;((e)=>{e[e.Offline=0]="Offline";e[e.Booting=1]="Booting";e[e.Available=2]="Available";e[e.Busy=3]="Busy";e[e.Disconnected=4]="Disconnected"})(r||={});var m;((e)=>{e[e.Neutral=0]="Neutral";e[e.Success=1]="Success";e[e.Info=2]="Info";e[e.Warn=3]="Warn";e[e.Error=4]="Error"})(m||={});var f;((u)=>{u.Win="WIN";u.Mac="MAC";u.Psn="PSN";u.Xbl="XBL";u.Swt="SWT";u.Swt2="SWT2";u.Ios="IOS";u.And="AND";u.Ps5="PS5";u.Xsx="XSX"})(f||={});var v;((a)=>{a[a.Public=0]="Public";a[a.Private=1]="Private"})(v||={});var x;((s)=>{s[s.Equals=0]="Equals";s[s.Includes=1]="Includes";s[s.StartsWith=2]="StartsWith";s[s.EndsWith=3]="EndsWith"})(x||={});var c;((t)=>{t[t.Blacklist=0]="Blacklist";t[t.Whitelist=1]="Whitelist";t[t.Kick=2]="Kick";t[t.Block=3]="Block";t[t.RemoveFriend=4]="RemoveFriend";t[t.AddFriend=5]="AddFriend";t[t.Promote=6]="Promote";t[t.Copy=7]="Copy";t[t.Mimic=8]="Mimic";t[t.Hide=9]="Hide";t[t.Show=10]="Show"})(c||={});var o;((i)=>{i.Default="en";i.EnUS="en-US";i.Es="es";i.Es419="es-419";i.Ar="ar";i.De="de";i.Fr="fr";i.Id="id";i.It="it";i.Ja="ja";i.Ko="ko";i.Pl="pl";i.Pt="pt";i.PtBR="pt-BR";i.Ru="ru";i.Th="th";i.Tr="tr";i.Vi="vi";i.Zh="zh";i.ZhHant="zh-Hant"})(o||={});var k;((_)=>{_.Default="en";_.Ar="ar";_.De="de";_.Es="es";_.Es419="es-419";_.Fr="fr";_.Id="id";_.It="it";_.Ja="ja";_.Ko="ko";_.Pl="pl";_.PtBR="pt-BR";_.Ru="ru";_.Th="th";_.Tr="tr";_.Vi="vi";_.ZhHans="zh-Hans";_.ZhHant="zh-Hant"})(k||={});var H={searchLangs:["en"],platform:["AND"],privacy:0,prefixes:["!",".","/"],statusText:[],statusInterval:2,level:[-999999999],bpLevel:[999999999],extraOwners:[],admins:[],whitelistUsers:[],blacklistUsers:[],excludedAutoAddFriends:[],otherBots:[],inviteTimeout:60,maxBotsPerLobby:8,maxBotsPerLobbyWithOwner:16,maxBotsPerLobbyWithAdmin:16,maxBotsPerLobbyWithWhitelistUser:16,allowMatchmaking:!0,leaveAfterMatchmaking:!1,disableMatchmakingChecks:!0,disablePlaylistChecks:!1,disableJoinMessages:!1,disableAutomaticMessages:!1,acceptFriendRequests:!0,sendFriendRequestOnJoinParty:!1,sendFriendRequestOnMemberJoinParty:!1,runCommandsWithoutPrefix:!0,setCosmeticsWithoutCommands:!0,setCosmeticsWithPrefix:!0,acceptInvites:!0,startBannedBots:!0,usernameTriggers:[],messageContentTriggers:[],addFriendTriggers:[],memberJoinTriggers:[],changeCosmeticTriggers:[],onlyOwnerCommands:["send_number","send_all","send_category","remove_all_friends","decline_all_friends","accept_all_friends","unblock_all_users","restart_bot","restart_category","restart_shard"],onlyAdminCommands:["add_friend","remove_friend","block_user","unblock_user"],onlyWhitelistUsersCommands:["send_party","send_shard","kick","kick_all","hide_all","message","whisper","accept_friend","decline_friend","set_status","say"],onlyFriendsCommands:[],onlyPartyMembersCommands:[],onlyWhisperCommands:[],startOutfit:[{id:"CID_030_Athena_Commando_M_Halloween",variants:[1,0]},{id:"CID_029_Athena_Commando_F_Halloween",variants:[2]},{id:"CID_434_Athena_Commando_F_StealthHonor",variants:[]},{id:"CID_175_Athena_Commando_M_Celestial",variants:[]}],startBackpack:[{id:"BID_138_Celestial",variants:[]},{id:"BID_004_BlackKnight",variants:[]}],startPickaxe:[{id:"Pickaxe_ID_116_Celestial",variants:[]},{id:"Pickaxe_ID_013_Teslacoil",variants:[]}],startShoes:[],startBanner:[{id:"BRSeason01"}],startBannerColor:[{id:"DefaultColor17"},{id:"DefaultColor14"}],joinOutfit:[],joinBackpack:[],joinPickaxe:[],joinEmote:[{id:"EID_KPopDance03"}],joinShoes:[],joinBanner:[],joinBannerColor:[],memberJoinOutfit:[],memberJoinBackpack:[],memberJoinPickaxe:[],memberJoinEmote:[{id:"EID_KPopDance03"}],memberJoinShoes:[],memberJoinBanner:[],memberJoinBannerColor:[]};var p;((d)=>{d[d.RequiredParam=0]="RequiredParam";d[d.OptionalParam=1]="OptionalParam";d[d.RequiredSelect=2]="RequiredSelect";d[d.OptionalSelect=3]="OptionalSelect";d[d.RequiredNumericParam=4]="RequiredNumericParam";d[d.OptionalNumericParam=5]="OptionalNumericParam"})(p||={});var b;((n)=>{n.GenericUnknown="net.fnlb.errors.generic.unknown";n.GenericInternalError="net.fnlb.errors.generic.internal_error";n.GenericValidationFailed="net.fnlb.errors.generic.validation_failed";n.GenericParseFailed="net.fnlb.errors.generic.parse_failed";n.GenericNotFound="net.fnlb.errors.generic.not_found";n.GenericAlreadyExists="net.fnlb.errors.generic.already_exists";n.CommonInvalidRequest="net.fnlb.errors.common.invalid_request";n.CommonUnableToProcessRequest="net.fnlb.errors.common.unable_to_process_request";n.CommonInvalidFieldsLength="net.fnlb.errors.common.invalid_body_fields_length";n.CommonRateLimitExceeded="net.fnlb.errors.common.rate_limit_exceeded";n.CommonLimitExceeded="net.fnlb.errors.common.limit_exceeded";n.CommonUnableToSaveToDatabase="net.fnlb.errors.common.unable_to_save_to_database";n.CommonUpdateRequired="net.fnlb.errors.common.update_required";n.AuthInvalidToken="net.fnlb.errors.auth.invalid_token";n.AuthInvalidAPIToken="net.fnlb.errors.auth.invalid_api_token";n.AuthInvalidCaptchaToken="net.fnlb.errors.auth.invalid_captcha_token";n.AuthUnauthorized="net.fnlb.errors.auth.unauthorized";n.AuthForbidden="net.fnlb.errors.auth.forbidden";n.AuthUserBanned="net.fnlb.errors.auth.user_banned";n.Oauth2InvalidCode="net.fnlb.errors.oauth2.invalid_code";n.Oauth2InvalidScope="net.fnlb.errors.oauth2.invalid_scope";n.Oauth2TokenInvalid="net.fnlb.errors.oauth2.token_invalid";n.Oauth2UnableToFetchUser="net.fnlb.errors.oauth2.unable_to_fetch_user";n.Oauth2UnableToFetchConnections="net.fnlb.errors.oauth2.unable_to_fetch_connections";n.Oauth2UserWithoutConnection="net.fnlb.errors.oauth2.user_without_connection";n.Oauth2ConnectionNotVerified="net.fnlb.errors.oauth2.connection_not_verified";n.ReleaseNotFound="net.fnlb.errors.release.no_release_found";n.ReleaseVersionAlreadyExists="net.fnlb.errors.release.version_already_exists"})(b||={});var h;((s)=>{s.LoginInvalidCredentials="net.fnlb.errors.login.invalid_credentials";s.LoginInvalidEmail="net.fnlb.errors.login.invalid_email";s.LoginInvalidOrUsedEmail="net.fnlb.errors.login.invalid_or_used_email";s.AuthPasswordConfirmationInvalid="net.fnlb.errors.auth.invalid_password_confirmation"})(h||={});var N={...b,...h};var D;((s)=>{s.Username="username";s.Email="email";s.Password="password";s.Shared="shared"})(D||={});var O;((a)=>{a.General="general";a.Input="input"})(O||={});var w;((l)=>{l[l.Disabled=1]="Disabled";l[l.Public=2]="Public";l[l.InvalidAuth=4]="InvalidAuth"})(w||={});var J;((a)=>{a[a.Disabled=1]="Disabled";a[a.Managed=2]="Managed"})(J||={});var q;((e)=>{e[e.Staff=1]="Staff";e[e.Admin=2]="Admin";e[e.Vip=4]="Vip";e[e.Verified=8]="Verified";e[e.Banned=16]="Banned"})(q||={});export{H as defaultCategoryConfig,q as UserFlags,o as Locales,h as InputErrorCodes,b as GeneralErrorCodes,O as ErrorTypes,D as ErrorInputTypes,N as ErrorCodes,m as CommandReplyFormat,p as CommandParamType,J as CategoryFlags,x as CategoryConfigTriggerStringMatchingMethod,c as CategoryConfigTriggerAction,f as CategoryConfigSupportedPlatforms,v as CategoryConfigPartyPrivacy,r as BotStatus,w as BotFlags,k as APILocales};
1
+ var r;((e)=>{e[e.Offline=0]="Offline";e[e.Booting=1]="Booting";e[e.Available=2]="Available";e[e.Busy=3]="Busy";e[e.Disconnected=4]="Disconnected"})(r||={});var m;((e)=>{e[e.Neutral=0]="Neutral";e[e.Success=1]="Success";e[e.Info=2]="Info";e[e.Warn=3]="Warn";e[e.Error=4]="Error"})(m||={});var f;((u)=>{u.Win="WIN";u.Mac="MAC";u.Psn="PSN";u.Xbl="XBL";u.Swt="SWT";u.Swt2="SWT2";u.Ios="IOS";u.And="AND";u.Ps5="PS5";u.Xsx="XSX"})(f||={});var v;((a)=>{a[a.Public=0]="Public";a[a.Private=1]="Private"})(v||={});var x;((s)=>{s[s.Equals=0]="Equals";s[s.Includes=1]="Includes";s[s.StartsWith=2]="StartsWith";s[s.EndsWith=3]="EndsWith"})(x||={});var c;((t)=>{t[t.Blacklist=0]="Blacklist";t[t.Whitelist=1]="Whitelist";t[t.Kick=2]="Kick";t[t.Block=3]="Block";t[t.RemoveFriend=4]="RemoveFriend";t[t.AddFriend=5]="AddFriend";t[t.Promote=6]="Promote";t[t.Copy=7]="Copy";t[t.Mimic=8]="Mimic";t[t.Hide=9]="Hide";t[t.Show=10]="Show"})(c||={});var o;((i)=>{i.Default="en";i.EnUS="en-US";i.Es="es";i.Es419="es-419";i.Ar="ar";i.De="de";i.Fr="fr";i.He="he";i.Id="id";i.It="it";i.Ja="ja";i.Ko="ko";i.Pl="pl";i.Pt="pt";i.PtBR="pt-BR";i.Ru="ru";i.Th="th";i.Tr="tr";i.Vi="vi";i.Zh="zh";i.ZhHant="zh-Hant"})(o||={});var k;((_)=>{_.Default="en";_.Ar="ar";_.De="de";_.Es="es";_.Es419="es-419";_.Fr="fr";_.Id="id";_.It="it";_.Ja="ja";_.Ko="ko";_.Pl="pl";_.PtBR="pt-BR";_.Ru="ru";_.Th="th";_.Tr="tr";_.Vi="vi";_.ZhHans="zh-Hans";_.ZhHant="zh-Hant"})(k||={});var j={searchLangs:["en"],platform:["AND"],privacy:0,prefixes:["!",".","/"],statusText:[],statusInterval:2,level:[-999999999],bpLevel:[999999999],extraOwners:[],admins:[],whitelistUsers:[],blacklistUsers:[],excludedAutoAddFriends:[],otherBots:[],inviteTimeout:60,maxBotsPerLobby:8,maxBotsPerLobbyWithOwner:16,maxBotsPerLobbyWithAdmin:16,maxBotsPerLobbyWithWhitelistUser:16,allowMatchmaking:!0,leaveAfterMatchmaking:!1,disableMatchmakingChecks:!0,disablePlaylistChecks:!1,disableJoinMessages:!1,disableAutomaticMessages:!1,acceptFriendRequests:!0,sendFriendRequestOnJoinParty:!1,sendFriendRequestOnMemberJoinParty:!1,runCommandsWithoutPrefix:!0,setCosmeticsWithoutCommands:!0,setCosmeticsWithPrefix:!0,acceptInvites:!0,startBannedBots:!0,usernameTriggers:[],messageContentTriggers:[],addFriendTriggers:[],memberJoinTriggers:[],changeCosmeticTriggers:[],onlyOwnerCommands:["send_number","send_all","send_category","remove_all_friends","decline_all_friends","accept_all_friends","unblock_all_users","restart_bot","restart_category","restart_shard"],onlyAdminCommands:["add_friend","remove_friend","block_user","unblock_user"],onlyWhitelistUsersCommands:["send_party","send_shard","kick","kick_all","hide_all","message","whisper","accept_friend","decline_friend","set_status","say"],onlyFriendsCommands:[],onlyPartyMembersCommands:[],onlyWhisperCommands:[],startOutfit:[{id:"CID_030_Athena_Commando_M_Halloween",variants:[1,0]},{id:"CID_029_Athena_Commando_F_Halloween",variants:[2]},{id:"CID_434_Athena_Commando_F_StealthHonor",variants:[]},{id:"CID_175_Athena_Commando_M_Celestial",variants:[]}],startBackpack:[{id:"BID_138_Celestial",variants:[]},{id:"BID_004_BlackKnight",variants:[]}],startPickaxe:[{id:"Pickaxe_ID_116_Celestial",variants:[]},{id:"Pickaxe_ID_013_Teslacoil",variants:[]}],startShoes:[],startBanner:[{id:"BRSeason01"}],startBannerColor:[{id:"DefaultColor17"},{id:"DefaultColor14"}],joinOutfit:[],joinBackpack:[],joinPickaxe:[],joinEmote:[{id:"EID_KPopDance03"}],joinShoes:[],joinBanner:[],joinBannerColor:[],memberJoinOutfit:[],memberJoinBackpack:[],memberJoinPickaxe:[],memberJoinEmote:[{id:"EID_KPopDance03"}],memberJoinShoes:[],memberJoinBanner:[],memberJoinBannerColor:[]};var p;((d)=>{d[d.RequiredParam=0]="RequiredParam";d[d.OptionalParam=1]="OptionalParam";d[d.RequiredSelect=2]="RequiredSelect";d[d.OptionalSelect=3]="OptionalSelect";d[d.RequiredNumericParam=4]="RequiredNumericParam";d[d.OptionalNumericParam=5]="OptionalNumericParam"})(p||={});var b;((n)=>{n.GenericUnknown="net.fnlb.errors.generic.unknown";n.GenericInternalError="net.fnlb.errors.generic.internal_error";n.GenericValidationFailed="net.fnlb.errors.generic.validation_failed";n.GenericParseFailed="net.fnlb.errors.generic.parse_failed";n.GenericNotFound="net.fnlb.errors.generic.not_found";n.GenericAlreadyExists="net.fnlb.errors.generic.already_exists";n.CommonInvalidRequest="net.fnlb.errors.common.invalid_request";n.CommonUnableToProcessRequest="net.fnlb.errors.common.unable_to_process_request";n.CommonInvalidFieldsLength="net.fnlb.errors.common.invalid_body_fields_length";n.CommonRateLimitExceeded="net.fnlb.errors.common.rate_limit_exceeded";n.CommonLimitExceeded="net.fnlb.errors.common.limit_exceeded";n.CommonUnableToSaveToDatabase="net.fnlb.errors.common.unable_to_save_to_database";n.CommonUpdateRequired="net.fnlb.errors.common.update_required";n.AuthInvalidToken="net.fnlb.errors.auth.invalid_token";n.AuthInvalidAPIToken="net.fnlb.errors.auth.invalid_api_token";n.AuthInvalidCaptchaToken="net.fnlb.errors.auth.invalid_captcha_token";n.AuthUnauthorized="net.fnlb.errors.auth.unauthorized";n.AuthForbidden="net.fnlb.errors.auth.forbidden";n.AuthUserBanned="net.fnlb.errors.auth.user_banned";n.Oauth2InvalidCode="net.fnlb.errors.oauth2.invalid_code";n.Oauth2InvalidScope="net.fnlb.errors.oauth2.invalid_scope";n.Oauth2TokenInvalid="net.fnlb.errors.oauth2.token_invalid";n.Oauth2UnableToFetchUser="net.fnlb.errors.oauth2.unable_to_fetch_user";n.Oauth2UnableToFetchConnections="net.fnlb.errors.oauth2.unable_to_fetch_connections";n.Oauth2UserWithoutConnection="net.fnlb.errors.oauth2.user_without_connection";n.Oauth2ConnectionNotVerified="net.fnlb.errors.oauth2.connection_not_verified";n.ReleaseNotFound="net.fnlb.errors.release.no_release_found";n.ReleaseVersionAlreadyExists="net.fnlb.errors.release.version_already_exists"})(b||={});var h;((s)=>{s.LoginInvalidCredentials="net.fnlb.errors.login.invalid_credentials";s.LoginInvalidEmail="net.fnlb.errors.login.invalid_email";s.LoginInvalidOrUsedEmail="net.fnlb.errors.login.invalid_or_used_email";s.AuthPasswordConfirmationInvalid="net.fnlb.errors.auth.invalid_password_confirmation"})(h||={});var N={...b,...h};var D;((s)=>{s.Username="username";s.Email="email";s.Password="password";s.Shared="shared"})(D||={});var O;((a)=>{a.General="general";a.Input="input"})(O||={});var w;((l)=>{l[l.Disabled=1]="Disabled";l[l.Public=2]="Public";l[l.InvalidAuth=4]="InvalidAuth"})(w||={});var J;((a)=>{a[a.Disabled=1]="Disabled";a[a.Managed=2]="Managed"})(J||={});var q;((e)=>{e[e.Staff=1]="Staff";e[e.Admin=2]="Admin";e[e.Vip=4]="Vip";e[e.Verified=8]="Verified";e[e.Banned=16]="Banned"})(q||={});export{j as defaultCategoryConfig,q as UserFlags,o as Locales,h as InputErrorCodes,b as GeneralErrorCodes,O as ErrorTypes,D as ErrorInputTypes,N as ErrorCodes,m as CommandReplyFormat,p as CommandParamType,J as CategoryFlags,x as CategoryConfigTriggerStringMatchingMethod,c as CategoryConfigTriggerAction,f as CategoryConfigSupportedPlatforms,v as CategoryConfigPartyPrivacy,r as BotStatus,w as BotFlags,k as APILocales};
@@ -1 +1 @@
1
- import{createHash as m}from"node:crypto";import{mkdir as u,readFile as p,writeFile as f}from"node:fs/promises";import{resolve as w}from"node:path";class d{lockPromise;constructor(){this.lockPromise=void 0}get isLocked(){return!!this.lockPromise}wait(){return this.lockPromise?.promise||Promise.resolve()}lock(){let e,a=new Promise((n)=>{e=n});this.lockPromise={promise:a,resolve:e}}unlock(){this.lockPromise?.resolve(),this.lockPromise=void 0}}class h{static wait(e){return new Promise((a)=>setTimeout(a,e))}}class y{storageDir;targetFileName;displayName;releaseUrl;releaseProvider;maxDownloadRetries;maxBackoffMs;initialDelayMs;staleMs;log;success;warn;error;isLoaded=!1;lastLoadedTime=0;lock=new d;constructor(e){this.storageDir=e.storageDir,this.targetFileName=e.targetFileName,this.displayName=e.displayName??e.targetFileName,this.releaseUrl=e.releaseUrl,this.releaseProvider=e.releaseProvider,this.maxDownloadRetries=e.maxDownloadRetries??1/0,this.maxBackoffMs=e.maxBackoffMs??60000,this.initialDelayMs=e.initialDelayMs??1000,this.staleMs=e.staleMs??0,this.log=e.log,this.success=e.success,this.warn=e.warn,this.error=e.error}async ensureUpToDate(e){await this.lock.wait(),this.lock.lock();try{let a=this.getFilePath(),n=e||!this.isLoaded;if(this.isLoaded&&!e&&this.staleMs>0){let t=Date.now()-this.lastLoadedTime;if(t>=this.staleMs)n=!0,this.log?.(`${this.displayName} is stale (${Math.round(t/1000)}s old), checking for updates...`)}if(!n)return a;let l=await p(a).catch(()=>null),i,r=0,o=this.initialDelayMs;this.log?.(l?"Checking for updates...":`Downloading ${this.displayName}...`);while(r<this.maxDownloadRetries)try{i=await this.fetchReleaseInfo();break}catch(t){let s=Math.min(o*2,this.maxBackoffMs);if(r++,this.error?.("Update error:",t),this.warn?.(`Check for updates attempt ${r} failed: ${t.message}. Retrying in ${s>=60000?`${~~(s/60000)}m`:`${~~(s/1000)}s`}...`),r>=this.maxDownloadRetries)break;await new Promise((c)=>setTimeout(c,o)),o=s}if(!i){if(l)return this.warn?.("Failed to check for updates. Using existing local version."),this.isLoaded=!0,this.lastLoadedTime=Date.now(),this.success?.(`Loaded existing ${this.displayName} version`),a;throw new Error("[AutoUpdater] Failed to check for updates and no local file found.")}if(l){if(m("sha256").update(l).digest("hex")===i.hash)return this.success?.(`${this.displayName} v${i.version} is up to date`),this.isLoaded=!0,this.lastLoadedTime=Date.now(),this.success?.(`Finished loading ${this.displayName} v${i.version}`),a;this.log?.(`Downloading update for ${this.displayName} v${i.version}`)}r=0,o=this.initialDelayMs;while(r<this.maxDownloadRetries)try{let t=await fetch(i.url);if(!t.ok)throw new Error(`Download failed with status ${t.status}`);let s=await t.text();if(m("sha256").update(s).digest("hex")!==i.hash)throw new Error("Downloaded file hash mismatch...");return await u(this.storageDir,{recursive:!0}).catch(()=>{throw new Error(`Failed to create the target directory on ${this.storageDir}`)}),await f(a,s),this.isLoaded=!0,this.lastLoadedTime=Date.now(),this.success?.(`Finished loading ${this.displayName} v${i.version}`),a}catch(t){let s=Math.min(o*2,this.maxBackoffMs);r++,this.error?.("Download error:",t),this.warn?.(`Download attempt ${r} failed: ${t.message}. Retrying in ${s>=60000?`${~~(s/60000)}m`:`${~~(s/1000)}s`}...`),await h.wait(o),o=s}if(l)return this.warn?.("Max retries reached. Using existing local version."),this.isLoaded=!0,this.lastLoadedTime=Date.now(),this.success?.(`Loaded existing ${this.displayName} version`),a;throw new Error(`[AutoUpdater] Failed to download and verify update after ${r} attempts`)}finally{this.lock.unlock()}}getFilePath(){return w(this.storageDir,this.targetFileName)}async fetchReleaseInfo(){if(this.releaseProvider)return this.releaseProvider();if(!this.releaseUrl)throw new Error("No release provider configured");let e=await fetch(this.releaseUrl);if(!e.ok)throw new Error(`Status code: ${e.status}`);return await e.json()}}export{y as AutoUpdater};
1
+ import{createHash as m}from"node:crypto";import{mkdir as u,readFile as f,writeFile as p}from"node:fs/promises";import{resolve as w}from"node:path";class d{lockPromise;constructor(){this.lockPromise=void 0}get isLocked(){return!!this.lockPromise}wait(){return this.lockPromise?.promise||Promise.resolve()}lock(){let e,s=new Promise((n)=>{e=n});this.lockPromise={promise:s,resolve:e}}unlock(){this.lockPromise?.resolve(),this.lockPromise=void 0}}class h{static wait(e){return new Promise((s)=>setTimeout(s,e))}}class y{storageDir;targetFileName;displayName;releaseUrl;releaseProvider;maxDownloadRetries;maxBackoffMs;initialDelayMs;staleMs;log;success;warn;error;isLoaded=!1;lastLoadedTime=0;lock=new d;constructor(e){this.storageDir=e.storageDir,this.targetFileName=e.targetFileName,this.displayName=e.displayName??e.targetFileName,this.releaseUrl=e.releaseUrl,this.releaseProvider=e.releaseProvider,this.maxDownloadRetries=e.maxDownloadRetries??1/0,this.maxBackoffMs=e.maxBackoffMs??60000,this.initialDelayMs=e.initialDelayMs??1000,this.staleMs=e.staleMs??0,this.log=e.log,this.success=e.success,this.warn=e.warn,this.error=e.error}async ensureUpToDate(e){await this.lock.wait(),this.lock.lock();try{let s=this.getFilePath(),n=e||!this.isLoaded;if(this.isLoaded&&!e&&this.staleMs>0){let t=Date.now()-this.lastLoadedTime;if(t>=this.staleMs)n=!0,this.log?.(`${this.displayName} is stale (${Math.round(t/1000)}s old), checking for updates...`)}if(!n)return s;let l=await f(s).catch(()=>null),i,r=0,o=this.initialDelayMs;this.log?.(l?"Checking for updates...":`Downloading ${this.displayName}...`);while(r<this.maxDownloadRetries)try{i=await this.fetchReleaseInfo();break}catch(t){let a=Math.min(o*2,this.maxBackoffMs);if(r++,this.error?.("Update error:",t),this.warn?.(`Check for updates attempt ${r} failed: ${t.message}. Retrying in ${a>=60000?`${~~(a/60000)}m`:`${~~(a/1000)}s`}...`),r>=this.maxDownloadRetries)break;await new Promise((c)=>setTimeout(c,o)),o=a}if(!i){if(l)return this.warn?.("Failed to check for updates. Using existing local version."),this.isLoaded=!0,this.lastLoadedTime=Date.now(),this.success?.(`Loaded existing ${this.displayName} version`),s;throw new Error("[AutoUpdater] Failed to check for updates and no local file found.")}if(l){if(m("sha256").update(l).digest("hex")===i.hash)return this.success?.(`${this.displayName} v${i.version} is up to date`),this.isLoaded=!0,this.lastLoadedTime=Date.now(),this.success?.(`Finished loading ${this.displayName} v${i.version}`),s;this.log?.(`Downloading update for ${this.displayName} v${i.version}`)}r=0,o=this.initialDelayMs;while(r<this.maxDownloadRetries)try{let t=await fetch(i.url);if(!t.ok)throw new Error(`Download failed with status ${t.status}`);let a=Buffer.from(await t.arrayBuffer());if(m("sha256").update(a).digest("hex")!==i.hash)throw new Error("Downloaded file hash mismatch...");return await u(this.storageDir,{recursive:!0}).catch(()=>{throw new Error(`Failed to create the target directory on ${this.storageDir}`)}),await p(s,a),this.isLoaded=!0,this.lastLoadedTime=Date.now(),this.success?.(`Finished loading ${this.displayName} v${i.version}`),s}catch(t){let a=Math.min(o*2,this.maxBackoffMs);r++,this.error?.("Download error:",t),this.warn?.(`Download attempt ${r} failed: ${t.message}. Retrying in ${a>=60000?`${~~(a/60000)}m`:`${~~(a/1000)}s`}...`),await h.wait(o),o=a}if(l)return this.warn?.("Max retries reached. Using existing local version."),this.isLoaded=!0,this.lastLoadedTime=Date.now(),this.success?.(`Loaded existing ${this.displayName} version`),s;throw new Error(`[AutoUpdater] Failed to download and verify update after ${r} attempts`)}finally{this.lock.unlock()}}getFilePath(){return w(this.storageDir,this.targetFileName)}async fetchReleaseInfo(){if(this.releaseProvider)return this.releaseProvider();if(!this.releaseUrl)throw new Error("No release provider configured");let e=await fetch(this.releaseUrl);if(!e.ok)throw new Error(`Status code: ${e.status}`);return await e.json()}}export{y as AutoUpdater};
@@ -16,6 +16,7 @@ declare enum Locales {
16
16
  Ar = "ar",
17
17
  De = "de",
18
18
  Fr = "fr",
19
+ He = "he",
19
20
  Id = "id",
20
21
  It = "it",
21
22
  Ja = "ja",
@@ -1 +1 @@
1
- class p{lockPromise;constructor(){this.lockPromise=void 0}get isLocked(){return!!this.lockPromise}wait(){return this.lockPromise?.promise||Promise.resolve()}lock(){let t,e=new Promise((i)=>{t=i});this.lockPromise={promise:e,resolve:t}}unlock(){this.lockPromise?.resolve(),this.lockPromise=void 0}}var u;((r)=>{r.Default="en";r.EnUS="en-US";r.Es="es";r.Es419="es-419";r.Ar="ar";r.De="de";r.Fr="fr";r.Id="id";r.It="it";r.Ja="ja";r.Ko="ko";r.Pl="pl";r.Pt="pt";r.PtBR="pt-BR";r.Ru="ru";r.Th="th";r.Tr="tr";r.Vi="vi";r.Zh="zh";r.ZhHant="zh-Hant"})(u||={});var a=new Map([["en-US","en"],["pt","pt-BR"],["zh","zh-Hans"]]),l=Object.values(u),o=new Set(l);class n{static toAPILocale(t){return a.get(t)||(o.has(t)?t:"en")}static isSupportedLocale(t){return t!==void 0&&o.has(t)}static normalizeLocale(t){let e=typeof t==="string"&&t?t:"en";if(n.isSupportedLocale(e))return e;let i=e.split("-")[0];if(n.isSupportedLocale(i))return i;let s=e.split("-")[1];if(s&&n.isSupportedLocale(`${i}-${s}`))return`${i}-${s}`;return"en"}}class m{static wait(t){return new Promise((e)=>setTimeout(e,t))}}class c extends Map{ttl;constructor(t){super();this.ttl=t}pull(t){return super.get(t)?.value}push(t,e){let i=setTimeout(()=>this.delete(t),this.ttl);return super.set(t,{handle:i,value:e})}remove(t){let e=this.get(t);if(e)clearTimeout(e.handle);return super.delete(t)}modify(t,e){let i=super.get(t);if(i)return i.value=e,!0;return!1}}class d{static cutText(t,e,i=!0){return t.length>e?`${t.slice(0,i?Math.max(e-3,0):e)}${i?"...":""}`:t}}export{d as TextUtil,c as TemporalMap,o as SUPPORTED_LOCALES_SET,l as SUPPORTED_LOCALES,m as PromiseUtil,n as LocaleHelper,p as AsyncLock};
1
+ class p{lockPromise;constructor(){this.lockPromise=void 0}get isLocked(){return!!this.lockPromise}wait(){return this.lockPromise?.promise||Promise.resolve()}lock(){let e,r=new Promise((i)=>{e=i});this.lockPromise={promise:r,resolve:e}}unlock(){this.lockPromise?.resolve(),this.lockPromise=void 0}}var u;((t)=>{t.Default="en";t.EnUS="en-US";t.Es="es";t.Es419="es-419";t.Ar="ar";t.De="de";t.Fr="fr";t.He="he";t.Id="id";t.It="it";t.Ja="ja";t.Ko="ko";t.Pl="pl";t.Pt="pt";t.PtBR="pt-BR";t.Ru="ru";t.Th="th";t.Tr="tr";t.Vi="vi";t.Zh="zh";t.ZhHant="zh-Hant"})(u||={});var a=new Map([["en-US","en"],["pt","pt-BR"],["zh","zh-Hans"],["he","en"]]),l=Object.values(u),o=new Set(l);class n{static toAPILocale(e){return a.get(e)||(o.has(e)?e:"en")}static isSupportedLocale(e){return e!==void 0&&o.has(e)}static normalizeLocale(e){let r=typeof e==="string"&&e?e:"en";if(n.isSupportedLocale(r))return r;let i=r.split("-")[0];if(n.isSupportedLocale(i))return i;let s=r.split("-")[1];if(s&&n.isSupportedLocale(`${i}-${s}`))return`${i}-${s}`;return"en"}}class m{static wait(e){return new Promise((r)=>setTimeout(r,e))}}class d extends Map{ttl;constructor(e){super();this.ttl=e}pull(e){return super.get(e)?.value}push(e,r){let i=setTimeout(()=>this.delete(e),this.ttl);return super.set(e,{handle:i,value:r})}remove(e){let r=this.get(e);if(r)clearTimeout(r.handle);return super.delete(e)}modify(e,r){let i=super.get(e);if(i)return i.value=r,!0;return!1}}class c{static cutText(e,r,i=!0){return e.length>r?`${e.slice(0,i?Math.max(r-3,0):r)}${i?"...":""}`:e}}export{c as TextUtil,d as TemporalMap,o as SUPPORTED_LOCALES_SET,l as SUPPORTED_LOCALES,m as PromiseUtil,n as LocaleHelper,p as AsyncLock};
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@fnlb-project/shared",
3
- "version": "1.5.68",
3
+ "version": "1.5.70",
4
4
  "description": "FNLB Shared Library",
5
5
  "files": ["dist"],
6
6
  "author": "FNLB-Project",