@dotrino/identity 0.59.0 → 0.60.0

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/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@dotrino/identity",
3
- "version": "0.59.0",
3
+ "version": "0.60.0",
4
4
  "description": "Identidad y rating de usuarios compartidos entre apps de Dotrino (vault iframe + postMessage)",
5
5
  "type": "module",
6
6
  "main": "src/index.js",
@@ -56,7 +56,7 @@
56
56
  "url": "git+https://github.com/imdotrino/dotrino-identity.git"
57
57
  },
58
58
  "dependencies": {
59
- "@dotrino/proxy-client": "0.10.1"
59
+ "@dotrino/proxy-client": "^0.11.0"
60
60
  },
61
61
  "devDependencies": {
62
62
  "fake-indexeddb": "^6.2.5",
package/src/index.js CHANGED
@@ -412,6 +412,11 @@ export class Identity {
412
412
  return this._call('vaultApprovals', { op, ...(args || {}) }, 20000)
413
413
  }
414
414
 
415
+ /** Registra el token de push de la app nativa (FCM/APNs) bajo la llave de este aparato. */
416
+ async registerPush (args) {
417
+ return this._call('registerPush', args || {}, 20000)
418
+ }
419
+
415
420
  /** ¿El cert de este dispositivo le permite aprobar pedidos de la bóveda? */
416
421
  async canApproveVault () {
417
422
  return this._call('canApproveVault', {}, 20000)
package/vault/core.js CHANGED
@@ -21,7 +21,7 @@
21
21
  import { signDelegationWith, MAX_DELEGATION_MS, DEFAULT_DELEGATION_MS } from './capabilities.js'
22
22
  import * as Acta from './acta.js'
23
23
  import * as Content from './content.js'
24
- import { pubkeyId as pubkeyIdOf } from './capabilities.js'
24
+ import { pubkeyId as pubkeyIdOf, signWithDevice } from './capabilities.js'
25
25
  import { enrollDevice as remoteEnroll, requestSign as remoteSign, requestStore as remoteStore, requestDevices as remoteDevices, requestRenew as remoteRenew, requestAdmin as remoteAdmin, requestApproval as remoteApproval, requestRenounce as remoteRenounce, checkMembership as remoteCheck } from './remote.js'
26
26
 
27
27
  export const KEY_STORAGE = 'dotrino.identity.keypair'
@@ -1969,6 +1969,28 @@ export async function createIdentityCore ({ kv: rawKv, peers, makeSync = null, k
1969
1969
  catch (e) { return handleVaultError(e) }
1970
1970
  },
1971
1971
 
1972
+ /**
1973
+ * PUSH DE LA APP NATIVA: registra el token (FCM/APNs) de este aparato en el proxio,
1974
+ * bajo la llave del dispositivo, para que la bóveda pueda «timbrarlo» cuando haya
1975
+ * un pedido. La app nativa le pasa el token a la página; la página lo trae aquí.
1976
+ */
1977
+ async registerPush ({ kind = 'fcm', token } = {}) {
1978
+ const device = loadVaultDevice()
1979
+ if (!device) throw new Error('this device is not paired with a vault')
1980
+ if (typeof token !== 'string' || !token) throw new Error('registerPush requires a token')
1981
+ const v = loadVaultCert()
1982
+ const { WebSocketProxyClient } = await import('@dotrino/proxy-client')
1983
+ const client = new WebSocketProxyClient({ url: v?.proxy || 'wss://proxy.dotrino.com', enableWebRTC: false, autoReconnect: false })
1984
+ await client.connect()
1985
+ try {
1986
+ await client.registerPushToken({
1987
+ publicKey: device.publickey, token, kind,
1988
+ sign: async (data) => (await signWithDevice({ privateJwk: device.privateJwk, privateKey: device.privateKey, publickey: device.publickey, data })).signature
1989
+ })
1990
+ return { ok: true, kind }
1991
+ } finally { try { client.close() } catch (_) {} }
1992
+ },
1993
+
1972
1994
  /** ¿Puede ESTE dispositivo aprobar pedidos? Mismo criterio que `canAdminVault`. */
1973
1995
  async canApproveVault () {
1974
1996
  if (certDesfasadoDelActa()) { try { await renovarCert() } catch (_) {} }