@konemono/nostr-login 1.9.0 → 1.9.2

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": "@konemono/nostr-login",
3
- "version": "1.9.0",
3
+ "version": "1.9.2",
4
4
  "description": "",
5
5
  "main": "./dist/index.esm.js",
6
6
  "types": "./dist/index.d.ts",
@@ -30,12 +30,14 @@ export class AmberDirectSigner implements Signer {
30
30
  public async getPublicKey(id?: string): Promise<string> {
31
31
  id = id || Math.random().toString(36).substring(7);
32
32
  const url = this.generateUrl('', 'get_public_key', id);
33
- console.log('Amber redirecting to:', url);
33
+ console.log('[AmberDirectSigner] Requesting public key, URL:', url.substring(0, 100) + '...');
34
34
  window.open(url, '_blank', 'width=400,height=600');
35
35
  return new Promise((resolve, reject) => {
36
36
  const timer = setTimeout(() => {
37
37
  AmberDirectSigner.pendingResolves.delete(id!);
38
- reject(new Error('AmberDirectSigner timeout'));
38
+ const error = new Error('[AmberDirectSigner] getPublicKey timeout after 20s');
39
+ console.error(error.message);
40
+ reject(error);
39
41
  }, 20000);
40
42
  AmberDirectSigner.pendingResolves.set(id!, { resolve, timer });
41
43
  });
@@ -208,9 +210,11 @@ export class AmberDirectSigner implements Signer {
208
210
  if (entry) {
209
211
  this.pendingResolves.delete(id);
210
212
  if (entry.timer) clearTimeout(entry.timer);
213
+ console.log('[AmberDirectSigner] Resolving pending:', { id, type, resultLen: result.length });
211
214
  entry.resolve(result);
212
215
  return true;
213
216
  }
217
+ console.warn('[AmberDirectSigner] No pending resolve found for:', id);
214
218
  return false;
215
219
  }
216
220
 
@@ -76,26 +76,31 @@ class AuthNostrService extends EventEmitter implements Signer {
76
76
  decrypt: this.decrypt44.bind(this),
77
77
  };
78
78
 
79
- setTimeout(() => this.checkAmberResponse(), 100);
80
-
79
+ // Amberレスポンス検出: ポップアップから戻った時
81
80
  const check = () => {
81
+ console.log('[AuthNostrService] Checking Amber response');
82
82
  this.checkAmberResponse();
83
83
  };
84
84
 
85
+ // 主要なイベントで検出(ポーリングは廃止)
85
86
  window.addEventListener('focus', check);
86
87
  window.addEventListener('visibilitychange', () => {
87
- if (document.visibilityState === 'visible') check();
88
+ if (document.visibilityState === 'visible') {
89
+ console.log('[AuthNostrService] Page visible, checking Amber response');
90
+ check();
91
+ }
88
92
  });
89
93
  window.addEventListener('popstate', check);
90
94
  window.addEventListener('hashchange', check);
91
95
 
92
- // Periodic check as a safety net
93
- setInterval(check, 1000);
96
+ // 初期チェック
97
+ setTimeout(check, 100);
94
98
 
99
+ // ポップアップからのメッセージ受信
95
100
  window.addEventListener('message', event => {
96
101
  if (event.data && event.data.method === 'amberResponse') {
97
102
  const { id, type, result } = event.data;
98
- console.log('Amber response received via message', { id, type, result });
103
+ console.log('[AuthNostrService] Amber response received via message', { id, type, result });
99
104
  this.handleAmberResponse({ id, type, result });
100
105
  }
101
106
  });
@@ -104,9 +109,11 @@ class AuthNostrService extends EventEmitter implements Signer {
104
109
  private checkAmberResponse() {
105
110
  const response = AmberDirectSigner.parseResponse();
106
111
  if (response) {
112
+ console.log('[AuthNostrService] Amber response detected', response);
113
+
107
114
  // If we have an opener and it's not the same window, we are in a popup
108
115
  if (window.opener && window.opener !== window) {
109
- console.log('Amber response in popup, sending back to opener');
116
+ console.log('[AuthNostrService] In popup, sending response back to opener');
110
117
  window.opener.postMessage({ method: 'amberResponse', ...response }, window.location.origin);
111
118
  window.close();
112
119
  return;
@@ -119,10 +126,13 @@ class AuthNostrService extends EventEmitter implements Signer {
119
126
  private handledAmberIds: Set<string> = new Set();
120
127
 
121
128
  private handleAmberResponse(response: { id: string; type: string; result: string }) {
122
- if (this.handledAmberIds.has(response.id)) return;
129
+ if (this.handledAmberIds.has(response.id)) {
130
+ console.log('[AuthNostrService] Amber response already handled:', response.id);
131
+ return;
132
+ }
123
133
  this.handledAmberIds.add(response.id);
124
134
 
125
- console.log('Handling Amber response', response);
135
+ console.log('[AuthNostrService] Handling Amber response:', response);
126
136
 
127
137
  // Stop the "Connecting..." spinner
128
138
  this.emit('onAuthUrl', { url: '' });
@@ -130,19 +140,21 @@ class AuthNostrService extends EventEmitter implements Signer {
130
140
  // Resolve pending promises if any (for non-reload cases)
131
141
  const resolved = AmberDirectSigner.resolvePending(response.id, response.type, response.result);
132
142
  if (resolved) {
133
- console.log('Resolved pending Amber promise via resolvePending');
134
- }
135
-
136
- if (response.type === 'get_public_key' || response.type.includes('pub')) {
137
- const info: Info = {
138
- pubkey: response.result,
139
- name: nip19.npubEncode(response.result),
140
- authMethod: 'amber' as any,
141
- relays: [],
142
- signerPubkey: '',
143
- };
144
- console.log('Amber login success', info);
145
- this.onAuth('login', info);
143
+ console.log('[AuthNostrService] Resolved pending Amber promise');
144
+ } else {
145
+ // resolvePendingが失敗した場合、ページリロード時などは二度目のログイン
146
+ console.log('[AuthNostrService] No pending promise, handling as second login');
147
+ if (response.type === 'get_public_key' || response.type.includes('pub')) {
148
+ const info: Info = {
149
+ pubkey: response.result,
150
+ name: nip19.npubEncode(response.result),
151
+ authMethod: 'amber' as any,
152
+ relays: [],
153
+ signerPubkey: '',
154
+ };
155
+ console.log('[AuthNostrService] Amber login success:', info);
156
+ this.onAuth('login', info);
157
+ }
146
158
  }
147
159
 
148
160
  // URLクリーンアップをより徹底的に
@@ -162,7 +174,7 @@ class AuthNostrService extends EventEmitter implements Signer {
162
174
  }
163
175
 
164
176
  if (changed) {
165
- console.log('Cleaning up Amber response URL', url.toString());
177
+ console.log('[AuthNostrService] Cleaning up Amber response URL');
166
178
  window.history.replaceState({}, '', url.toString());
167
179
  }
168
180
  }
@@ -419,8 +431,16 @@ class AuthNostrService extends EventEmitter implements Signer {
419
431
  }
420
432
 
421
433
  public async setAmber(info: Info) {
434
+ console.log('setAmber', info);
435
+
436
+ // クリア
422
437
  this.releaseSigner();
423
438
  this.amberSigner = new AmberDirectSigner(info.pubkey);
439
+
440
+ // Amberは署名リクエストをウォレットに投げるだけなので、特別な初期化は不要
441
+ // signEventなどが直接amberSignerを使用する
442
+
443
+ // 認証完了
424
444
  this.onAuth('login', info);
425
445
  }
426
446