@remember-web/sse 0.1.0-alpha.1

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.
Files changed (160) hide show
  1. package/README.md +238 -0
  2. package/dist/src/core/BaseSseClient.cjs.js +97 -0
  3. package/dist/src/core/BaseSseClient.cjs.js.map +1 -0
  4. package/dist/src/core/BaseSseClient.d.ts +33 -0
  5. package/dist/src/core/BaseSseClient.d.ts.map +1 -0
  6. package/dist/src/core/BaseSseClient.esm.js +89 -0
  7. package/dist/src/core/BaseSseClient.esm.js.map +1 -0
  8. package/dist/src/core/SseClient.cjs.js +382 -0
  9. package/dist/src/core/SseClient.cjs.js.map +1 -0
  10. package/dist/src/core/SseClient.d.ts +24 -0
  11. package/dist/src/core/SseClient.d.ts.map +1 -0
  12. package/dist/src/core/SseClient.esm.js +370 -0
  13. package/dist/src/core/SseClient.esm.js.map +1 -0
  14. package/dist/src/core/backoff.cjs.js +30 -0
  15. package/dist/src/core/backoff.cjs.js.map +1 -0
  16. package/dist/src/core/backoff.d.ts +12 -0
  17. package/dist/src/core/backoff.d.ts.map +1 -0
  18. package/dist/src/core/backoff.esm.js +28 -0
  19. package/dist/src/core/backoff.esm.js.map +1 -0
  20. package/dist/src/core/emitter.cjs.js +57 -0
  21. package/dist/src/core/emitter.cjs.js.map +1 -0
  22. package/dist/src/core/emitter.d.ts +14 -0
  23. package/dist/src/core/emitter.d.ts.map +1 -0
  24. package/dist/src/core/emitter.esm.js +51 -0
  25. package/dist/src/core/emitter.esm.js.map +1 -0
  26. package/dist/src/core/eventNames.cjs.js +64 -0
  27. package/dist/src/core/eventNames.cjs.js.map +1 -0
  28. package/dist/src/core/eventNames.d.ts +31 -0
  29. package/dist/src/core/eventNames.d.ts.map +1 -0
  30. package/dist/src/core/eventNames.esm.js +54 -0
  31. package/dist/src/core/eventNames.esm.js.map +1 -0
  32. package/dist/src/core/retryWait.cjs.js +20 -0
  33. package/dist/src/core/retryWait.cjs.js.map +1 -0
  34. package/dist/src/core/retryWait.d.ts +6 -0
  35. package/dist/src/core/retryWait.d.ts.map +1 -0
  36. package/dist/src/core/retryWait.esm.js +18 -0
  37. package/dist/src/core/retryWait.esm.js.map +1 -0
  38. package/dist/src/core/statusMachine.cjs.js +56 -0
  39. package/dist/src/core/statusMachine.cjs.js.map +1 -0
  40. package/dist/src/core/statusMachine.d.ts +9 -0
  41. package/dist/src/core/statusMachine.d.ts.map +1 -0
  42. package/dist/src/core/statusMachine.esm.js +54 -0
  43. package/dist/src/core/statusMachine.esm.js.map +1 -0
  44. package/dist/src/core/stream.cjs.js +136 -0
  45. package/dist/src/core/stream.cjs.js.map +1 -0
  46. package/dist/src/core/stream.d.ts +42 -0
  47. package/dist/src/core/stream.d.ts.map +1 -0
  48. package/dist/src/core/stream.esm.js +128 -0
  49. package/dist/src/core/stream.esm.js.map +1 -0
  50. package/dist/src/core/ticket.cjs.js +237 -0
  51. package/dist/src/core/ticket.cjs.js.map +1 -0
  52. package/dist/src/core/ticket.d.ts +31 -0
  53. package/dist/src/core/ticket.d.ts.map +1 -0
  54. package/dist/src/core/ticket.esm.js +220 -0
  55. package/dist/src/core/ticket.esm.js.map +1 -0
  56. package/dist/src/core/types.cjs.js +54 -0
  57. package/dist/src/core/types.cjs.js.map +1 -0
  58. package/dist/src/core/types.d.ts +131 -0
  59. package/dist/src/core/types.d.ts.map +1 -0
  60. package/dist/src/core/types.esm.js +50 -0
  61. package/dist/src/core/types.esm.js.map +1 -0
  62. package/dist/src/core/wire.cjs.js +29 -0
  63. package/dist/src/core/wire.cjs.js.map +1 -0
  64. package/dist/src/core/wire.d.ts +7 -0
  65. package/dist/src/core/wire.d.ts.map +1 -0
  66. package/dist/src/core/wire.esm.js +23 -0
  67. package/dist/src/core/wire.esm.js.map +1 -0
  68. package/dist/src/createSseClient.cjs.js +30 -0
  69. package/dist/src/createSseClient.cjs.js.map +1 -0
  70. package/dist/src/createSseClient.d.ts +8 -0
  71. package/dist/src/createSseClient.d.ts.map +1 -0
  72. package/dist/src/createSseClient.esm.js +28 -0
  73. package/dist/src/createSseClient.esm.js.map +1 -0
  74. package/dist/src/index.cjs.js +10 -0
  75. package/dist/src/index.cjs.js.map +1 -0
  76. package/dist/src/index.d.ts +6 -0
  77. package/dist/src/index.d.ts.map +1 -0
  78. package/dist/src/index.esm.js +3 -0
  79. package/dist/src/index.esm.js.map +1 -0
  80. package/dist/src/react/createSseContext.cjs.js +130 -0
  81. package/dist/src/react/createSseContext.cjs.js.map +1 -0
  82. package/dist/src/react/createSseContext.d.ts +32 -0
  83. package/dist/src/react/createSseContext.d.ts.map +1 -0
  84. package/dist/src/react/createSseContext.esm.js +122 -0
  85. package/dist/src/react/createSseContext.esm.js.map +1 -0
  86. package/dist/src/react/index.cjs.js +8 -0
  87. package/dist/src/react/index.cjs.js.map +1 -0
  88. package/dist/src/react/index.d.ts +3 -0
  89. package/dist/src/react/index.d.ts.map +1 -0
  90. package/dist/src/react/index.esm.js +2 -0
  91. package/dist/src/react/index.esm.js.map +1 -0
  92. package/dist/src/testing/doubles.d.ts +50 -0
  93. package/dist/src/testing/doubles.d.ts.map +1 -0
  94. package/dist/src/testing/harness.d.ts +43 -0
  95. package/dist/src/testing/harness.d.ts.map +1 -0
  96. package/dist/src/testing/index.d.ts +3 -0
  97. package/dist/src/testing/index.d.ts.map +1 -0
  98. package/dist/src/worker/WorkerSseClient.cjs.js +240 -0
  99. package/dist/src/worker/WorkerSseClient.cjs.js.map +1 -0
  100. package/dist/src/worker/WorkerSseClient.d.ts +23 -0
  101. package/dist/src/worker/WorkerSseClient.d.ts.map +1 -0
  102. package/dist/src/worker/WorkerSseClient.esm.js +228 -0
  103. package/dist/src/worker/WorkerSseClient.esm.js.map +1 -0
  104. package/dist/src/worker/hub.d.ts +19 -0
  105. package/dist/src/worker/hub.d.ts.map +1 -0
  106. package/dist/src/worker/portRegistry.d.ts +41 -0
  107. package/dist/src/worker/portRegistry.d.ts.map +1 -0
  108. package/dist/src/worker/protocol.d.ts +63 -0
  109. package/dist/src/worker/protocol.d.ts.map +1 -0
  110. package/dist/src/worker/sse.worker.d.ts +2 -0
  111. package/dist/src/worker/sse.worker.d.ts.map +1 -0
  112. package/dist/src/worker/ticketDelegate.d.ts +16 -0
  113. package/dist/src/worker/ticketDelegate.d.ts.map +1 -0
  114. package/dist/src/worker/workerConnection.d.ts +28 -0
  115. package/dist/src/worker/workerConnection.d.ts.map +1 -0
  116. package/dist/worker/sse.worker.js +1865 -0
  117. package/dist/worker/sse.worker.js.map +1 -0
  118. package/package.json +87 -0
  119. package/src/core/BaseSseClient.test.ts +142 -0
  120. package/src/core/BaseSseClient.ts +103 -0
  121. package/src/core/SseClient.connection.test.ts +863 -0
  122. package/src/core/SseClient.scenarios.test.ts +164 -0
  123. package/src/core/SseClient.test.ts +63 -0
  124. package/src/core/SseClient.ts +310 -0
  125. package/src/core/backoff.test.ts +43 -0
  126. package/src/core/backoff.ts +39 -0
  127. package/src/core/emitter.ts +56 -0
  128. package/src/core/eventNames.ts +53 -0
  129. package/src/core/retryWait.ts +18 -0
  130. package/src/core/statusMachine.ts +56 -0
  131. package/src/core/stream.ts +141 -0
  132. package/src/core/ticket.ts +146 -0
  133. package/src/core/types.ts +182 -0
  134. package/src/core/wire.ts +23 -0
  135. package/src/createSseClient.test.ts +82 -0
  136. package/src/createSseClient.ts +34 -0
  137. package/src/index.ts +21 -0
  138. package/src/react/SseProvider.test.tsx +129 -0
  139. package/src/react/createSseContext.test.ts +47 -0
  140. package/src/react/createSseContext.tsx +140 -0
  141. package/src/react/index.ts +2 -0
  142. package/src/react/useSseEvent.test.tsx +71 -0
  143. package/src/react/useSseStatus.test.tsx +40 -0
  144. package/src/testing/doubles.ts +128 -0
  145. package/src/testing/harness.ts +82 -0
  146. package/src/testing/index.ts +3 -0
  147. package/src/worker/SseClientLike.contract.test.ts +270 -0
  148. package/src/worker/WorkerSseClient.scenarios.test.ts +179 -0
  149. package/src/worker/WorkerSseClient.test.ts +377 -0
  150. package/src/worker/WorkerSseClient.ts +190 -0
  151. package/src/worker/hub.connection.test.ts +1023 -0
  152. package/src/worker/hub.test.ts +213 -0
  153. package/src/worker/hub.ts +120 -0
  154. package/src/worker/portRegistry.test.ts +59 -0
  155. package/src/worker/portRegistry.ts +86 -0
  156. package/src/worker/protocol.ts +80 -0
  157. package/src/worker/sse.worker.ts +19 -0
  158. package/src/worker/ticketDelegate.test.ts +99 -0
  159. package/src/worker/ticketDelegate.ts +80 -0
  160. package/src/worker/workerConnection.ts +134 -0
@@ -0,0 +1,63 @@
1
+ import type { TicketError } from '../core/ticket';
2
+ import type { SseStatus } from '../core/types';
3
+ /**
4
+ * @description 탭 프록시(WorkerSseClient) ↔ 워커 허브(hub)가 포트로 주고받는 메시지 어휘와 배선 지도.
5
+ * 수신 처리가 아직 없는 kind는 미지 kind와 같은 규칙으로 무시됩니다 —
6
+ * 배포 skew로 신·구 코드가 섞여도 안전하게 (코어의 "미지 이벤트는 무시"와 대칭).
7
+ *
8
+ * subscribe·close : WorkerSseClient → hub. 배선 완료
9
+ * status·event : hub → WorkerSseClient. 배선 완료 — frozen 탭에게도 계속 보냅니다
10
+ * (밀린 몫은 브라우저가 큐잉했다 배달 — 근거는 portRegistry)
11
+ * ping / pong : hub → 탭 / 탭 → hub. 배선 완료 — 무응답이어도 장부에서 빼지 않고
12
+ * 티켓 대상에서만 제외합니다. 전원이 침묵하면 연결을 접습니다(휴면)
13
+ * init : 탭 → hub. 배선 완료 — 첫 탭의 baseUrl로 연결을 세우고,
14
+ * 휴면으로 접힌 연결을 깨어난 탭이 이 신호로 다시 엽니다
15
+ * ticket-request / response : hub → 탭 / 탭 → hub. 배선 완료 — 토큰은 탭에 남고 발급 결과만 오갑니다
16
+ *
17
+ * 로그아웃은 서버가 goaway(reason: user_logout)로 알려 모든 탭에 함께 닿습니다 — 탭이 워커에 알리는 kind는 두지 않습니다.
18
+ */
19
+ /** @description 티켓 위임의 응답 — 토큰이 아니라 발급 결과(티켓 문자열)만 워커로 넘어갑니다 */
20
+ export type TicketResponseMessage = {
21
+ kind: 'ticket-response';
22
+ ok: true;
23
+ ticket: string;
24
+ } | {
25
+ kind: 'ticket-response';
26
+ ok: false;
27
+ error: TicketError;
28
+ };
29
+ export type TabToWorkerMessage = {
30
+ kind: 'init';
31
+ baseUrl: string;
32
+ } | {
33
+ kind: 'subscribe';
34
+ event: string;
35
+ } | {
36
+ kind: 'pong';
37
+ } | {
38
+ kind: 'close';
39
+ } | TicketResponseMessage;
40
+ export type WorkerToTabMessage = {
41
+ kind: 'event';
42
+ event: string;
43
+ payload: unknown;
44
+ } | {
45
+ kind: 'status';
46
+ status: SseStatus;
47
+ } | {
48
+ kind: 'ping';
49
+ } | {
50
+ kind: 'ticket-request';
51
+ };
52
+ /**
53
+ * @description 포트로 갓 도착한 메시지 — kind만 믿고 나머지 필드는 검사 전까지 unknown입니다.
54
+ * 보낸 쪽이 구버전·타 구현일 수 있어, 검사를 빠뜨리면 컴파일이 막히도록 여기서 좁혀둡니다.
55
+ */
56
+ export type Incoming<M extends {
57
+ kind: string;
58
+ }> = {
59
+ [K in keyof M]: K extends 'kind' ? M[K] : unknown;
60
+ };
61
+ /** @description 판정을 메시지 정의 옆에 둡니다 — 필드가 바뀌면 여기도 같이 눈에 띄도록 */
62
+ export declare const isTicketResponse: (message: Incoming<TabToWorkerMessage>) => message is TicketResponseMessage;
63
+ //# sourceMappingURL=protocol.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"protocol.d.ts","sourceRoot":"","sources":["../../../src/worker/protocol.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAC;AAClD,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,eAAe,CAAC;AAE/C;;;;;;;;;;;;;;;GAeG;AACH,gEAAgE;AAChE,MAAM,MAAM,qBAAqB,GAC7B;IAAE,IAAI,EAAE,iBAAiB,CAAC;IAAC,EAAE,EAAE,IAAI,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,GACrD;IAAE,IAAI,EAAE,iBAAiB,CAAC;IAAC,EAAE,EAAE,KAAK,CAAC;IAAC,KAAK,EAAE,WAAW,CAAA;CAAE,CAAC;AAE/D,MAAM,MAAM,kBAAkB,GAC1B;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE,GAEjC;IAAE,IAAI,EAAE,WAAW,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,GACpC;IAAE,IAAI,EAAE,MAAM,CAAA;CAAE,GAChB;IAAE,IAAI,EAAE,OAAO,CAAA;CAAE,GACjB,qBAAqB,CAAC;AAE1B,MAAM,MAAM,kBAAkB,GAC1B;IAAE,IAAI,EAAE,OAAO,CAAC;IAAC,KAAK,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,OAAO,CAAA;CAAE,GAClD;IAAE,IAAI,EAAE,QAAQ,CAAC;IAAC,MAAM,EAAE,SAAS,CAAA;CAAE,GACrC;IAAE,IAAI,EAAE,MAAM,CAAA;CAAE,GAChB;IAAE,IAAI,EAAE,gBAAgB,CAAA;CAAE,CAAC;AAE/B;;;GAGG;AACH,MAAM,MAAM,QAAQ,CAAC,CAAC,SAAS;IAAE,IAAI,EAAE,MAAM,CAAA;CAAE,IAAI;KAChD,CAAC,IAAI,MAAM,CAAC,GAAG,CAAC,SAAS,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,OAAO;CAClD,CAAC;AAEF,6DAA6D;AAC7D,eAAO,MAAM,gBAAgB,YAClB,SAAS,kBAAkB,CAAC,qCA+BtC,CAAC"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=sse.worker.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sse.worker.d.ts","sourceRoot":"","sources":["../../../src/worker/sse.worker.ts"],"names":[],"mappings":""}
@@ -0,0 +1,16 @@
1
+ import type { TicketResponseMessage } from './protocol';
2
+ import type { TicketResult } from '../core/ticket';
3
+ export declare const TICKET_RESPONSE_TIMEOUT_MS: number;
4
+ /**
5
+ * @description 티켓 발급을 탭에 위임합니다 — 토큰은 탭에 남고 워커는 발급 결과만 받습니다.
6
+ * 워커가 코어 연결 루프를 그대로 쓸 수 있도록, 요청·응답 왕복을 Promise 하나로 바꿉니다.
7
+ */
8
+ export declare const createTicketDelegate: (requestFromTab: () => void) => {
9
+ request: () => Promise<TicketResult>;
10
+ /** @description 다음 연결이 이 왕복에 합류해 응답 없이 기다리지 않게 끊습니다 */
11
+ cancel: () => void;
12
+ /** @description 시간 제한 뒤 도착한 응답은 pending이 비어 있어 무시됩니다 */
13
+ settle: (message: TicketResponseMessage) => void;
14
+ };
15
+ export type TicketDelegate = ReturnType<typeof createTicketDelegate>;
16
+ //# sourceMappingURL=ticketDelegate.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ticketDelegate.d.ts","sourceRoot":"","sources":["../../../src/worker/ticketDelegate.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,YAAY,CAAC;AAExD,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAOnD,eAAO,MAAM,0BAA0B,QACM,CAAC;AAI9C;;;GAGG;AACH,eAAO,MAAM,oBAAoB,mBAAoB,MAAM,IAAI;mBAsC9C,QAAQ,YAAY,CAAC;IASlC,uDAAuD;kBAC3C,IAAI;IAEhB,wDAAwD;sBACtC,qBAAqB,KAAG,IAAI;CAQjD,CAAC;AAEF,MAAM,MAAM,cAAc,GAAG,UAAU,CAAC,OAAO,oBAAoB,CAAC,CAAC"}
@@ -0,0 +1,28 @@
1
+ import type { TicketDelegate } from './ticketDelegate';
2
+ import type { SseClientOptions, SseStatus } from '../core/types';
3
+ /**
4
+ * @description 워커 스코프에는 토큰이 없어 getAuthToken을 받지 않습니다 — 티켓은 탭이 발급해 넘겨줍니다
5
+ */
6
+ export type WorkerConnectionOptions = Pick<SseClientOptions, 'fetch' | 'eventSource' | 'backoff' | 'logger'>;
7
+ interface WorkerConnectionDeps {
8
+ options: WorkerConnectionOptions;
9
+ ticketDelegate: TicketDelegate;
10
+ onStatus: (status: SseStatus) => void;
11
+ onEvent: (event: string, payload: unknown) => void;
12
+ }
13
+ /**
14
+ * @description 모든 탭이 함께 쓰는 워커의 연결 하나 — 수립·정리와 구독 부착을 맡습니다.
15
+ * 탭 장부(hub)는 "탭이 남았는가"만 판단하고, 그 판단을 연결에 적용하는 방법은 여기서만 압니다.
16
+ */
17
+ export declare const createWorkerConnection: ({ options, ticketDelegate, onStatus, onEvent, }: WorkerConnectionDeps) => {
18
+ ensureOpen: (baseUrl: string) => void;
19
+ close: ({ endSession }?: {
20
+ endSession?: boolean | undefined;
21
+ }) => void;
22
+ /** @description 선 연결에는 즉시, 이후 연결에는 수립 시점에 붙습니다 */
23
+ subscribe: (event: string) => void;
24
+ subscribedEvents: () => string[];
25
+ };
26
+ export type WorkerConnection = ReturnType<typeof createWorkerConnection>;
27
+ export {};
28
+ //# sourceMappingURL=workerConnection.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"workerConnection.d.ts","sourceRoot":"","sources":["../../../src/worker/workerConnection.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AAIvD,OAAO,KAAK,EAAE,gBAAgB,EAAE,SAAS,EAAe,MAAM,eAAe,CAAC;AAE9E;;GAEG;AACH,MAAM,MAAM,uBAAuB,GAAG,IAAI,CACxC,gBAAgB,EAChB,OAAO,GAAG,aAAa,GAAG,SAAS,GAAG,QAAQ,CAC/C,CAAC;AAEF,UAAU,oBAAoB;IAC5B,OAAO,EAAE,uBAAuB,CAAC;IACjC,cAAc,EAAE,cAAc,CAAC;IAC/B,QAAQ,EAAE,CAAC,MAAM,EAAE,SAAS,KAAK,IAAI,CAAC;IACtC,OAAO,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,KAAK,IAAI,CAAC;CACpD;AAKD;;;GAGG;AACH,eAAO,MAAM,sBAAsB,oDAKhC,oBAAoB;0BAgEG,MAAM,KAAG,IAAI;;;UAnBQ,IAAI;IAuC/C,kDAAkD;uBAC/B,MAAM,KAAG,IAAI;4BAWV,MAAM,EAAE;CAEjC,CAAC;AAEF,MAAM,MAAM,gBAAgB,GAAG,UAAU,CAAC,OAAO,sBAAsB,CAAC,CAAC"}