@pushmesh/sdk 0.7.3-rc.5 → 0.7.4
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.
- package/dist/cjs/perfil.d.ts +1 -1
- package/dist/cjs/perfil.js +1 -1
- package/dist/cjs/players.d.ts +1 -0
- package/dist/cjs/players.js +1 -1
- package/dist/cjs/queue.js +1 -1
- package/package.json +1 -1
package/dist/cjs/perfil.d.ts
CHANGED
|
@@ -20,7 +20,7 @@
|
|
|
20
20
|
* linha sozinho (script `version` → scripts/sync-versao.mjs); editando à mão,
|
|
21
21
|
* suba as duas.
|
|
22
22
|
*/
|
|
23
|
-
export declare const SDK_VERSAO = "0.7.
|
|
23
|
+
export declare const SDK_VERSAO = "0.7.4";
|
|
24
24
|
export interface PerfilDispositivo {
|
|
25
25
|
device_os?: string;
|
|
26
26
|
fabricante?: string;
|
package/dist/cjs/perfil.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
"use strict";Object.defineProperty(exports,"__esModule",{value:true}),exports.SDK_VERSAO=void 0,exports.coletarPerfil=coletarPerfil;const react_native_1=require("react-native"),storage_1=require("./storage");function moduloPerfil(){const mods=react_native_1.NativeModules;return"ios"===react_native_1.Platform.OS?mods.PushMeshApns:mods.PushMeshFirebase}function timezoneId(){try{return Intl.DateTimeFormat().resolvedOptions().timeZone||void 0}catch{return}}function pais(){try{const loc=Intl.DateTimeFormat().resolvedOptions().locale,m=/[-_]([A-Za-z]{2})(?:[-_]|$)/.exec(loc);return m?m[1].toUpperCase():void 0}catch{return}}async function proximaSessao(){const atual=Number(await(0,storage_1.getItem)(storage_1.KEYS.sessoes)??"0"),proxima=Number.isFinite(atual)&&atual>=0?atual+1:1;return await(0,storage_1.setItem)(storage_1.KEYS.sessoes,String(proxima)),proxima}function semVazios(p){const out={};for(const[k,v]of Object.entries(p))null!=v&&""!==v&&(out[k]=v);return out}async function coletarPerfil(){const perfil={sdk_versao:exports.SDK_VERSAO,timezone_id:timezoneId(),pais:pais()};try{perfil.sessoes=await proximaSessao()}catch{}try{const nativo=moduloPerfil();if(nativo?.perfilDispositivo){const n=await nativo.perfilDispositivo();Object.assign(perfil,{device_os:n.device_os,fabricante:n.fabricante,modelo:n.modelo,net_type:n.net_type,carrier:n.carrier,rooted:n.rooted,standby_bucket:n.standby_bucket,bateria_irrestrita:n.bateria_irrestrita,notif_permissoes:n.notif_permissoes,instalacao_id:n.instalacao_id})}}catch{}if(!perfil.device_os){const v=react_native_1.Platform.Version;perfil.device_os="string"==typeof v?v:String(v)}if(!perfil.fabricante){const c=react_native_1.Platform.constants;perfil.fabricante="ios"===react_native_1.Platform.OS?"Apple":c?.Manufacturer}return semVazios(perfil)}exports.SDK_VERSAO="0.7.
|
|
1
|
+
"use strict";Object.defineProperty(exports,"__esModule",{value:true}),exports.SDK_VERSAO=void 0,exports.coletarPerfil=coletarPerfil;const react_native_1=require("react-native"),storage_1=require("./storage");function moduloPerfil(){const mods=react_native_1.NativeModules;return"ios"===react_native_1.Platform.OS?mods.PushMeshApns:mods.PushMeshFirebase}function timezoneId(){try{return Intl.DateTimeFormat().resolvedOptions().timeZone||void 0}catch{return}}function pais(){try{const loc=Intl.DateTimeFormat().resolvedOptions().locale,m=/[-_]([A-Za-z]{2})(?:[-_]|$)/.exec(loc);return m?m[1].toUpperCase():void 0}catch{return}}async function proximaSessao(){const atual=Number(await(0,storage_1.getItem)(storage_1.KEYS.sessoes)??"0"),proxima=Number.isFinite(atual)&&atual>=0?atual+1:1;return await(0,storage_1.setItem)(storage_1.KEYS.sessoes,String(proxima)),proxima}function semVazios(p){const out={};for(const[k,v]of Object.entries(p))null!=v&&""!==v&&(out[k]=v);return out}async function coletarPerfil(){const perfil={sdk_versao:exports.SDK_VERSAO,timezone_id:timezoneId(),pais:pais()};try{perfil.sessoes=await proximaSessao()}catch{}try{const nativo=moduloPerfil();if(nativo?.perfilDispositivo){const n=await nativo.perfilDispositivo();Object.assign(perfil,{device_os:n.device_os,fabricante:n.fabricante,modelo:n.modelo,net_type:n.net_type,carrier:n.carrier,rooted:n.rooted,standby_bucket:n.standby_bucket,bateria_irrestrita:n.bateria_irrestrita,notif_permissoes:n.notif_permissoes,instalacao_id:n.instalacao_id})}}catch{}if(!perfil.device_os){const v=react_native_1.Platform.Version;perfil.device_os="string"==typeof v?v:String(v)}if(!perfil.fabricante){const c=react_native_1.Platform.constants;perfil.fabricante="ios"===react_native_1.Platform.OS?"Apple":c?.Manufacturer}return semVazios(perfil)}exports.SDK_VERSAO="0.7.4";
|
package/dist/cjs/players.d.ts
CHANGED
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import { type PushMeshConfig } from './types';
|
|
2
2
|
export declare function buildRegisterPayload(): Record<string, unknown>;
|
|
3
|
+
export declare function registroPerdido(origem: string): Promise<void>;
|
|
3
4
|
/** Registra (ou atualiza) o device no servidor. Idempotente via hash do payload. */
|
|
4
5
|
export declare function register(): Promise<string | null>;
|
|
5
6
|
/**
|
package/dist/cjs/players.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
"use strict";var __createBinding=this&&this.__createBinding||(Object.create?function(o,m,k,k2){void 0===k2&&(k2=k);var desc=Object.getOwnPropertyDescriptor(m,k);desc&&!("get"in desc?!m.__esModule:desc.writable||desc.configurable)||(desc={enumerable:true,get:function(){return m[k]}}),Object.defineProperty(o,k2,desc)}:function(o,m,k,k2){void 0===k2&&(k2=k),o[k2]=m[k]}),__setModuleDefault=this&&this.__setModuleDefault||(Object.create?function(o,v){Object.defineProperty(o,"default",{enumerable:true,value:v})}:function(o,v){o.default=v}),__importStar=this&&this.__importStar||function(){var ownKeys=function(o){return ownKeys=Object.getOwnPropertyNames||function(o){var ar=[];for(var k in o)Object.prototype.hasOwnProperty.call(o,k)&&(ar[ar.length]=k);return ar},ownKeys(o)};return function(mod){if(mod&&mod.__esModule)return mod;var result={};if(null!=mod)for(var k=ownKeys(mod),i=0;i<k.length;i++)"default"!==k[i]&&__createBinding(result,mod,k[i]);return __setModuleDefault(result,mod),result}}();Object.defineProperty(exports,"__esModule",{value:true}),exports.payloadHash=payloadHash,exports.buildRegisterPayload=buildRegisterPayload,exports.__resetRegistroForTests=__resetRegistroForTests,exports.register=register,exports.login=login,exports.logout=logout,exports.init=init,exports.setToken=setToken,exports.getPlayerId=getPlayerId;const react_native_1=require("react-native"),http_1=require("./http"),perfil_1=require("./perfil"),queue_1=require("./queue"),state_1=require("./state"),storage_1=require("./storage"),types_1=require("./types"),GERACAO_REGISTRO=5;function payloadHash(payload){const{sessoes:_sessoes,...semSessoes}=payload,dia=(new Date).toISOString().slice(0,10),s=`g${GERACAO_REGISTRO}|d${dia}|${JSON.stringify(semSessoes,Object.keys(semSessoes).sort())}`;let h=2166136261;for(let i=0;i<s.length;i++)h^=s.charCodeAt(i),h=Math.imul(h,16777619);return(h>>>0).toString(16)}function resolveDeviceType(config){return config.deviceType&&"auto"!==config.deviceType?config.deviceType:"ios"===react_native_1.Platform.OS?types_1.RpDeviceType.IOS:types_1.RpDeviceType.Android}function resolveDeviceModel(config){if(config.deviceModel)return config.deviceModel;const constants=react_native_1.Platform.constants;return constants?.Model}function resolveLanguage(){try{return Intl.DateTimeFormat().resolvedOptions().locale}catch{return}}function resolveTimezoneOffsetSegundos(){try{const off=60*-(new Date).getTimezoneOffset();return Number.isFinite(off)?off:void 0}catch{return}}function buildRegisterPayload(){const config=(0,state_1.requireConfig)();if(!state_1.state.token)throw new Error("[PushMesh] sem token de push. Como corrigir: passe config.getToken no init ou chame PushMesh.setToken(token) quando o Firebase entregar o token.");const payload={app_id:config.appId,identifier:state_1.state.token,device_type:resolveDeviceType(config)};state_1.state.transporte&&(payload.transporte=state_1.state.transporte),state_1.state.externalUserId?payload.external_user_id=state_1.state.externalUserId:state_1.state.logoutPendente&&(payload.external_user_id=null),config.appVersion&&(payload.app_version=config.appVersion);const model=resolveDeviceModel(config);model&&(payload.device_model=model);const language=resolveLanguage();language&&(payload.language=language);const timezone=resolveTimezoneOffsetSegundos();void 0!==timezone&&(payload.timezone=timezone);const{modelo:modeloPerfil,...perfilSemModelo}=state_1.state.perfil;return Object.assign(payload,perfilSemModelo),!payload.device_model&&modeloPerfil&&(payload.device_model=modeloPerfil),payload}let registroEmVoo=null;function __resetRegistroForTests(){registroEmVoo=null}async function register(){const hash=payloadHash(buildRegisterPayload());if(registroEmVoo?.hash===hash)return registroEmVoo.promessa;const entrada={hash:hash,promessa:(registroEmVoo?.promessa??Promise.resolve(null)).then(registrarAgora,registrarAgora)};registroEmVoo=entrada;const liberar=()=>{registroEmVoo===entrada&&(registroEmVoo=null)};return entrada.promessa.then(liberar,liberar),entrada.promessa}async function registrarAgora(){const payload=buildRegisterPayload(),hash=payloadHash(payload),cachedHash=await(0,storage_1.getItem)(storage_1.KEYS.regHash),cachedPlayerId=await(0,storage_1.getItem)(storage_1.KEYS.playerId);if(cachedHash===hash&&cachedPlayerId)return state_1.state.playerId=cachedPlayerId,cachedPlayerId;const res=await(0,http_1.post)("/api/v1/players",payload);if(!res.ok)return console.warn(`[PushMesh] POST /players respondeu ${res.status}`),null;const body=res.json;if(!body?.id)return console.warn("[PushMesh] POST /players sem id na resposta"),null;state_1.state.playerId=body.id,await(0,storage_1.setItem)(storage_1.KEYS.playerId,body.id),await(0,storage_1.setItem)(storage_1.KEYS.regHash,hash),state_1.state.logoutPendente&&(state_1.state.logoutPendente=false,await(0,storage_1.removeItem)(storage_1.KEYS.logoutPendente));const{sincronizarReciboNativo:sincronizarReciboNativo}=await Promise.resolve().then(()=>__importStar(require("./zeroconfig")));await sincronizarReciboNativo(body.id).catch(()=>{});const{syncTagsPendentes:syncTagsPendentes}=await Promise.resolve().then(()=>__importStar(require("./tags")));return await syncTagsPendentes().catch(()=>{}),body.id}async function login(externalUserId){(0,state_1.requireConfig)(),state_1.state.externalUserId=externalUserId,await(0,storage_1.setItem)(storage_1.KEYS.externalUserId,externalUserId),state_1.state.logoutPendente=false,await(0,storage_1.removeItem)(storage_1.KEYS.logoutPendente);const playerId=await ensurePlayerId();playerId&&await(0,queue_1.sendOrQueue)("PUT",`/api/v1/players/${playerId}`,{app_id:(0,state_1.requireConfig)().appId,external_user_id:externalUserId})}async function logout(){(0,state_1.requireConfig)(),state_1.state.externalUserId=null,await(0,storage_1.removeItem)(storage_1.KEYS.externalUserId),state_1.state.logoutPendente=true,await(0,storage_1.setItem)(storage_1.KEYS.logoutPendente,"1");const playerId=state_1.state.playerId??await(0,storage_1.getItem)(storage_1.KEYS.playerId);playerId&&await(0,queue_1.sendOrQueue)("PUT",`/api/v1/players/${playerId}`,{app_id:(0,state_1.requireConfig)().appId,external_user_id:null})}async function ensurePlayerId(){if(state_1.state.playerId)return state_1.state.playerId;const cached=await(0,storage_1.getItem)(storage_1.KEYS.playerId);return cached&&(state_1.state.playerId=cached),cached}function textoOutroAppId(anterior,novo){return`[PushMesh] init com appId ${novo}, mas o SDK já está inicializado com ${anterior}. Como corrigir: o SDK é singleton do processo — use UM appId no boot do app.`}async function init(config){if(!config.appId)throw new Error("[PushMesh] config.appId é obrigatório.");if(state_1.state.initEmVoo){if(state_1.state.config&&state_1.state.config.appId!==config.appId)throw new Error(textoOutroAppId(state_1.state.config.appId,config.appId));return state_1.state.initEmVoo}const promessa=bootstrap(config);state_1.state.initEmVoo=promessa;try{await promessa}finally{state_1.state.initEmVoo=null}}async function bootstrap(config){state_1.state.config&&state_1.state.config.appId!==config.appId&&console.warn(textoOutroAppId(state_1.state.config.appId,config.appId));const baseUrl=config.baseUrl?.trim()||state_1.BASE_URL_PADRAO;if((0,state_1.validarBaseUrl)(baseUrl),state_1.state.config={...config,baseUrl:baseUrl},config=state_1.state.config,state_1.state.perfil=await(0,perfil_1.coletarPerfil)(),state_1.state.playerId=await(0,storage_1.getItem)(storage_1.KEYS.playerId),state_1.state.token=await(0,storage_1.getItem)(storage_1.KEYS.token),state_1.state.transporte="apns"===await(0,storage_1.getItem)(storage_1.KEYS.transporte)?"apns":null,state_1.state.externalUserId=await(0,storage_1.getItem)(storage_1.KEYS.externalUserId),state_1.state.logoutPendente="1"===await(0,storage_1.getItem)(storage_1.KEYS.logoutPendente),config.externalUserId&&config.externalUserId!==state_1.state.externalUserId&&await login(config.externalUserId).catch(e=>console.warn("[PushMesh] externalUserId do init não propagou agora — vai no registro",e)),config.getToken){state_1.state.transporte&&(state_1.state.transporte=null,await(0,storage_1.removeItem)(storage_1.KEYS.transporte));try{const token=await config.getToken();token&&token!==state_1.state.token&&(state_1.state.token=token,await(0,storage_1.setItem)(storage_1.KEYS.token,token))}catch(e){console.warn("[PushMesh] config.getToken falhou",e)}}else if("android"===react_native_1.Platform.OS){const{bootZeroConfigAndroid:bootZeroConfigAndroid}=await Promise.resolve().then(()=>__importStar(require("./zeroconfig")));await bootZeroConfigAndroid()}else{const{bootZeroConfigIos:bootZeroConfigIos}=await Promise.resolve().then(()=>__importStar(require("./zeroconfig")));await bootZeroConfigIos()}if(state_1.state.token)try{await register()}catch(e){console.warn("[PushMesh] registro falhou (rede?) — retenta no próximo boot",e)}if(!config.getToken)try{const zc=await Promise.resolve().then(()=>__importStar(require("./zeroconfig")));"android"===react_native_1.Platform.OS?(await zc.drenarMensagensPendentes(),await zc.processarCliqueInicial()):await zc.processarCliquePendenteIos()}catch(e){console.warn("[PushMesh] falha no pós-registro do zero-config (buffer/clique)",e)}await(0,queue_1.flushQueue)().catch(()=>{})}async function setToken(token){if(token&&token!==state_1.state.token&&(state_1.state.token=token,await(0,storage_1.setItem)(storage_1.KEYS.token,token),state_1.state.config))try{await register()}catch(e){console.warn("[PushMesh] registro pós-setToken falhou",e)}}async function getPlayerId(){return ensurePlayerId()}
|
|
1
|
+
"use strict";var __createBinding=this&&this.__createBinding||(Object.create?function(o,m,k,k2){void 0===k2&&(k2=k);var desc=Object.getOwnPropertyDescriptor(m,k);desc&&!("get"in desc?!m.__esModule:desc.writable||desc.configurable)||(desc={enumerable:true,get:function(){return m[k]}}),Object.defineProperty(o,k2,desc)}:function(o,m,k,k2){void 0===k2&&(k2=k),o[k2]=m[k]}),__setModuleDefault=this&&this.__setModuleDefault||(Object.create?function(o,v){Object.defineProperty(o,"default",{enumerable:true,value:v})}:function(o,v){o.default=v}),__importStar=this&&this.__importStar||function(){var ownKeys=function(o){return ownKeys=Object.getOwnPropertyNames||function(o){var ar=[];for(var k in o)Object.prototype.hasOwnProperty.call(o,k)&&(ar[ar.length]=k);return ar},ownKeys(o)};return function(mod){if(mod&&mod.__esModule)return mod;var result={};if(null!=mod)for(var k=ownKeys(mod),i=0;i<k.length;i++)"default"!==k[i]&&__createBinding(result,mod,k[i]);return __setModuleDefault(result,mod),result}}();Object.defineProperty(exports,"__esModule",{value:true}),exports.payloadHash=payloadHash,exports.buildRegisterPayload=buildRegisterPayload,exports.__resetRegistroForTests=__resetRegistroForTests,exports.registroPerdido=registroPerdido,exports.__resetRegistroPerdidoForTests=__resetRegistroPerdidoForTests,exports.register=register,exports.login=login,exports.logout=logout,exports.init=init,exports.setToken=setToken,exports.getPlayerId=getPlayerId;const react_native_1=require("react-native"),http_1=require("./http"),perfil_1=require("./perfil"),queue_1=require("./queue"),state_1=require("./state"),storage_1=require("./storage"),types_1=require("./types"),GERACAO_REGISTRO=5;function payloadHash(payload){const{sessoes:_sessoes,...semSessoes}=payload,dia=(new Date).toISOString().slice(0,10),s=`g${GERACAO_REGISTRO}|d${dia}|${JSON.stringify(semSessoes,Object.keys(semSessoes).sort())}`;let h=2166136261;for(let i=0;i<s.length;i++)h^=s.charCodeAt(i),h=Math.imul(h,16777619);return(h>>>0).toString(16)}function resolveDeviceType(config){return config.deviceType&&"auto"!==config.deviceType?config.deviceType:"ios"===react_native_1.Platform.OS?types_1.RpDeviceType.IOS:types_1.RpDeviceType.Android}function resolveDeviceModel(config){if(config.deviceModel)return config.deviceModel;const constants=react_native_1.Platform.constants;return constants?.Model}function resolveLanguage(){try{return Intl.DateTimeFormat().resolvedOptions().locale}catch{return}}function resolveTimezoneOffsetSegundos(){try{const off=60*-(new Date).getTimezoneOffset();return Number.isFinite(off)?off:void 0}catch{return}}function buildRegisterPayload(){const config=(0,state_1.requireConfig)();if(!state_1.state.token)throw new Error("[PushMesh] sem token de push. Como corrigir: passe config.getToken no init ou chame PushMesh.setToken(token) quando o Firebase entregar o token.");const payload={app_id:config.appId,identifier:state_1.state.token,device_type:resolveDeviceType(config)};state_1.state.transporte&&(payload.transporte=state_1.state.transporte),state_1.state.externalUserId?payload.external_user_id=state_1.state.externalUserId:state_1.state.logoutPendente&&(payload.external_user_id=null),config.appVersion&&(payload.app_version=config.appVersion);const model=resolveDeviceModel(config);model&&(payload.device_model=model);const language=resolveLanguage();language&&(payload.language=language);const timezone=resolveTimezoneOffsetSegundos();void 0!==timezone&&(payload.timezone=timezone);const{modelo:modeloPerfil,...perfilSemModelo}=state_1.state.perfil;return Object.assign(payload,perfilSemModelo),!payload.device_model&&modeloPerfil&&(payload.device_model=modeloPerfil),payload}let registroEmVoo=null;function __resetRegistroForTests(){registroEmVoo=null}let registroPerdidoTratado=false;async function registroPerdido(origem){registroPerdidoTratado||(registroPerdidoTratado=true,console.warn(`[PushMesh] o servidor não conhece mais este aparelho (404 em ${origem}) — o registro local será refeito agora. Se a audiência foi apagada no painel, isto é o aparelho voltando sozinho.`),state_1.state.playerId=null,await(0,storage_1.removeItem)(storage_1.KEYS.playerId),await(0,storage_1.removeItem)(storage_1.KEYS.regHash),await register())}function __resetRegistroPerdidoForTests(){registroPerdidoTratado=false}async function register(){const hash=payloadHash(buildRegisterPayload());if(registroEmVoo?.hash===hash)return registroEmVoo.promessa;const entrada={hash:hash,promessa:(registroEmVoo?.promessa??Promise.resolve(null)).then(registrarAgora,registrarAgora)};registroEmVoo=entrada;const liberar=()=>{registroEmVoo===entrada&&(registroEmVoo=null)};return entrada.promessa.then(liberar,liberar),entrada.promessa}async function registrarAgora(){const payload=buildRegisterPayload(),hash=payloadHash(payload),cachedHash=await(0,storage_1.getItem)(storage_1.KEYS.regHash),cachedPlayerId=await(0,storage_1.getItem)(storage_1.KEYS.playerId);if(cachedHash===hash&&cachedPlayerId)return state_1.state.playerId=cachedPlayerId,cachedPlayerId;const res=await(0,http_1.post)("/api/v1/players",payload);if(!res.ok)return console.warn(`[PushMesh] POST /players respondeu ${res.status}`),null;const body=res.json;if(!body?.id)return console.warn("[PushMesh] POST /players sem id na resposta"),null;state_1.state.playerId=body.id,await(0,storage_1.setItem)(storage_1.KEYS.playerId,body.id),await(0,storage_1.setItem)(storage_1.KEYS.regHash,hash),state_1.state.logoutPendente&&(state_1.state.logoutPendente=false,await(0,storage_1.removeItem)(storage_1.KEYS.logoutPendente));const{sincronizarReciboNativo:sincronizarReciboNativo}=await Promise.resolve().then(()=>__importStar(require("./zeroconfig")));await sincronizarReciboNativo(body.id).catch(()=>{});const{syncTagsPendentes:syncTagsPendentes}=await Promise.resolve().then(()=>__importStar(require("./tags")));return await syncTagsPendentes().catch(()=>{}),body.id}async function login(externalUserId){(0,state_1.requireConfig)(),state_1.state.externalUserId=externalUserId,await(0,storage_1.setItem)(storage_1.KEYS.externalUserId,externalUserId),state_1.state.logoutPendente=false,await(0,storage_1.removeItem)(storage_1.KEYS.logoutPendente);const playerId=await ensurePlayerId();playerId&&await(0,queue_1.sendOrQueue)("PUT",`/api/v1/players/${playerId}`,{app_id:(0,state_1.requireConfig)().appId,external_user_id:externalUserId})}async function logout(){(0,state_1.requireConfig)(),state_1.state.externalUserId=null,await(0,storage_1.removeItem)(storage_1.KEYS.externalUserId),state_1.state.logoutPendente=true,await(0,storage_1.setItem)(storage_1.KEYS.logoutPendente,"1");const playerId=state_1.state.playerId??await(0,storage_1.getItem)(storage_1.KEYS.playerId);playerId&&await(0,queue_1.sendOrQueue)("PUT",`/api/v1/players/${playerId}`,{app_id:(0,state_1.requireConfig)().appId,external_user_id:null})}async function ensurePlayerId(){if(state_1.state.playerId)return state_1.state.playerId;const cached=await(0,storage_1.getItem)(storage_1.KEYS.playerId);return cached&&(state_1.state.playerId=cached),cached}function textoOutroAppId(anterior,novo){return`[PushMesh] init com appId ${novo}, mas o SDK já está inicializado com ${anterior}. Como corrigir: o SDK é singleton do processo — use UM appId no boot do app.`}async function init(config){if(!config.appId)throw new Error("[PushMesh] config.appId é obrigatório.");if(state_1.state.initEmVoo){if(state_1.state.config&&state_1.state.config.appId!==config.appId)throw new Error(textoOutroAppId(state_1.state.config.appId,config.appId));return state_1.state.initEmVoo}const promessa=bootstrap(config);state_1.state.initEmVoo=promessa;try{await promessa}finally{state_1.state.initEmVoo=null}}async function bootstrap(config){state_1.state.config&&state_1.state.config.appId!==config.appId&&console.warn(textoOutroAppId(state_1.state.config.appId,config.appId));const baseUrl=config.baseUrl?.trim()||state_1.BASE_URL_PADRAO;if((0,state_1.validarBaseUrl)(baseUrl),state_1.state.config={...config,baseUrl:baseUrl},config=state_1.state.config,state_1.state.perfil=await(0,perfil_1.coletarPerfil)(),state_1.state.playerId=await(0,storage_1.getItem)(storage_1.KEYS.playerId),state_1.state.token=await(0,storage_1.getItem)(storage_1.KEYS.token),state_1.state.transporte="apns"===await(0,storage_1.getItem)(storage_1.KEYS.transporte)?"apns":null,state_1.state.externalUserId=await(0,storage_1.getItem)(storage_1.KEYS.externalUserId),state_1.state.logoutPendente="1"===await(0,storage_1.getItem)(storage_1.KEYS.logoutPendente),config.externalUserId&&config.externalUserId!==state_1.state.externalUserId&&await login(config.externalUserId).catch(e=>console.warn("[PushMesh] externalUserId do init não propagou agora — vai no registro",e)),config.getToken){state_1.state.transporte&&(state_1.state.transporte=null,await(0,storage_1.removeItem)(storage_1.KEYS.transporte));try{const token=await config.getToken();token&&token!==state_1.state.token&&(state_1.state.token=token,await(0,storage_1.setItem)(storage_1.KEYS.token,token))}catch(e){console.warn("[PushMesh] config.getToken falhou",e)}}else if("android"===react_native_1.Platform.OS){const{bootZeroConfigAndroid:bootZeroConfigAndroid}=await Promise.resolve().then(()=>__importStar(require("./zeroconfig")));await bootZeroConfigAndroid()}else{const{bootZeroConfigIos:bootZeroConfigIos}=await Promise.resolve().then(()=>__importStar(require("./zeroconfig")));await bootZeroConfigIos()}if(state_1.state.token)try{await register()}catch(e){console.warn("[PushMesh] registro falhou (rede?) — retenta no próximo boot",e)}if(!config.getToken)try{const zc=await Promise.resolve().then(()=>__importStar(require("./zeroconfig")));"android"===react_native_1.Platform.OS?(await zc.drenarMensagensPendentes(),await zc.processarCliqueInicial()):await zc.processarCliquePendenteIos()}catch(e){console.warn("[PushMesh] falha no pós-registro do zero-config (buffer/clique)",e)}await(0,queue_1.flushQueue)().catch(()=>{})}async function setToken(token){if(token&&token!==state_1.state.token&&(state_1.state.token=token,await(0,storage_1.setItem)(storage_1.KEYS.token,token),state_1.state.config))try{await register()}catch(e){console.warn("[PushMesh] registro pós-setToken falhou",e)}}async function getPlayerId(){return ensurePlayerId()}
|
package/dist/cjs/queue.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
"use strict";Object.defineProperty(exports,"__esModule",{value:true}),exports.FLUSH_CONCURRENCY=void 0,exports.__resetQueueForTests=__resetQueueForTests,exports.__drainQueueLockForTests=__drainQueueLockForTests,exports.backoffMs=backoffMs,exports.enqueue=enqueue,exports.sendOrQueue=sendOrQueue,exports.flushQueue=flushQueue;const http_1=require("./http"),storage_1=require("./storage"),state_1=require("./state"),MAX_ATTEMPTS=10,MAX_QUEUE_ITEMS=500,BASE_DELAY_MS=1e3,MAX_DELAY_MS=3e5,JITTER_MS=1e3;exports.FLUSH_CONCURRENCY=5;let localId=0,ultimoNascimento=0;function agoraMonotonico(){return ultimoNascimento=Math.max(Date.now(),ultimoNascimento+1),ultimoNascimento}function nextId(){return localId+=1,`${agoraMonotonico()}-${localId}`}function criadoEm(item){return Number(item.id.split("-")[0])||0}function chaveEstado(item){if("PUT"!==item.method)return null;const campos=Object.keys(item.body).filter(c=>"app_id"!==c).sort().join(",");return`${item.path}#${campos}`}const superadoEm=new Map;function marcarSuperado(chave,quando){chave&&quando>(superadoEm.get(chave)??0)&&superadoEm.set(chave,quando)}function estaSuperado(item){const chave=chaveEstado(item);return null!==chave&&(superadoEm.get(chave)??0)>criadoEm(item)}function avisaDescarte(item,motivo){console.warn(`[PushMesh] ${item.method} ${item.path} descartado — ${motivo}`)}function coalescer(itens){const posicao=new Map,saida=[];for(const item of itens){if(estaSuperado(item))continue;const chave=chaveEstado(item);if(null===chave){saida.push(item);continue}const idx=posicao.get(chave);void 0===idx?posicao.set(chave,saida.push(item)-1):criadoEm(item)>=criadoEm(saida[idx])&&(saida[idx]=item)}return saida}let naoPersistidos=[];function __resetQueueForTests(){superadoEm.clear(),naoPersistidos=[]}function guardarEmMemoria(itens){naoPersistidos.push(...itens),naoPersistidos.length>MAX_QUEUE_ITEMS&&naoPersistidos.splice(0,naoPersistidos.length-MAX_QUEUE_ITEMS)}let cadeia=Promise.resolve();function comTrava(op){const proxima=cadeia.then(op,op);return cadeia=proxima.then(()=>{},()=>{}),proxima}async function __drainQueueLockForTests(){await cadeia}function backoffMs(attempts,jitter=Math.random){return Math.min(BASE_DELAY_MS*2**attempts,MAX_DELAY_MS)+Math.floor(jitter()*JITTER_MS)}async function enqueue(method,path,body,delayMs=0){const novo={id:nextId(),method:method,path:path,body:body,attempts:0,nextAttemptAt:Date.now()+delayMs};marcarSuperado(chaveEstado(novo),criadoEm(novo)),await comTrava(async()=>{const{valor:valor,falhou:falhou}=await(0,storage_1.getJsonSeguro)(storage_1.KEYS.queue,[]);if(falhou)return guardarEmMemoria([novo]),void console.warn("[PushMesh] fila ilegível agora (storage ocupado) — item guardado em memória");const queue=coalescer([...valor,...naoPersistidos,novo]);if(naoPersistidos=[],queue.length>MAX_QUEUE_ITEMS){const descartados=queue.length-MAX_QUEUE_ITEMS;queue.splice(0,descartados),console.warn(`[PushMesh] fila cheia (teto ${MAX_QUEUE_ITEMS}) — ${descartados} item(ns) antigo(s) descartado(s)`)}await(0,storage_1.setJson)(storage_1.KEYS.queue,queue)})}async function sendOrQueue(method,path,body){const nascimento=agoraMonotonico();try{const res=await(0,http_1.request)(method,path,body);return 429===res.status||res.status>=500?(await enqueue(method,path,body,res.retryAfterMs??backoffMs(1)),true):res.ok?(marcarSuperado(chaveEstado({method:method,path:path,body:body}),nascimento),await purgarSuperados(),true):(avisaDescarte({method:method,path:path},`${res.status}: retry não corrige payload inválido`),false)}catch(e){if(e instanceof http_1.NetworkError)return await enqueue(method,path,body),true;throw e}}async function purgarSuperados(){await comTrava(async()=>{const{valor:valor,falhou:falhou}=await(0,storage_1.getJsonSeguro)(storage_1.KEYS.queue,[]);if(!falhou&&valor.length>0){const vivos=valor.filter(item=>!estaSuperado(item));vivos.length!==valor.length&&await(0,storage_1.setJson)(storage_1.KEYS.queue,vivos)}const{valor:emVoo,falhou:falhouVoo}=await(0,storage_1.getJsonSeguro)(storage_1.KEYS.queueInflight,[]);if(!falhouVoo&&emVoo.length>0){const vivosVoo=emVoo.filter(item=>!estaSuperado(item));vivosVoo.length!==emVoo.length&&await(0,storage_1.setJson)(storage_1.KEYS.queueInflight,vivosVoo)}})}async function resolverPlayer(item){if(null!==item.body.player_id)return true;const playerId=state_1.state.playerId??await(0,storage_1.getItem)(storage_1.KEYS.playerId);return!!playerId&&(item.body={...item.body,player_id:playerId},true)}async function processItem(item,now){const retry=(delayMs,attempts)=>attempts<10?{...item,attempts:attempts,nextAttemptAt:now+delayMs}:(avisaDescarte(item,"10 tentativas sem sucesso — desistindo"),null);if(estaSuperado(item))return avisaDescarte(item,"escrita mais nova do mesmo campo já foi enviada"),null;if(!await resolverPlayer(item))return{...item,nextAttemptAt:now+backoffMs(item.attempts+1)};try{const res=await(0,http_1.request)(item.method,item.path,item.body);return res.ok?null:429===res.status||res.status>=500?retry(res.retryAfterMs??backoffMs(item.attempts+1),item.attempts+1):(avisaDescarte(item,`${res.status}: retry não corrige payload inválido`),null)}catch{return retry(backoffMs(item.attempts+1),item.attempts+1)}}async function flushQueue(now=Date.now()){if(!state_1.state.flushing){state_1.state.flushing=true;try{const due=await comTrava(async()=>{const{valor:pendentes,falhou:falhou}=await(0,storage_1.getJsonSeguro)(storage_1.KEYS.queue,[]);if(falhou)return[];const{valor:emVoo,falhou:falhouVoo}=await(0,storage_1.getJsonSeguro)(storage_1.KEYS.queueInflight,[]);if(falhouVoo)return[];if(pendentes.length+emVoo.length+naoPersistidos.length===0)return[];const queue=coalescer([...emVoo,...pendentes,...naoPersistidos]);naoPersistidos=[];const prontos=queue.filter(item=>item.nextAttemptAt<=now),adiados=queue.filter(item=>item.nextAttemptAt>now);return await(0,storage_1.setJson)(storage_1.KEYS.queue,adiados),await(0,storage_1.setJson)(storage_1.KEYS.queueInflight,prontos),prontos});if(0===due.length)return;const devolver=[];let cursor=0;const worker=async()=>{for(;cursor<due.length;){const item=due[cursor++];try{const kept=await processItem(item,now);kept&&devolver.push(kept)}catch{devolver.push({...item,attempts:item.attempts+1,nextAttemptAt:now+backoffMs(item.attempts+1)})}}};await Promise.all(Array.from({length:Math.min(exports.FLUSH_CONCURRENCY,due.length)},()=>worker())),await comTrava(async()=>{const{valor:atual,falhou:falhou}=await(0,storage_1.getJsonSeguro)(storage_1.KEYS.queue,[]);if(falhou)return void guardarEmMemoria(devolver);const mesclado=coalescer([...devolver,...atual]);mesclado.length>MAX_QUEUE_ITEMS&&mesclado.splice(0,mesclado.length-MAX_QUEUE_ITEMS),await(0,storage_1.setJson)(storage_1.KEYS.queue,mesclado),await(0,storage_1.setJson)(storage_1.KEYS.queueInflight,[])})}finally{state_1.state.flushing=false}}}
|
|
1
|
+
"use strict";var __createBinding=this&&this.__createBinding||(Object.create?function(o,m,k,k2){void 0===k2&&(k2=k);var desc=Object.getOwnPropertyDescriptor(m,k);desc&&!("get"in desc?!m.__esModule:desc.writable||desc.configurable)||(desc={enumerable:true,get:function(){return m[k]}}),Object.defineProperty(o,k2,desc)}:function(o,m,k,k2){void 0===k2&&(k2=k),o[k2]=m[k]}),__setModuleDefault=this&&this.__setModuleDefault||(Object.create?function(o,v){Object.defineProperty(o,"default",{enumerable:true,value:v})}:function(o,v){o.default=v}),__importStar=this&&this.__importStar||function(){var ownKeys=function(o){return ownKeys=Object.getOwnPropertyNames||function(o){var ar=[];for(var k in o)Object.prototype.hasOwnProperty.call(o,k)&&(ar[ar.length]=k);return ar},ownKeys(o)};return function(mod){if(mod&&mod.__esModule)return mod;var result={};if(null!=mod)for(var k=ownKeys(mod),i=0;i<k.length;i++)"default"!==k[i]&&__createBinding(result,mod,k[i]);return __setModuleDefault(result,mod),result}}();Object.defineProperty(exports,"__esModule",{value:true}),exports.FLUSH_CONCURRENCY=void 0,exports.__resetQueueForTests=__resetQueueForTests,exports.__drainQueueLockForTests=__drainQueueLockForTests,exports.backoffMs=backoffMs,exports.enqueue=enqueue,exports.sendOrQueue=sendOrQueue,exports.flushQueue=flushQueue;const http_1=require("./http"),storage_1=require("./storage"),state_1=require("./state"),MAX_ATTEMPTS=10,MAX_QUEUE_ITEMS=500,BASE_DELAY_MS=1e3,MAX_DELAY_MS=3e5,JITTER_MS=1e3;exports.FLUSH_CONCURRENCY=5;let localId=0,ultimoNascimento=0;function agoraMonotonico(){return ultimoNascimento=Math.max(Date.now(),ultimoNascimento+1),ultimoNascimento}function nextId(){return localId+=1,`${agoraMonotonico()}-${localId}`}function criadoEm(item){return Number(item.id.split("-")[0])||0}function chaveEstado(item){if("PUT"!==item.method)return null;const campos=Object.keys(item.body).filter(c=>"app_id"!==c).sort().join(",");return`${item.path}#${campos}`}const superadoEm=new Map;function marcarSuperado(chave,quando){chave&&quando>(superadoEm.get(chave)??0)&&superadoEm.set(chave,quando)}function estaSuperado(item){const chave=chaveEstado(item);return null!==chave&&(superadoEm.get(chave)??0)>criadoEm(item)}function avisaDescarte(item,motivo){console.warn(`[PushMesh] ${item.method} ${item.path} descartado — ${motivo}`)}function coalescer(itens){const posicao=new Map,saida=[];for(const item of itens){if(estaSuperado(item))continue;const chave=chaveEstado(item);if(null===chave){saida.push(item);continue}const idx=posicao.get(chave);void 0===idx?posicao.set(chave,saida.push(item)-1):criadoEm(item)>=criadoEm(saida[idx])&&(saida[idx]=item)}return saida}let naoPersistidos=[];function __resetQueueForTests(){superadoEm.clear(),naoPersistidos=[]}function guardarEmMemoria(itens){naoPersistidos.push(...itens),naoPersistidos.length>MAX_QUEUE_ITEMS&&naoPersistidos.splice(0,naoPersistidos.length-MAX_QUEUE_ITEMS)}let cadeia=Promise.resolve();function comTrava(op){const proxima=cadeia.then(op,op);return cadeia=proxima.then(()=>{},()=>{}),proxima}async function __drainQueueLockForTests(){await cadeia}function backoffMs(attempts,jitter=Math.random){return Math.min(BASE_DELAY_MS*2**attempts,MAX_DELAY_MS)+Math.floor(jitter()*JITTER_MS)}async function enqueue(method,path,body,delayMs=0){const novo={id:nextId(),method:method,path:path,body:body,attempts:0,nextAttemptAt:Date.now()+delayMs};marcarSuperado(chaveEstado(novo),criadoEm(novo)),await comTrava(async()=>{const{valor:valor,falhou:falhou}=await(0,storage_1.getJsonSeguro)(storage_1.KEYS.queue,[]);if(falhou)return guardarEmMemoria([novo]),void console.warn("[PushMesh] fila ilegível agora (storage ocupado) — item guardado em memória");const queue=coalescer([...valor,...naoPersistidos,novo]);if(naoPersistidos=[],queue.length>MAX_QUEUE_ITEMS){const descartados=queue.length-MAX_QUEUE_ITEMS;queue.splice(0,descartados),console.warn(`[PushMesh] fila cheia (teto ${MAX_QUEUE_ITEMS}) — ${descartados} item(ns) antigo(s) descartado(s)`)}await(0,storage_1.setJson)(storage_1.KEYS.queue,queue)})}async function sendOrQueue(method,path,body){const nascimento=agoraMonotonico();try{const res=await(0,http_1.request)(method,path,body);return 429===res.status||res.status>=500?(await enqueue(method,path,body,res.retryAfterMs??backoffMs(1)),true):res.ok?(marcarSuperado(chaveEstado({method:method,path:path,body:body}),nascimento),await purgarSuperados(),true):(curaSeRegistroPerdido(res.status,path),avisaDescarte({method:method,path:path},`${res.status}: retry não corrige payload inválido`),false)}catch(e){if(e instanceof http_1.NetworkError)return await enqueue(method,path,body),true;throw e}}function curaSeRegistroPerdido(status,path){404===status&&(path.startsWith("/api/v1/receipts")||path.startsWith("/api/v1/players/"))&&Promise.resolve().then(()=>__importStar(require("./players"))).then(m=>m.registroPerdido(path)).catch(()=>{})}async function purgarSuperados(){await comTrava(async()=>{const{valor:valor,falhou:falhou}=await(0,storage_1.getJsonSeguro)(storage_1.KEYS.queue,[]);if(!falhou&&valor.length>0){const vivos=valor.filter(item=>!estaSuperado(item));vivos.length!==valor.length&&await(0,storage_1.setJson)(storage_1.KEYS.queue,vivos)}const{valor:emVoo,falhou:falhouVoo}=await(0,storage_1.getJsonSeguro)(storage_1.KEYS.queueInflight,[]);if(!falhouVoo&&emVoo.length>0){const vivosVoo=emVoo.filter(item=>!estaSuperado(item));vivosVoo.length!==emVoo.length&&await(0,storage_1.setJson)(storage_1.KEYS.queueInflight,vivosVoo)}})}async function resolverPlayer(item){if(null!==item.body.player_id)return true;const playerId=state_1.state.playerId??await(0,storage_1.getItem)(storage_1.KEYS.playerId);return!!playerId&&(item.body={...item.body,player_id:playerId},true)}async function processItem(item,now){const retry=(delayMs,attempts)=>attempts<10?{...item,attempts:attempts,nextAttemptAt:now+delayMs}:(avisaDescarte(item,"10 tentativas sem sucesso — desistindo"),null);if(estaSuperado(item))return avisaDescarte(item,"escrita mais nova do mesmo campo já foi enviada"),null;if(!await resolverPlayer(item))return{...item,nextAttemptAt:now+backoffMs(item.attempts+1)};try{const res=await(0,http_1.request)(item.method,item.path,item.body);return res.ok?null:429===res.status||res.status>=500?retry(res.retryAfterMs??backoffMs(item.attempts+1),item.attempts+1):(curaSeRegistroPerdido(res.status,item.path),avisaDescarte(item,`${res.status}: retry não corrige payload inválido`),null)}catch{return retry(backoffMs(item.attempts+1),item.attempts+1)}}async function flushQueue(now=Date.now()){if(!state_1.state.flushing){state_1.state.flushing=true;try{const due=await comTrava(async()=>{const{valor:pendentes,falhou:falhou}=await(0,storage_1.getJsonSeguro)(storage_1.KEYS.queue,[]);if(falhou)return[];const{valor:emVoo,falhou:falhouVoo}=await(0,storage_1.getJsonSeguro)(storage_1.KEYS.queueInflight,[]);if(falhouVoo)return[];if(pendentes.length+emVoo.length+naoPersistidos.length===0)return[];const queue=coalescer([...emVoo,...pendentes,...naoPersistidos]);naoPersistidos=[];const prontos=queue.filter(item=>item.nextAttemptAt<=now),adiados=queue.filter(item=>item.nextAttemptAt>now);return await(0,storage_1.setJson)(storage_1.KEYS.queue,adiados),await(0,storage_1.setJson)(storage_1.KEYS.queueInflight,prontos),prontos});if(0===due.length)return;const devolver=[];let cursor=0;const worker=async()=>{for(;cursor<due.length;){const item=due[cursor++];try{const kept=await processItem(item,now);kept&&devolver.push(kept)}catch{devolver.push({...item,attempts:item.attempts+1,nextAttemptAt:now+backoffMs(item.attempts+1)})}}};await Promise.all(Array.from({length:Math.min(exports.FLUSH_CONCURRENCY,due.length)},()=>worker())),await comTrava(async()=>{const{valor:atual,falhou:falhou}=await(0,storage_1.getJsonSeguro)(storage_1.KEYS.queue,[]);if(falhou)return void guardarEmMemoria(devolver);const mesclado=coalescer([...devolver,...atual]);mesclado.length>MAX_QUEUE_ITEMS&&mesclado.splice(0,mesclado.length-MAX_QUEUE_ITEMS),await(0,storage_1.setJson)(storage_1.KEYS.queue,mesclado),await(0,storage_1.setJson)(storage_1.KEYS.queueInflight,[])})}finally{state_1.state.flushing=false}}}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@pushmesh/sdk",
|
|
3
|
-
"version": "0.7.
|
|
3
|
+
"version": "0.7.4",
|
|
4
4
|
"description": "React Native SDK for PushMesh — push notifications with real delivery receipts, permission re-activation and in-app banners. Classic API included. (Guia em português: README.pt-BR.md)",
|
|
5
5
|
"license": "MIT",
|
|
6
6
|
"private": false,
|