signal-bridge 1.0.12 → 1.0.15

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/README.md CHANGED
@@ -46,7 +46,7 @@ const bridge = createBridge("my-app-id", {
46
46
  allowedHostOrigins: ["https://host.com"],
47
47
  cryptoKey: "SECRET_KEY", // optional
48
48
  debug: true
49
- });
49
+ })
50
50
  ```
51
51
 
52
52
  > Hanya akan dibuat **1x (singleton)**. Jika dipanggil ulang, akan reuse instance lama.
@@ -96,6 +96,10 @@ Jika ingin akses dari mana saja:
96
96
  import { signalBridge } from "signal-bridge";
97
97
 
98
98
  signalBridge().emit("ping", {});
99
+
100
+
101
+ Auto Encrypted Data:
102
+ signalBridge().emitEncrypted("event-name", {id:123});
99
103
  ```
100
104
 
101
105
  ⚠️ Pastikan sudah `createBridge().init()` sebelumnya.
package/dist/index.d.mts CHANGED
@@ -21,27 +21,123 @@ interface BridgeOptions {
21
21
  declare function createBridge(appId: string, options: BridgeOptions): {
22
22
  init(): void;
23
23
  listen(handler: Listener): void;
24
- emit(type: string, payload: any): void;
24
+ /**
25
+ * Kirim pesan ke host tanpa enkripsi otomatis.
26
+ *
27
+ * Gunakan ini jika host dan remote sudah punya `cryptoKey` yang sama (static key),
28
+ * atau jika payload memang tidak perlu dienkripsi.
29
+ * Untuk enkripsi otomatis per-pesan, gunakan `emitEncrypted`.
30
+ *
31
+ * @param event Nama event, contoh: `"ping"`, `"user:logout"`
32
+ * @param payload Data yang ingin dikirim
33
+ * @param txn (opsional) Transaction ID custom. Auto-generate UUID jika tidak diisi.
34
+ * @returns `txn` yang digunakan — berguna untuk tracking response dari host.
35
+ *
36
+ * @example
37
+ * const txn = signalBridge.emit("ping", { ts: Date.now() });
38
+ */
39
+ emit(event: string, payload: any, txn?: string): string;
40
+ /**
41
+ * Kirim pesan ke host dengan enkripsi otomatis.
42
+ *
43
+ * Setiap pemanggilan menghasilkan key acak baru (CSPRNG),
44
+ * payload di-encrypt dengan key tersebut
45
+ *
46
+ * @param event Nama event, contoh: `"user:login"`, `"cart:update"`
47
+ * @param payload Data apapun (object, string, dll) yang ingin dikirim
48
+ * @returns `{ txn, key }` — keduanya bernilai sama (ephemeral key).
49
+ * Simpan jika perlu referensi untuk matching response dari host.
50
+ *
51
+ * @example
52
+ * const { txn } = bridge.emitEncrypted("order:submit", { id: 123 });
53
+ *
54
+ */
55
+ emitEncrypted(event: string, payload: any): {
56
+ txn: string;
57
+ key: string;
58
+ };
25
59
  destroy(): void;
26
60
  };
27
61
  declare function resetBridge(): void;
28
62
  declare function signalBridge(): {
29
63
  init(): void;
30
64
  listen(handler: Listener): void;
31
- emit(type: string, payload: any): void;
32
- destroy(): void;
33
- };
34
- declare function setupBridge(appId: string, options: BridgeOptions): {
35
- init(): void;
36
- listen(handler: Listener): void;
37
- emit(type: string, payload: any): void;
65
+ /**
66
+ * Kirim pesan ke host tanpa enkripsi otomatis.
67
+ *
68
+ * Gunakan ini jika host dan remote sudah punya `cryptoKey` yang sama (static key),
69
+ * atau jika payload memang tidak perlu dienkripsi.
70
+ * Untuk enkripsi otomatis per-pesan, gunakan `emitEncrypted`.
71
+ *
72
+ * @param event Nama event, contoh: `"ping"`, `"user:logout"`
73
+ * @param payload Data yang ingin dikirim
74
+ * @param txn (opsional) Transaction ID custom. Auto-generate UUID jika tidak diisi.
75
+ * @returns `txn` yang digunakan — berguna untuk tracking response dari host.
76
+ *
77
+ * @example
78
+ * const txn = signalBridge.emit("ping", { ts: Date.now() });
79
+ */
80
+ emit(event: string, payload: any, txn?: string): string;
81
+ /**
82
+ * Kirim pesan ke host dengan enkripsi otomatis.
83
+ *
84
+ * Setiap pemanggilan menghasilkan key acak baru (CSPRNG),
85
+ * payload di-encrypt dengan key tersebut
86
+ *
87
+ * @param event Nama event, contoh: `"user:login"`, `"cart:update"`
88
+ * @param payload Data apapun (object, string, dll) yang ingin dikirim
89
+ * @returns `{ txn, key }` — keduanya bernilai sama (ephemeral key).
90
+ * Simpan jika perlu referensi untuk matching response dari host.
91
+ *
92
+ * @example
93
+ * const { txn } = bridge.emitEncrypted("order:submit", { id: 123 });
94
+ *
95
+ */
96
+ emitEncrypted(event: string, payload: any): {
97
+ txn: string;
98
+ key: string;
99
+ };
38
100
  destroy(): void;
39
101
  };
40
102
  declare function initBridge(appId: string, options: BridgeOptions): {
41
103
  init(): void;
42
104
  listen(handler: Listener): void;
43
- emit(type: string, payload: any): void;
105
+ /**
106
+ * Kirim pesan ke host tanpa enkripsi otomatis.
107
+ *
108
+ * Gunakan ini jika host dan remote sudah punya `cryptoKey` yang sama (static key),
109
+ * atau jika payload memang tidak perlu dienkripsi.
110
+ * Untuk enkripsi otomatis per-pesan, gunakan `emitEncrypted`.
111
+ *
112
+ * @param event Nama event, contoh: `"ping"`, `"user:logout"`
113
+ * @param payload Data yang ingin dikirim
114
+ * @param txn (opsional) Transaction ID custom. Auto-generate UUID jika tidak diisi.
115
+ * @returns `txn` yang digunakan — berguna untuk tracking response dari host.
116
+ *
117
+ * @example
118
+ * const txn = signalBridge.emit("ping", { ts: Date.now() });
119
+ */
120
+ emit(event: string, payload: any, txn?: string): string;
121
+ /**
122
+ * Kirim pesan ke host dengan enkripsi otomatis.
123
+ *
124
+ * Setiap pemanggilan menghasilkan key acak baru (CSPRNG),
125
+ * payload di-encrypt dengan key tersebut
126
+ *
127
+ * @param event Nama event, contoh: `"user:login"`, `"cart:update"`
128
+ * @param payload Data apapun (object, string, dll) yang ingin dikirim
129
+ * @returns `{ txn, key }` — keduanya bernilai sama (ephemeral key).
130
+ * Simpan jika perlu referensi untuk matching response dari host.
131
+ *
132
+ * @example
133
+ * const { txn } = bridge.emitEncrypted("order:submit", { id: 123 });
134
+ *
135
+ */
136
+ emitEncrypted(event: string, payload: any): {
137
+ txn: string;
138
+ key: string;
139
+ };
44
140
  destroy(): void;
45
141
  };
46
142
 
47
- export { base64UrlDecode, base64UrlEncode, createBridge, decrypt, encrypt, generateKey, initBridge, resetBridge, setupBridge, signalBridge };
143
+ export { base64UrlDecode, base64UrlEncode, createBridge, decrypt, encrypt, generateKey, initBridge, resetBridge, signalBridge };
package/dist/index.d.ts CHANGED
@@ -21,27 +21,123 @@ interface BridgeOptions {
21
21
  declare function createBridge(appId: string, options: BridgeOptions): {
22
22
  init(): void;
23
23
  listen(handler: Listener): void;
24
- emit(type: string, payload: any): void;
24
+ /**
25
+ * Kirim pesan ke host tanpa enkripsi otomatis.
26
+ *
27
+ * Gunakan ini jika host dan remote sudah punya `cryptoKey` yang sama (static key),
28
+ * atau jika payload memang tidak perlu dienkripsi.
29
+ * Untuk enkripsi otomatis per-pesan, gunakan `emitEncrypted`.
30
+ *
31
+ * @param event Nama event, contoh: `"ping"`, `"user:logout"`
32
+ * @param payload Data yang ingin dikirim
33
+ * @param txn (opsional) Transaction ID custom. Auto-generate UUID jika tidak diisi.
34
+ * @returns `txn` yang digunakan — berguna untuk tracking response dari host.
35
+ *
36
+ * @example
37
+ * const txn = signalBridge.emit("ping", { ts: Date.now() });
38
+ */
39
+ emit(event: string, payload: any, txn?: string): string;
40
+ /**
41
+ * Kirim pesan ke host dengan enkripsi otomatis.
42
+ *
43
+ * Setiap pemanggilan menghasilkan key acak baru (CSPRNG),
44
+ * payload di-encrypt dengan key tersebut
45
+ *
46
+ * @param event Nama event, contoh: `"user:login"`, `"cart:update"`
47
+ * @param payload Data apapun (object, string, dll) yang ingin dikirim
48
+ * @returns `{ txn, key }` — keduanya bernilai sama (ephemeral key).
49
+ * Simpan jika perlu referensi untuk matching response dari host.
50
+ *
51
+ * @example
52
+ * const { txn } = bridge.emitEncrypted("order:submit", { id: 123 });
53
+ *
54
+ */
55
+ emitEncrypted(event: string, payload: any): {
56
+ txn: string;
57
+ key: string;
58
+ };
25
59
  destroy(): void;
26
60
  };
27
61
  declare function resetBridge(): void;
28
62
  declare function signalBridge(): {
29
63
  init(): void;
30
64
  listen(handler: Listener): void;
31
- emit(type: string, payload: any): void;
32
- destroy(): void;
33
- };
34
- declare function setupBridge(appId: string, options: BridgeOptions): {
35
- init(): void;
36
- listen(handler: Listener): void;
37
- emit(type: string, payload: any): void;
65
+ /**
66
+ * Kirim pesan ke host tanpa enkripsi otomatis.
67
+ *
68
+ * Gunakan ini jika host dan remote sudah punya `cryptoKey` yang sama (static key),
69
+ * atau jika payload memang tidak perlu dienkripsi.
70
+ * Untuk enkripsi otomatis per-pesan, gunakan `emitEncrypted`.
71
+ *
72
+ * @param event Nama event, contoh: `"ping"`, `"user:logout"`
73
+ * @param payload Data yang ingin dikirim
74
+ * @param txn (opsional) Transaction ID custom. Auto-generate UUID jika tidak diisi.
75
+ * @returns `txn` yang digunakan — berguna untuk tracking response dari host.
76
+ *
77
+ * @example
78
+ * const txn = signalBridge.emit("ping", { ts: Date.now() });
79
+ */
80
+ emit(event: string, payload: any, txn?: string): string;
81
+ /**
82
+ * Kirim pesan ke host dengan enkripsi otomatis.
83
+ *
84
+ * Setiap pemanggilan menghasilkan key acak baru (CSPRNG),
85
+ * payload di-encrypt dengan key tersebut
86
+ *
87
+ * @param event Nama event, contoh: `"user:login"`, `"cart:update"`
88
+ * @param payload Data apapun (object, string, dll) yang ingin dikirim
89
+ * @returns `{ txn, key }` — keduanya bernilai sama (ephemeral key).
90
+ * Simpan jika perlu referensi untuk matching response dari host.
91
+ *
92
+ * @example
93
+ * const { txn } = bridge.emitEncrypted("order:submit", { id: 123 });
94
+ *
95
+ */
96
+ emitEncrypted(event: string, payload: any): {
97
+ txn: string;
98
+ key: string;
99
+ };
38
100
  destroy(): void;
39
101
  };
40
102
  declare function initBridge(appId: string, options: BridgeOptions): {
41
103
  init(): void;
42
104
  listen(handler: Listener): void;
43
- emit(type: string, payload: any): void;
105
+ /**
106
+ * Kirim pesan ke host tanpa enkripsi otomatis.
107
+ *
108
+ * Gunakan ini jika host dan remote sudah punya `cryptoKey` yang sama (static key),
109
+ * atau jika payload memang tidak perlu dienkripsi.
110
+ * Untuk enkripsi otomatis per-pesan, gunakan `emitEncrypted`.
111
+ *
112
+ * @param event Nama event, contoh: `"ping"`, `"user:logout"`
113
+ * @param payload Data yang ingin dikirim
114
+ * @param txn (opsional) Transaction ID custom. Auto-generate UUID jika tidak diisi.
115
+ * @returns `txn` yang digunakan — berguna untuk tracking response dari host.
116
+ *
117
+ * @example
118
+ * const txn = signalBridge.emit("ping", { ts: Date.now() });
119
+ */
120
+ emit(event: string, payload: any, txn?: string): string;
121
+ /**
122
+ * Kirim pesan ke host dengan enkripsi otomatis.
123
+ *
124
+ * Setiap pemanggilan menghasilkan key acak baru (CSPRNG),
125
+ * payload di-encrypt dengan key tersebut
126
+ *
127
+ * @param event Nama event, contoh: `"user:login"`, `"cart:update"`
128
+ * @param payload Data apapun (object, string, dll) yang ingin dikirim
129
+ * @returns `{ txn, key }` — keduanya bernilai sama (ephemeral key).
130
+ * Simpan jika perlu referensi untuk matching response dari host.
131
+ *
132
+ * @example
133
+ * const { txn } = bridge.emitEncrypted("order:submit", { id: 123 });
134
+ *
135
+ */
136
+ emitEncrypted(event: string, payload: any): {
137
+ txn: string;
138
+ key: string;
139
+ };
44
140
  destroy(): void;
45
141
  };
46
142
 
47
- export { base64UrlDecode, base64UrlEncode, createBridge, decrypt, encrypt, generateKey, initBridge, resetBridge, setupBridge, signalBridge };
143
+ export { base64UrlDecode, base64UrlEncode, createBridge, decrypt, encrypt, generateKey, initBridge, resetBridge, signalBridge };
@@ -51,39 +51,39 @@ var _signalBridgeLib = (() => {
51
51
  }
52
52
  })(exports, function() {
53
53
  var CryptoJS2 = CryptoJS2 || (function(Math2, undefined2) {
54
- var crypto;
54
+ var crypto2;
55
55
  if (typeof window !== "undefined" && window.crypto) {
56
- crypto = window.crypto;
56
+ crypto2 = window.crypto;
57
57
  }
58
58
  if (typeof self !== "undefined" && self.crypto) {
59
- crypto = self.crypto;
59
+ crypto2 = self.crypto;
60
60
  }
61
61
  if (typeof globalThis !== "undefined" && globalThis.crypto) {
62
- crypto = globalThis.crypto;
62
+ crypto2 = globalThis.crypto;
63
63
  }
64
- if (!crypto && typeof window !== "undefined" && window.msCrypto) {
65
- crypto = window.msCrypto;
64
+ if (!crypto2 && typeof window !== "undefined" && window.msCrypto) {
65
+ crypto2 = window.msCrypto;
66
66
  }
67
- if (!crypto && typeof global !== "undefined" && global.crypto) {
68
- crypto = global.crypto;
67
+ if (!crypto2 && typeof global !== "undefined" && global.crypto) {
68
+ crypto2 = global.crypto;
69
69
  }
70
- if (!crypto && typeof __require === "function") {
70
+ if (!crypto2 && typeof __require === "function") {
71
71
  try {
72
- crypto = __require("crypto");
72
+ crypto2 = __require("crypto");
73
73
  } catch (err) {
74
74
  }
75
75
  }
76
76
  var cryptoSecureRandomInt = function() {
77
- if (crypto) {
78
- if (typeof crypto.getRandomValues === "function") {
77
+ if (crypto2) {
78
+ if (typeof crypto2.getRandomValues === "function") {
79
79
  try {
80
- return crypto.getRandomValues(new Uint32Array(1))[0];
80
+ return crypto2.getRandomValues(new Uint32Array(1))[0];
81
81
  } catch (err) {
82
82
  }
83
83
  }
84
- if (typeof crypto.randomBytes === "function") {
84
+ if (typeof crypto2.randomBytes === "function") {
85
85
  try {
86
- return crypto.randomBytes(4).readInt32LE();
86
+ return crypto2.randomBytes(4).readInt32LE();
87
87
  } catch (err) {
88
88
  }
89
89
  }
@@ -6635,7 +6635,6 @@ var _signalBridgeLib = (() => {
6635
6635
  generateKey: () => generateKey,
6636
6636
  initBridge: () => initBridge,
6637
6637
  resetBridge: () => resetBridge,
6638
- setupBridge: () => setupBridge,
6639
6638
  signalBridge: () => signalBridge
6640
6639
  });
6641
6640
 
@@ -6738,6 +6737,7 @@ var _signalBridgeLib = (() => {
6738
6737
  window.addEventListener("message", messageHandler);
6739
6738
  function emitToHost(type, payload, txn) {
6740
6739
  let finalPayload = payload;
6740
+ const resolvedTxn = txn || crypto.randomUUID();
6741
6741
  if (cryptoKey) {
6742
6742
  finalPayload = encrypt(payload, cryptoKey);
6743
6743
  }
@@ -6745,7 +6745,7 @@ var _signalBridgeLib = (() => {
6745
6745
  app_id: appId,
6746
6746
  type,
6747
6747
  payload: finalPayload,
6748
- txn: txn || "",
6748
+ txn: resolvedTxn,
6749
6749
  __origin: window.location.origin,
6750
6750
  __source: "remote"
6751
6751
  };
@@ -6754,6 +6754,25 @@ var _signalBridgeLib = (() => {
6754
6754
  window.parent.postMessage(message, origin);
6755
6755
  });
6756
6756
  }
6757
+ return resolvedTxn;
6758
+ }
6759
+ function emitToHostEncrypted(type, payload) {
6760
+ const key = generateKey();
6761
+ const finalPayload = encrypt(payload, key);
6762
+ const message = {
6763
+ app_id: appId,
6764
+ type,
6765
+ payload: finalPayload,
6766
+ txn: key,
6767
+ __origin: window.location.origin,
6768
+ __source: "remote"
6769
+ };
6770
+ if (window.parent && window.parent !== window) {
6771
+ allowedHostOrigins.forEach((origin) => {
6772
+ window.parent.postMessage(message, origin);
6773
+ });
6774
+ }
6775
+ return { txn: key, key };
6757
6776
  }
6758
6777
  function emitReadyOnce() {
6759
6778
  if (isInitialized) return;
@@ -6772,8 +6791,41 @@ var _signalBridgeLib = (() => {
6772
6791
  listen(handler) {
6773
6792
  listeners.push(handler);
6774
6793
  },
6775
- emit(type, payload) {
6776
- emitToHost(type, payload);
6794
+ /**
6795
+ * Kirim pesan ke host tanpa enkripsi otomatis.
6796
+ *
6797
+ * Gunakan ini jika host dan remote sudah punya `cryptoKey` yang sama (static key),
6798
+ * atau jika payload memang tidak perlu dienkripsi.
6799
+ * Untuk enkripsi otomatis per-pesan, gunakan `emitEncrypted`.
6800
+ *
6801
+ * @param event Nama event, contoh: `"ping"`, `"user:logout"`
6802
+ * @param payload Data yang ingin dikirim
6803
+ * @param txn (opsional) Transaction ID custom. Auto-generate UUID jika tidak diisi.
6804
+ * @returns `txn` yang digunakan — berguna untuk tracking response dari host.
6805
+ *
6806
+ * @example
6807
+ * const txn = signalBridge.emit("ping", { ts: Date.now() });
6808
+ */
6809
+ emit(event, payload, txn) {
6810
+ return emitToHost(event, payload, txn);
6811
+ },
6812
+ /**
6813
+ * Kirim pesan ke host dengan enkripsi otomatis.
6814
+ *
6815
+ * Setiap pemanggilan menghasilkan key acak baru (CSPRNG),
6816
+ * payload di-encrypt dengan key tersebut
6817
+ *
6818
+ * @param event Nama event, contoh: `"user:login"`, `"cart:update"`
6819
+ * @param payload Data apapun (object, string, dll) yang ingin dikirim
6820
+ * @returns `{ txn, key }` — keduanya bernilai sama (ephemeral key).
6821
+ * Simpan jika perlu referensi untuk matching response dari host.
6822
+ *
6823
+ * @example
6824
+ * const { txn } = bridge.emitEncrypted("order:submit", { id: 123 });
6825
+ *
6826
+ */
6827
+ emitEncrypted(event, payload) {
6828
+ return emitToHostEncrypted(event, payload);
6777
6829
  },
6778
6830
  destroy() {
6779
6831
  window.removeEventListener("message", messageHandler);