@ihabdevteam/core 0.289.0 → 0.291.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,110 @@ All notable changes to this project will be documented in this file.
7
7
  > 적은 글이라, 지금 이름으로 고쳐 놓으면 그 시절에 그 이름으로 받은 사람이
8
8
  > 제 이야기를 못 찾는다.
9
9
 
10
+ ## 0.291.0
11
+
12
+ ### 소리 중에 멈췄다 이으면 **그 자리에서 바로** 난다 — 앞뜸을 다시 안 준다
13
+
14
+ 사용자 신고. 지금까지 잰 것은 **뜸 중** 멈춤뿐이었고 이것은 **소리 중** 멈춤이다. 말귀 실측:
15
+
16
+ 2789ms ⏸ prog=0.4302 · currentTime=0.297
17
+ 3991ms ▶
18
+ +0ms prog=0.4302
19
+ +122ms prog=0.0399 ← 43% 에서 **4% 로 떨어진다**
20
+ +996ms prog=0.3304 ← 앞뜸 1000ms 를 **처음부터 다시** 기어오른다
21
+ +1124ms prog=0.4740 ← 소리가 이어지며 **또 튄다**
22
+
23
+ 까닭은 하나다 — **소리는 멈춘 자리에서 이어 가는데 앞뜸을 또 줘서 진행만 0 부터 다시 셌다.**
24
+ 둘이 1초 동안 어긋난 채 가다가 한 번에 메워진 것이 그 튐이다.
25
+
26
+ 앞뜸은 *소리 **앞**의 구간*이다. 이미 시작된 소리를 이어 트는 데 다시 줄 것이 아니다.
27
+ `currentTime > 0` 이면 뜸을 건너뛴다. 시간표가 안 바뀌니 **진행 값이 그대로 이어지고**,
28
+ 소음은 `play` 와 **같은 순간**에 선다(멈출 때 함께 멎었으니 설 때도 함께 선다).
29
+
30
+ 멈춤·이음 표가 이렇게 찼다 — 비어 있던 가운데 줄이 이번에 정해졌다:
31
+
32
+ 앞뜸에서 멈춤 → 앞뜸부터 다시(1000ms 처음부터) 0.278.0
33
+ **소리 중에 멈춤** → **뜸 없이 그 자리에서 바로** 0.291.0
34
+ 사이·뒤뜸에서 멈춤 → 다음 소리로(마지막이면 완료) 0.278.0
35
+
36
+ > 못을 둘 박았다. 하나는 "이으면 곧 난다"(+100ms 안), 하나는 **그 반대쪽** — "처음 틀 때는
37
+ > 앞뜸을 그대로 준다". 앞의 것만 두면 **앞뜸을 아예 빼도 통과한다**(깨 보니 62 개가 빨개지긴
38
+ > 했지만, 그것은 다른 못들이 받쳐 준 것이지 이 못이 센 것이 아니다).
39
+
40
+ > 글자를 짚던 시험 둘이 빨개졌다 — 조건에 `&& !이어틀기` 가 붙어서다. **뜻은 그대로인데
41
+ > 글자가 달라진** 오늘의 다섯 번째 자리라, 이제 조건의 글자가 아니라 *앞뜸을 가르는 `if`*
42
+ > 를 찾는다.
43
+
44
+ ### 흔들리던 못 하나 더 — `10ms` 기다림을 **조건 기다림**으로
45
+
46
+ `strictModeSideEffects0915` 의 둘이 `setTimeout(10)` 뒤에 "한 번만 왔나" 를 물었다. 10ms 는
47
+ **한가한 기계에서만** 넉넉하다 — 더운 기계에서 `EffectPartyPopper` 쪽이 빨개졌고, 혼자
48
+ 돌리면 늘 초록이라 처음엔 안 보였다. `waitFor` 로 **올 때까지 기다렸다가** 센다.
49
+
50
+ > 어제 잡은 `useProgressTicker` 와 같은 꼴이다(그쪽은 틈이 2ms 였다). **시계에 기댄 못은
51
+ > 한가할 때 늘 초록이다** — 그것이 "안 흔들린다" 가 아니다.
52
+
53
+ ## 0.290.0
54
+
55
+ ### 한 번 울리는 소리를 만드는 자리를 **하나로** ((85) 3단계 앞머리, **동작 불변**)
56
+
57
+ 맨 `new Audio(url)` 이 **네 자리**에 흩어져 있었다 — 낱말표 칸 · 훈련 낱말 카드 · 미리듣기 ·
58
+ 인쇄 종이. 넷이 같은 결정을 저마다 적었고, **한 자리만 안 따라갔다**: 끝을 한 번만
59
+ 처리하는 가드가 **낱말 카드에만** 있었다. `audio.play()` 의 거절과 `error` 이벤트가 함께
60
+ 나는 일이 실제로 있어, 그 가드가 없으면 폴백이 두 번 걸려 '모두 듣기' 에서 소리가 겹친다.
61
+ 나머지 둘이 멀쩡했던 것은 끝 처리가 마침 두 번 불려도 빈손인 꼴이어서였고 — **운이지
62
+ 설계가 아니다.**
63
+
64
+ `playOneShot(url, onEnd?)` 하나가 그 일을 맡는다(`oneShotSound.ts`). 자물쇠는 **여기서 안
65
+ 잡는다** — 셋이 잡는 결이 저마다 달라서다(낱말 카드는 기기 목소리와 자리를 함께 쓰고,
66
+ 미리듣기는 소리 여럿을 한 번 잡아 잇달아 틀고, 낱말표 칸은 하나다). 요소 하나의 삶만 맡는다.
67
+
68
+ > 끝을 **그 자리에서** 알린다(약속의 다음 틱이 아니라). 처음에 약속으로만 알렸더니
69
+ > `setPlaying(false)` 이 한 틱 늦어, 자물쇠를 남이 가져간 **그 순간**에 단어표 칸이 아직
70
+ > "재생 중" 으로 보였다 — 시험 셋이 그것을 잡았다. **동작 불변을 지키는 일은 ms 단위다.**
71
+
72
+ **전체 소리 · 재생 속도는 아직 안 따른다.** 넷 다 `volume`·`playbackRate` 를 안 건드린다 —
73
+ 그것을 따라야 하는지는 **사장님 결정을 기다리는 물음**이다. 이 판이 한 일은 그 결정이
74
+ 내려졌을 때 **고칠 자리를 하나로 만들어 둔 것**이다. 흩어진 채로 결정이 내려지면, 지금까지
75
+ 그래 왔듯 한 자리가 안 따라간다.
76
+
77
+ 인쇄 종이(`wordTablePrint`)는 `document.write` 로 띄운 **다른 문서**라 이 모듈을 못 가져간다 —
78
+ 거기만 글자로 남는다. 다섯째 자리가 생기면 **세는 문**이 운다(`test/oneShotSound.test.ts`).
79
+
80
+ ### 어림으로 그리는 자리를 **스스로 말하게** 한다
81
+
82
+ 0.289.0 이 *"뜸이 도는데 소리 길이를 모르면 뜸만으로 어림잡는다"* 를 넣었다. 말귀가 탭을
83
+ 앞에 두고 다시 재니 **앞뜸 내내 길이를 알고 있었다**(`0.744` · `0.72`, `readyState=4`) —
84
+ 그 되돌아감은 **탭이 뒤에 있어 `requestAnimationFrame` 이 눌린 그림**이었고 보고는
85
+ 거둬들여졌다. 그러면 그 가지는 **지금 쓰는 길에서는 안 타야 한다.**
86
+
87
+ 안 타는 것을 믿지 않고 **재서 안다**: 뜸이 도는데 쓸 길이가 0 이면 개발 빌드에서 한 줄
88
+ 찍는다. 전에는 `<audio>` 가 `null`(모름) 을 줄 때만 봤는데, `duration === 0` 을 주는 동안에도
89
+ 같은 어림을 그리면서 말이 없었다 — **같은 일을 하는 두 꼴 중 하나만 보고 있었다.**
90
+
91
+ ### 느린 틀을 **고비마다** 말한다 — 한 번 말하고 입을 다물면 다음 사람은 못 듣는다
92
+
93
+ 같은 밤에 **같은 함정에 세 번** 빠졌다(말귀 (77) · 말귀 되돌아감 보고 · 내 놀이터 측정).
94
+ 코어는 (77) 때 넣은 줄로 **이미 말하고 있었다.** 그런데 `devWarnOnce` 는 한 판에 한 번이라,
95
+ 처음 한 줄 찍고 나면 그 뒤로는 칸이 숨든 말든 조용하다 — **두 번째로 재는 사람은 조용한
96
+ 콘솔을 본다.**
97
+
98
+ 이제 틀이 2초 넘게 멀쩡하다가 다시 느려지면 **새 고비**로 세어 다시 말한다(한 고비에 한 번,
99
+ 다섯 고비까지, 몇 번째인지 함께 적는다). 한 고비 안에서 매 틀 찍지 않는 것은 그대로다.
100
+
101
+ > 처음 쓴 코드는 "마지막으로 느렸던 때" 를 **0 으로** 뒀다. `performance.now()` 는 쪽이 열린
102
+ > 뒤부터 세므로 **첫 1~2초 안의 느림을 통째로 놓친다** — 그리고 측정은 보통 쪽을 열자마자
103
+ > 한다. 시험이 잡았다.
104
+
105
+ 말귀 쪽 빈 자리도 같은 결이었다: 콘솔을 **오류만** 걸러 읽고 있어서 `warn` 인 이 줄이 그물에
106
+ 안 걸렸다. **말을 만드는 쪽이 아니라 듣는 쪽**이 비어 있었다. 양쪽 점검 목록에
107
+ `document.hidden` · 틀 세기 · **콘솔에 느린 틀 줄이 없음** 셋을 올렸다.
108
+
109
+ > 이 밤 세 번째로 같은 함정이다: **숨은 칸에서는 틀이 1초에 하나로 줄어 셈이 멀쩡해도
110
+ > 마커가 멈춘 것처럼 보인다.** 코어는 그때 `진행 사슬의 틀 사이가 ___ms` 를 이미 찍고
111
+ > 있었다(0.27x). 찍히는데 **아무도 콘솔을 먼저 안 봤다** — 말을 만드는 것과 그 말을 듣게
112
+ > 하는 것은 다른 일이다.
113
+
10
114
  ## 0.289.0
11
115
 
12
116
  ### 앞뜸 동안 재생바가 다시 **나아간다** — 되돌아감 고침