@ihabdevteam/core 0.334.0 → 0.336.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/CHANGELOG.md CHANGED
@@ -7,6 +7,89 @@ All notable changes to this project will be documented in this file.
7
7
  > 적은 글이라, 지금 이름으로 고쳐 놓으면 그 시절에 그 이름으로 받은 사람이
8
8
  > 제 이야기를 못 찾는다.
9
9
 
10
+ ## 0.336.0 — `playOneShot` 이 **빈 주소를 막고 말한다**
11
+
12
+ 말귀_1 이 앱에서 잡았다:
13
+ ```
14
+ play@0.0 (currentSrc = "") ← 누르자마자, 주소가 없는 채로
15
+ play@34.6 ← 한참 뒤에야 소리
16
+ 이름표: 0.6s 멈춤 → 1.2s 다시 듣기 (창은 안 사라진다 · 멈춤도 안 눌렀다)
17
+ ```
18
+
19
+ `new Audio('')` 는 문서 주소를 제 주소로 삼아 `play()` 가 **바로 거절**되고 끝이 **그 자리에서**
20
+ 돌아온다. 부르는 쪽에서 보면 *"틀었는데 곧바로 끝났다"* 라 — 화면이 되돌아가고, 다음 차례도
21
+ 안 밟고, **아무 데도 까닭이 안 남는다.** 이름표가 1초 남짓에 되돌아간 그림과 같다.
22
+
23
+ ### 코어의 네 부르는 자리는 다 막혀 있다 — 그래도 여기 하나 더 둔다
24
+
25
+ `WordTable`(`if (!audioUrl) return`) · `useAudioPreview`(`if (!url) continue`) ·
26
+ `TrainingWordCard`(부르는 자리 둘 다 `if (url)`) · 결과 팝업(`if (!url) continue`) — 넷 다 막는다.
27
+ **그래도 그 넷이 다 맞다는 보장은 없고**, 그것을 가리는 데만 한나절이 들었다. 이제
28
+ `playOneShot` 이 스스로 막고 **누가 불렀는지 스택까지 적는다**:
29
+ ```
30
+ [core] playOneShot 에 빈 주소가 왔다 — 안 튼다. 부르는 쪽이 주소를 얻기 전에 불렀다.
31
+ ```
32
+
33
+ ### 그 `play@0.0` 이 코어 것인지는 **아직 모른다**
34
+
35
+ 말귀_1 의 자는 `HTMLMediaElement.prototype.play` 에 걸린 **전역**이라, 훈련 재생기의
36
+ `<audio>`(제 `src` 가 아직 안 붙은 때)도 함께 잡힌다. 0.336.0 을 대면 **코어 것이면 위 줄이
37
+ 찍히고, 안 찍히면 코어 밖**이다 — 그것을 가르려고 둔 줄이다.
38
+
39
+ > 뿌리를 아직 못 짚었다. 이번에 한 일은 **그 길을 막고, 다음 실측이 범인을 대게** 한 것이다.
40
+
41
+ ## 0.335.0 — 소리 차례가 **게을러진다** — 누를 때마다 합성을 짓고 있었다
42
+
43
+ 말귀_1 이 앞서 준 수를 **스스로 바로잡으며** 한 줄을 적었다 — *"`urlResolver` 가 0초에
44
+ 답했는데도 폴백까지 내려갔다면, 앞 차례의 답을 안 쓰고 지나간 것입니다."* 그 말이 맞았다.
45
+
46
+ 리졸버를 직접 불러 재니(그쪽 실측):
47
+ ```
48
+ 무게 urlResolver 0.0초 → https://… fallbackUrlResolver 3.3초 → https://…/auto/…
49
+ 떡가루 urlResolver 0.0초 → https://… fallbackUrlResolver 2.5초 → https://…/auto/…
50
+ HEAD 전부 200 audio/mpeg · 전부 https:// — 걸개에 안 걸린다
51
+ ```
52
+
53
+ ### 차례를 **다 모으고 나서** 틀고 있었다
54
+
55
+ ```js
56
+ for (const url of await questionSoundCandidates(text, null)) { … }
57
+ // ^^^^^ 여기서 리졸버 둘 다 부르고 기다린다
58
+ ```
59
+
60
+ 그래서 ①이 0초에 답해도 ③(서버 합성)을 **반드시** 불렀고, 첫 소리가 그 합성이 끝난 뒤에야
61
+ 났다. **합성은 돈과 시간을 쓰는 자리인데 쓰지도 않을 답을 누를 때마다 짓고 있었다.**
62
+
63
+ 이제 차례가 **게으르다** — 차례를 만드는 것만으로는 리졸버를 안 부르고, 앞이 답하면 뒤는
64
+ 아예 안 불린다. 날 주소가 있으면 리졸버를 하나도 안 부른다.
65
+
66
+ ### 못이 그 자리를 못 보고 있었다
67
+
68
+ 모듈 쪽에 게으름 못을 세우고 **누르는 쪽(팝업)이 다 모으도록 되돌려 깨 봤더니 안 울었다** —
69
+ 모듈만 게을러도 부르는 쪽이 모으면 그대로 되살아난다. **누르는 쪽에서 세는 못**을 따로 세웠다.
70
+
71
+ ### 주소를 하나도 못 얻었을 때도 말한다
72
+
73
+ ```
74
+ [core] "무게" 의 소리 주소를 한 자리에서도 못 얻었다 — 브라우저 낭독으로 간다.
75
+ ```
76
+ **뿌리는 아직 모른다.** ①(안 풀림)도 ②(걸개)도 아니라면 `<audio>.play()` 0회를 아직 설명
77
+ 못 한다. 찍히는 줄이 그 다음을 가른다 — 찍히면 리졸버가 **코어 쪽에서 안 보이는** 것이고
78
+ (묶음이 갈려 `globalThis` 를 서로 다르게 보는 자리), 안 찍히는데 소리가 없으면
79
+ `playOneShot` 뒤쪽이다.
80
+
81
+ ### 곁다리 — (304) 되살리는 규칙의 **자리**를 못으로 묶었다
82
+
83
+ 말귀_1 이 인쇄 실측 중에 *"그 규칙이 `@media print` 밖에 있다"* 고 물어 왔다. **밖이 맞다** —
84
+ 조건은 *"인쇄 중이냐"* 가 아니라 **"이 문서가 종이 문서냐"** 이고, 이 문서는 **새 창**과
85
+ **내려받은 HTML** 로도 열려 거기서는 사람이 화면으로 본다. 안으로 옮기면 그 둘에서만
86
+ 단추가 사라지는데 **그 둘은 아무도 안 재는 자리다.** 까닭을 적고 못으로 묶었다.
87
+
88
+ > 못을 세우다 두 번 데었다. ㉮ *"규칙이 `@media print` 보다 앞에 나오나"* 로 셌는데 그
89
+ > 파일엔 `@media print` 가 **여럿**이라(주석에도) 자리 번호로는 안 갈린다 — **중괄호 깊이**로
90
+ > 고쳤다. ㉯ 그 주석에 백틱을 썼다가 **template literal 이 거기서 끊겼다** — 이 파일에서
91
+ > 두 번째다.
92
+
10
93
  ## 0.334.0 — (307)③ 소리 길이 **선 채로 끝났다** — 말귀_1 실측
11
94
 
12
95
  0.331.0 의 다시 듣기가 **반만 들어왔다.** 말귀_1 이 앱에서 쟀다: