@orpc/publisher 2.0.0-beta.3 β†’ 2.0.0-beta.30

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
@@ -4,9 +4,12 @@
4
4
  <a href="https://codecov.io/gh/middleapi/orpc">
5
5
  <img alt="codecov" src="https://codecov.io/gh/middleapi/orpc/branch/main/graph/badge.svg">
6
6
  </a>
7
- <a href="https://www.npmjs.com/package/@orpc/publisher">
7
+ <a href="https://npmx.dev/package/@orpc/publisher">
8
8
  <img alt="weekly downloads" src="https://img.shields.io/npm/dw/%40orpc%2Fpublisher?logo=npm" />
9
9
  </a>
10
+ <a href="https://app.codspeed.io/middleapi/orpc?utm_source=badge">
11
+ <img alt="CodSpeed" src="https://img.shields.io/endpoint?url=https://codspeed.io/badge.json" />
12
+ </a>
10
13
  <a href="https://github.com/middleapi/orpc/blob/main/LICENSE">
11
14
  <img alt="MIT License" src="https://img.shields.io/github/license/middleapi/orpc?logo=open-source-initiative" />
12
15
  </a>
@@ -26,60 +29,63 @@ You can read the documentation [here](https://orpc.dev).
26
29
 
27
30
  **Core**
28
31
 
29
- - [@orpc/contract](https://www.npmjs.com/package/@orpc/contract): Define type-safe contracts for your API.
30
- - [@orpc/server](https://www.npmjs.com/package/@orpc/server): Implement your API or contract on the server.
31
- - [@orpc/client](https://www.npmjs.com/package/@orpc/client): Consume your API from the client with full type safety.
32
- - [@orpc/openapi](https://www.npmjs.com/package/@orpc/openapi): Bring OpenAPI compatibility to your APIs.
32
+ - [@orpc/contract](https://npmx.dev/package/@orpc/contract): Define API contract as the single source of truth.
33
+ - [@orpc/server](https://npmx.dev/package/@orpc/server): Build APIs or implement contracts.
34
+ - [@orpc/client](https://npmx.dev/package/@orpc/client): Consume APIs with end-to-end type safety.
35
+ - [@orpc/openapi](https://npmx.dev/package/@orpc/openapi): Add OpenAPI compatibility to APIs.
33
36
 
34
37
  **Schema validation**
35
38
 
36
- - [@orpc/zod](https://www.npmjs.com/package/@orpc/zod): Integrate with [Zod](https://zod.dev/).
37
- - [@orpc/valibot](https://www.npmjs.com/package/@orpc/valibot): Integrate with [Valibot](https://valibot.dev/).
38
- - [@orpc/arktype](https://www.npmjs.com/package/@orpc/arktype): Integrate with [ArkType](https://arktype.io/).
39
+ - [@orpc/zod](https://npmx.dev/package/@orpc/zod): Integrate with [Zod](https://zod.dev/).
40
+ - [@orpc/valibot](https://npmx.dev/package/@orpc/valibot): Integrate with [Valibot](https://valibot.dev/).
41
+ - [@orpc/arktype](https://npmx.dev/package/@orpc/arktype): Integrate with [ArkType](https://arktype.io/).
39
42
 
40
- **Framework & ecosystem integrations**
43
+ **Built-in features**
41
44
 
42
- - [@orpc/next](https://www.npmjs.com/package/@orpc/react): Use oRPC with [Next.js Server Functions](https://nextjs.org/docs/app/getting-started/mutating-data).
43
- - [@orpc/tanstack-query](https://www.npmjs.com/package/@orpc/tanstack-query): Integrate with [TanStack Query](https://tanstack.com/query/latest).
44
- - [@orpc/experimental-effect](https://www.npmjs.com/package/@orpc/experimental-effect): Integrate with [Effect](https://effect.website/).
45
+ - [@orpc/publisher](https://npmx.dev/package/@orpc/publisher): Pub/Sub with memory, Redis, and Upstash adapters.
46
+ - [@orpc/ratelimit](https://npmx.dev/package/@orpc/ratelimit): Rate limiting with memory, Redis, and Upstash adapters.
47
+ - [@orpc/hibernation](https://npmx.dev/package/@orpc/hibernation): Leverage Hibernation APIs like [Cloudflare's Hibernation WebSocket](https://developers.cloudflare.com/durable-objects/best-practices/websockets/#durable-objects-hibernation-websocket-api).
48
+ - [@orpc/json-schema](https://npmx.dev/package/@orpc/json-schema): Smart coercion for OpenAPI requests.
45
49
 
46
- **Built-in features**
50
+ **Framework & ecosystem integrations**
47
51
 
48
- - [@orpc/publisher](https://www.npmjs.com/package/@orpc/publisher): Pub/Sub.
49
- - [@orpc/ratelimit](https://www.npmjs.com/package/@orpc/ratelimit): Rate limiting.
50
- - [@orpc/json-schema](https://www.npmjs.com/package/@orpc/json-schema): Smart coercion for OpenAPI requests.
52
+ - [@orpc/next](https://npmx.dev/package/@orpc/next): Integrate with [Next.js Server Functions](https://nextjs.org/docs/app/getting-started/mutating-data).
53
+ - [@orpc/ai-sdk](https://npmx.dev/package/@orpc/ai-sdk): Turn contracts and procedures into [AI SDK](https://ai-sdk.dev/) tools.
54
+ - [@orpc/tanstack-query](https://npmx.dev/package/@orpc/tanstack-query): Integrate with [TanStack Query](https://tanstack.com/query/latest).
55
+ - [@orpc/pinia-colada](https://npmx.dev/package/@orpc/pinia-colada): Integrate with [Pinia Colada](https://pinia-colada.esm.dev/).
56
+ - [@orpc/swr](https://npmx.dev/package/@orpc/swr): Integrate with [SWR](https://swr.vercel.app/).
57
+ - [@orpc/experimental-msw](https://npmx.dev/package/@orpc/experimental-msw): Mock procedures with [Mock Service Worker](https://mswjs.io/).
58
+ - [@orpc/experimental-effect](https://npmx.dev/package/@orpc/experimental-effect): Integrate with [Effect](https://effect.website/).
59
+ - [@orpc/nest](https://npmx.dev/package/@orpc/nest): Implement your contract with [NestJS](https://nestjs.com/).
60
+ - [@orpc/node](https://npmx.dev/package/@orpc/node): [Node.js](https://nodejs.org/) plugins for static file serving and large uploads.
61
+ - [@orpc/bun](https://npmx.dev/package/@orpc/bun): Adapters for [Bun's Redis](https://bun.sh/).
62
+ - [@orpc/cloudflare](https://npmx.dev/package/@orpc/cloudflare): Adapters for [Cloudflare's RateLimit and Durable Objects](https://developers.cloudflare.com/workers/).
63
+ - [@orpc/trpc](https://npmx.dev/package/@orpc/trpc): Reuse existing [tRPC](https://trpc.io/) routers within oRPC.
51
64
 
52
65
  **Observability**
53
66
 
54
- - [@orpc/opentelemetry](https://www.npmjs.com/package/@orpc/opentelemetry): Instrument your API with [OpenTelemetry](https://opentelemetry.io/).
55
- - [@orpc/pino](https://www.npmjs.com/package/@orpc/pino): Log with [Pino](https://getpino.io/).
56
- - [@orpc/evlog](https://www.npmjs.com/package/@orpc/evlog): Log with [Evlog](https://evlog.dev/).
67
+ - [@orpc/opentelemetry](https://npmx.dev/package/@orpc/opentelemetry): Integrate with [OpenTelemetry](https://opentelemetry.io/) for distributed tracing.
68
+ - [@orpc/pino](https://npmx.dev/package/@orpc/pino): Integrate with [Pino](https://getpino.io/) for logging.
69
+ - [@orpc/evlog](https://npmx.dev/package/@orpc/evlog): Integrate with [Evlog](https://evlog.dev/) for logging.
57
70
 
58
71
  ## Sponsors
59
72
 
60
- Like what we build over at [middleapi](https://github.com/middleapi)? You can help keep it going here: [GitHub Sponsors](https://github.com/sponsors/dinwwwh). Every bit helps! πŸš€
61
-
62
- ### πŸ† Platinum Sponsor
73
+ Like what we build over at [middleapi](https://github.com/middleapi)? You can help keep it going through [GitHub Sponsors](https://github.com/sponsors/dinwwwh) or [Open Collective](https://opencollective.com/middleapi). Every bit helps! πŸš€
63
74
 
64
75
  <table>
65
76
  <tr>
66
- <td align="center"><a href="https://screenshotone.com/?ref=orpc" target="_blank" rel="noopener" title="ScreenshotOne.com"><img src="https://avatars.githubusercontent.com/u/97035603?v=4" width="279" alt="ScreenshotOne.com"/><br />ScreenshotOne.com</a></td>
77
+ <td width="2000"><a href="https://screenshotone.com/?ref=middleapi&amp;utm_source=middleapi&amp;utm_medium=sponsor" target="_blank" rel="noopener" title="The screenshot API for developers"><img src="https://avatars.githubusercontent.com/u/97035603?v=4" width="64" align="left" hspace="12" alt="ScreenshotOne.com"/><b>ScreenshotOne.com</b></a><br /><sub>The screenshot API for developers</sub></td>
67
78
  </tr>
68
- </table>
69
-
70
- ### πŸ₯ˆ Silver Sponsor
71
-
72
- <table>
73
79
  <tr>
74
- <td align="center"><a href="https://misskey.io/?ref=orpc" target="_blank" rel="noopener" title="ζ‘δΈŠγ•γ‚“"><img src="https://avatars.githubusercontent.com/u/37681609?u=0dd4c7e4ba937cbb52b068c55914b1d8164dc0c7&amp;v=4" width="209" alt="ζ‘δΈŠγ•γ‚“"/><br />ζ‘δΈŠγ•γ‚“</a></td>
80
+ <td width="2000"><a href="https://misskey.io/?ref=middleapi&amp;utm_source=middleapi&amp;utm_medium=sponsor" target="_blank" rel="noopener sponsored" title="Decentralized microblogging SNS born on Earth"><img src="https://github.com/MisskeyIO.png" width="64" align="left" hspace="12" alt="MisskeyHQ"/><b>MisskeyHQ</b></a><br /><sub>Decentralized microblogging SNS born on Earth</sub></td>
75
81
  </tr>
76
82
  </table>
77
83
 
78
- ### Generous Sponsors
84
+ ### Organization Sponsors
79
85
 
80
86
  <table>
81
87
  <tr>
82
- <td align="center"><a href="https://github.com/ln-markets?ref=orpc" target="_blank" rel="noopener" title="LN Markets"><img src="https://avatars.githubusercontent.com/u/70597625?v=4" width="167" alt="LN Markets"/><br />LN Markets</a></td>
88
+ <td align="center"><a href="https://lnmarkets.com/?ref=middleapi&amp;utm_source=middleapi&amp;utm_medium=sponsor" target="_blank" rel="noopener sponsored" title="LN Markets"><img src="https://avatars.githubusercontent.com/u/70597625?v=4" width="167" alt="LN Markets"/><br />LN Markets</a></td>
83
89
  </tr>
84
90
  </table>
85
91
 
@@ -87,26 +93,26 @@ Like what we build over at [middleapi](https://github.com/middleapi)? You can he
87
93
 
88
94
  <table>
89
95
  <tr>
90
- <td align="center"><a href="https://github.com/hrmcdonald?ref=orpc" target="_blank" rel="noopener" title="Reece McDonald"><img src="https://avatars.githubusercontent.com/u/39349270?v=4" width="139" alt="Reece McDonald"/><br />Reece McDonald</a></td>
91
- <td align="center"><a href="https://github.com/nicognaW?ref=orpc" target="_blank" rel="noopener" title="nk"><img src="https://avatars.githubusercontent.com/u/66731869?u=4699bda3a9092d3ec34fbd959450767bcc8b8b6d&amp;v=4" width="139" alt="nk"/><br />nk</a></td>
92
- <td align="center"><a href="https://github.com/supastarter?ref=orpc" target="_blank" rel="noopener" title="supastarter"><img src="https://avatars.githubusercontent.com/u/110960143?v=4" width="139" alt="supastarter"/><br />supastarter</a></td>
93
- <td align="center"><a href="https://github.com/divmgl?ref=orpc" target="_blank" rel="noopener" title="Dexter Miguel"><img src="https://avatars.githubusercontent.com/u/5452298?u=645993204be8696c085ecf0d228c3062efe2ed65&amp;v=4" width="139" alt="Dexter Miguel"/><br />Dexter Miguel</a></td>
94
- <td align="center"><a href="https://github.com/herrfugbaum?ref=orpc" target="_blank" rel="noopener" title="herrfugbaum"><img src="https://avatars.githubusercontent.com/u/12859776?u=644dc1666d0220bc0468eb0de3c56b919f635b16&amp;v=4" width="139" alt="herrfugbaum"/><br />herrfugbaum</a></td>
95
- <td align="center"><a href="https://github.com/ryota-murakami?ref=orpc" target="_blank" rel="noopener" title="Ryota Murakami"><img src="https://avatars.githubusercontent.com/u/5501268?u=599389e03340734325726ca3f8f423c021d47d7f&amp;v=4" width="139" alt="Ryota Murakami"/><br />Ryota Murakami</a></td>
96
+ <td align="center"><a href="https://github.com/hrmcdonald?ref=middleapi&amp;utm_source=middleapi&amp;utm_medium=sponsor" target="_blank" rel="noopener sponsored" title="Reece McDonald"><img src="https://avatars.githubusercontent.com/u/39349270?v=4" width="139" alt="Reece McDonald"/><br />Reece McDonald</a></td>
97
+ <td align="center"><a href="https://soymilk.party/?ref=middleapi&amp;utm_source=middleapi&amp;utm_medium=sponsor" target="_blank" rel="noopener sponsored" title="あわわわとーにゅ"><img src="https://avatars.githubusercontent.com/u/17376330?u=de3353804be889f009f7e0a1582daf04d0ab292d&amp;v=4" width="139" alt="あわわわとーにゅ"/><br />あわわわとーにゅ</a></td>
98
+ <td align="center"><a href="https://github.com/nicognaW?ref=middleapi&amp;utm_source=middleapi&amp;utm_medium=sponsor" target="_blank" rel="noopener sponsored" title="nk"><img src="https://avatars.githubusercontent.com/u/66731869?u=4699bda3a9092d3ec34fbd959450767bcc8b8b6d&amp;v=4" width="139" alt="nk"/><br />nk</a></td>
99
+ <td align="center"><a href="https://supastarter.dev/?ref=middleapi&amp;utm_source=middleapi&amp;utm_medium=sponsor" target="_blank" rel="noopener sponsored" title="supastarter"><img src="https://avatars.githubusercontent.com/u/110960143?v=4" width="139" alt="supastarter"/><br />supastarter</a></td>
100
+ <td align="center"><a href="https://github.com/divmgl?ref=middleapi&amp;utm_source=middleapi&amp;utm_medium=sponsor" target="_blank" rel="noopener sponsored" title="Dexter Miguel"><img src="https://avatars.githubusercontent.com/u/5452298?u=645993204be8696c085ecf0d228c3062efe2ed65&amp;v=4" width="139" alt="Dexter Miguel"/><br />Dexter Miguel</a></td>
101
+ <td align="center"><a href="https://github.com/herrfugbaum?ref=middleapi&amp;utm_source=middleapi&amp;utm_medium=sponsor" target="_blank" rel="noopener sponsored" title="herrfugbaum"><img src="https://avatars.githubusercontent.com/u/12859776?u=644dc1666d0220bc0468eb0de3c56b919f635b16&amp;v=4" width="139" alt="herrfugbaum"/><br />herrfugbaum</a></td>
96
102
  </tr>
97
103
  <tr>
98
- <td align="center"><a href="https://github.com/dcramer?ref=orpc" target="_blank" rel="noopener" title="David Cramer"><img src="https://avatars.githubusercontent.com/u/23610?v=4" width="139" alt="David Cramer"/><br />David Cramer</a></td>
99
- <td align="center"><a href="https://github.com/valerii15298?ref=orpc" target="_blank" rel="noopener" title="Valerii Petryniak"><img src="https://avatars.githubusercontent.com/u/44531564?u=88ac74d9bacd20401518441907acad21063cd397&amp;v=4" width="139" alt="Valerii Petryniak"/><br />Valerii Petryniak</a></td>
100
- <td align="center"><a href="https://github.com/letstri?ref=orpc" target="_blank" rel="noopener" title="Valerii Strilets"><img src="https://avatars.githubusercontent.com/u/13253748?u=c7b10399ccc8f8081e24db94ec32cd9858e86ac3&amp;v=4" width="139" alt="Valerii Strilets"/><br />Valerii Strilets</a></td>
101
- <td align="center"><a href="https://github.com/K-Mistele?ref=orpc" target="_blank" rel="noopener" title="Kyle Mistele"><img src="https://avatars.githubusercontent.com/u/18430555?u=3afebeb81de666e35aaac3ed46f14159d7603ffb&amp;v=4" width="139" alt="Kyle Mistele"/><br />Kyle Mistele</a></td>
102
- <td align="center"><a href="https://github.com/andrewpeters9?ref=orpc" target="_blank" rel="noopener" title="Andrew Peters"><img src="https://avatars.githubusercontent.com/u/36251325?v=4" width="139" alt="Andrew Peters"/><br />Andrew Peters</a></td>
103
- <td align="center"><a href="https://github.com/R44VC0RP?ref=orpc" target="_blank" rel="noopener" title="Ryan Vogel"><img src="https://avatars.githubusercontent.com/u/89211796?u=1857347b9787d8d8a7ea5bfc333f96be92d5a683&amp;v=4" width="139" alt="Ryan Vogel"/><br />Ryan Vogel</a></td>
104
+ <td align="center"><a href="https://laststance.io/?ref=middleapi&amp;utm_source=middleapi&amp;utm_medium=sponsor" target="_blank" rel="noopener sponsored" title="Ryota Murakami"><img src="https://avatars.githubusercontent.com/u/5501268?u=599389e03340734325726ca3f8f423c021d47d7f&amp;v=4" width="139" alt="Ryota Murakami"/><br />Ryota Murakami</a></td>
105
+ <td align="center"><a href="https://cra.mr/?ref=middleapi&amp;utm_source=middleapi&amp;utm_medium=sponsor" target="_blank" rel="noopener sponsored" title="David Cramer"><img src="https://avatars.githubusercontent.com/u/23610?v=4" width="139" alt="David Cramer"/><br />David Cramer</a></td>
106
+ <td align="center"><a href="https://valerii15298.github.io/?ref=middleapi&amp;utm_source=middleapi&amp;utm_medium=sponsor" target="_blank" rel="noopener sponsored" title="Valerii Petryniak"><img src="https://avatars.githubusercontent.com/u/44531564?u=88ac74d9bacd20401518441907acad21063cd397&amp;v=4" width="139" alt="Valerii Petryniak"/><br />Valerii Petryniak</a></td>
107
+ <td align="center"><a href="https://letstri.dev/?ref=middleapi&amp;utm_source=middleapi&amp;utm_medium=sponsor" target="_blank" rel="noopener sponsored" title="Valerii Strilets"><img src="https://avatars.githubusercontent.com/u/13253748?u=c7b10399ccc8f8081e24db94ec32cd9858e86ac3&amp;v=4" width="139" alt="Valerii Strilets"/><br />Valerii Strilets</a></td>
108
+ <td align="center"><a href="https://blacklight.sh/?ref=middleapi&amp;utm_source=middleapi&amp;utm_medium=sponsor" target="_blank" rel="noopener sponsored" title="Kyle Mistele"><img src="https://avatars.githubusercontent.com/u/18430555?u=3afebeb81de666e35aaac3ed46f14159d7603ffb&amp;v=4" width="139" alt="Kyle Mistele"/><br />Kyle Mistele</a></td>
109
+ <td align="center"><a href="https://github.com/christ12938?ref=middleapi&amp;utm_source=middleapi&amp;utm_medium=sponsor" target="_blank" rel="noopener sponsored" title="christ12938"><img src="https://avatars.githubusercontent.com/u/25758598?v=4" width="139" alt="christ12938"/><br />christ12938</a></td>
104
110
  </tr>
105
111
  <tr>
106
- <td align="center"><a href="https://github.com/christ12938?ref=orpc" target="_blank" rel="noopener" title="christ12938"><img src="https://avatars.githubusercontent.com/u/25758598?v=4" width="139" alt="christ12938"/><br />christ12938</a></td>
107
- <td align="center"><a href="https://github.com/peter-adam-dy?ref=orpc" target="_blank" rel="noopener" title="Peter Adam"><img src="https://avatars.githubusercontent.com/u/132129459?u=4f3dbbb3b443990b56acb7d6a5d11ed2c555f6db&amp;v=4" width="139" alt="Peter Adam"/><br />Peter Adam</a></td>
108
- <td align="center"><a href="https://github.com/Ryanjso?ref=orpc" target="_blank" rel="noopener" title="Ryan Soderberg"><img src="https://avatars.githubusercontent.com/u/39172778?u=5ed913c31d57e7221b75784abcad48c7ebddde27&amp;v=4" width="139" alt="Ryan Soderberg"/><br />Ryan Soderberg</a></td>
109
- <td align="center"><a href="https://github.com/itigoore01?ref=orpc" target="_blank" rel="noopener" title="shota"><img src="https://avatars.githubusercontent.com/u/11831107?u=c976a6dc7e055eb026304c46c99100ed22b0c8e0&amp;v=4" width="139" alt="shota"/><br />shota</a></td>
112
+ <td align="center"><a href="https://github.com/Ryanjso?ref=middleapi&amp;utm_source=middleapi&amp;utm_medium=sponsor" target="_blank" rel="noopener sponsored" title="Ryan Soderberg"><img src="https://avatars.githubusercontent.com/u/39172778?u=5ed913c31d57e7221b75784abcad48c7ebddde27&amp;v=4" width="139" alt="Ryan Soderberg"/><br />Ryan Soderberg</a></td>
113
+ <td align="center"><a href="https://github.com/itigoore01?ref=middleapi&amp;utm_source=middleapi&amp;utm_medium=sponsor" target="_blank" rel="noopener sponsored" title="shota"><img src="https://avatars.githubusercontent.com/u/11831107?u=c976a6dc7e055eb026304c46c99100ed22b0c8e0&amp;v=4" width="139" alt="shota"/><br />shota</a></td>
114
+ <td align="center"><a href="https://github.com/ellis-driscoll?ref=middleapi&amp;utm_source=middleapi&amp;utm_medium=sponsor" target="_blank" rel="noopener sponsored" title="Ellis Driscoll"><img src="https://avatars.githubusercontent.com/u/70685966?u=c5f95bc33b5991d9744abe00052542e4a2ed3cb9&amp;v=4" width="139" alt="Ellis Driscoll"/><br />Ellis Driscoll</a></td>
115
+ <td align="center"><a href="https://github.com/hoangbn?ref=middleapi&amp;utm_source=middleapi&amp;utm_medium=sponsor" target="_blank" rel="noopener sponsored" title="Hoang Nguyen"><img src="https://avatars.githubusercontent.com/u/38968280?u=c90084c6de65c56facabab7ba13a72a49ddbc3e4&amp;v=4" width="139" alt="Hoang Nguyen"/><br />Hoang Nguyen</a></td>
110
116
  </tr>
111
117
  </table>
112
118
 
@@ -114,67 +120,31 @@ Like what we build over at [middleapi](https://github.com/middleapi)? You can he
114
120
 
115
121
  <table>
116
122
  <tr>
117
- <td align="center"><a href="https://github.com/rhinodavid?ref=orpc" target="_blank" rel="noopener" title="David Walsh"><img src="https://avatars.githubusercontent.com/u/5778036?u=b5521f07d2f88c3db2a0dae62b5f2f8357214af0&amp;v=4" width="119" alt="David Walsh"/><br />David Walsh</a></td>
118
- <td align="center"><a href="https://github.com/Robbe95?ref=orpc" target="_blank" rel="noopener" title="Robbe Vaes"><img src="https://avatars.githubusercontent.com/u/44748019?u=e0232402c045ad4eac7cbd217f1f47e083103b89&amp;v=4" width="119" alt="Robbe Vaes"/><br />Robbe Vaes</a></td>
119
- <td align="center"><a href="https://github.com/aidansunbury?ref=orpc" target="_blank" rel="noopener" title="Aidan Sunbury"><img src="https://avatars.githubusercontent.com/u/64103161?v=4" width="119" alt="Aidan Sunbury"/><br />Aidan Sunbury</a></td>
120
- <td align="center"><a href="https://github.com/soonoo?ref=orpc" target="_blank" rel="noopener" title="soonoo"><img src="https://avatars.githubusercontent.com/u/5436405?u=5d0b4aa955c87e30e6bda7f0cccae5402da99528&amp;v=4" width="119" alt="soonoo"/><br />soonoo</a></td>
121
- <td align="center"><a href="https://github.com/kporten?ref=orpc" target="_blank" rel="noopener" title="Kevin Porten"><img src="https://avatars.githubusercontent.com/u/1839345?u=dc2263d5cfe0d927ce1a0be04a1d55dd6b55405c&amp;v=4" width="119" alt="Kevin Porten"/><br />Kevin Porten</a></td>
122
- <td align="center"><a href="https://github.com/pumpkinlink?ref=orpc" target="_blank" rel="noopener" title="Denis"><img src="https://avatars.githubusercontent.com/u/11864620?u=5f47bbe6c65d0f6f5cf011021490238e4b0593d0&amp;v=4" width="119" alt="Denis"/><br />Denis</a></td>
123
- <td align="center"><a href="https://github.com/christopher-kapic?ref=orpc" target="_blank" rel="noopener" title="Christopher Kapic"><img src="https://avatars.githubusercontent.com/u/59740769?u=e7ad4b72b5bf6c9eb1644c26dbf3332a8f987377&amp;v=4" width="119" alt="Christopher Kapic"/><br />Christopher Kapic</a></td>
123
+ <td align="center"><a href="https://github.com/rhinodavid?ref=middleapi&amp;utm_source=middleapi&amp;utm_medium=sponsor" target="_blank" rel="noopener sponsored" title="David Walsh"><img src="https://avatars.githubusercontent.com/u/5778036?u=b5521f07d2f88c3db2a0dae62b5f2f8357214af0&amp;v=4" width="119" alt="David Walsh"/><br />David Walsh</a></td>
124
+ <td align="center"><a href="https://robbevaes.be/?ref=middleapi&amp;utm_source=middleapi&amp;utm_medium=sponsor" target="_blank" rel="noopener sponsored" title="Robbe Vaes"><img src="https://avatars.githubusercontent.com/u/44748019?u=e0232402c045ad4eac7cbd217f1f47e083103b89&amp;v=4" width="119" alt="Robbe Vaes"/><br />Robbe Vaes</a></td>
125
+ <td align="center"><a href="https://github.com/aidansunbury?ref=middleapi&amp;utm_source=middleapi&amp;utm_medium=sponsor" target="_blank" rel="noopener sponsored" title="Aidan Sunbury"><img src="https://avatars.githubusercontent.com/u/64103161?v=4" width="119" alt="Aidan Sunbury"/><br />Aidan Sunbury</a></td>
126
+ <td align="center"><a href="https://github.com/soonoo?ref=middleapi&amp;utm_source=middleapi&amp;utm_medium=sponsor" target="_blank" rel="noopener sponsored" title="soonoo"><img src="https://avatars.githubusercontent.com/u/5436405?u=5d0b4aa955c87e30e6bda7f0cccae5402da99528&amp;v=4" width="119" alt="soonoo"/><br />soonoo</a></td>
127
+ <td align="center"><a href="https://kevinporten.dev/?ref=middleapi&amp;utm_source=middleapi&amp;utm_medium=sponsor" target="_blank" rel="noopener sponsored" title="Kevin Porten"><img src="https://avatars.githubusercontent.com/u/1839345?u=dc2263d5cfe0d927ce1a0be04a1d55dd6b55405c&amp;v=4" width="119" alt="Kevin Porten"/><br />Kevin Porten</a></td>
128
+ <td align="center"><a href="https://github.com/pumpkinlink?ref=middleapi&amp;utm_source=middleapi&amp;utm_medium=sponsor" target="_blank" rel="noopener sponsored" title="Denis"><img src="https://avatars.githubusercontent.com/u/11864620?u=5f47bbe6c65d0f6f5cf011021490238e4b0593d0&amp;v=4" width="119" alt="Denis"/><br />Denis</a></td>
129
+ <td align="center"><a href="https://github.com/christopher-kapic?ref=middleapi&amp;utm_source=middleapi&amp;utm_medium=sponsor" target="_blank" rel="noopener sponsored" title="Christopher Kapic"><img src="https://avatars.githubusercontent.com/u/59740769?u=e7ad4b72b5bf6c9eb1644c26dbf3332a8f987377&amp;v=4" width="119" alt="Christopher Kapic"/><br />Christopher Kapic</a></td>
124
130
  </tr>
125
131
  <tr>
126
- <td align="center"><a href="https://github.com/thomasballinger?ref=orpc" target="_blank" rel="noopener" title="Tom Ballinger"><img src="https://avatars.githubusercontent.com/u/458879?u=4b045ac75d721b6ac2b42a74d7d37f61f0414031&amp;v=4" width="119" alt="Tom Ballinger"/><br />Tom Ballinger</a></td>
127
- <td align="center"><a href="https://github.com/SSam0419?ref=orpc" target="_blank" rel="noopener" title="Sam"><img src="https://avatars.githubusercontent.com/u/102863520?u=3c89611f549d5070be232eb4532f690c8f2e7a65&amp;v=4" width="119" alt="Sam"/><br />Sam</a></td>
128
- <td align="center"><a href="https://github.com/Titoine?ref=orpc" target="_blank" rel="noopener" title="Titoine"><img src="https://avatars.githubusercontent.com/u/3514286?u=1bb1e86b0c99c8a1121372e56d51a177eea12191&amp;v=4" width="119" alt="Titoine"/><br />Titoine</a></td>
129
- <td align="center"><a href="https://github.com/Mnigos?ref=orpc" target="_blank" rel="noopener" title="Igor Makowski"><img src="https://avatars.githubusercontent.com/u/56691628?u=ee8c879478f7c151b9156aef6c74243fa3e247a8&amp;v=4" width="119" alt="Igor Makowski"/><br />Igor Makowski</a></td>
130
- <td align="center"><a href="https://github.com/hanayashiki?ref=orpc" target="_blank" rel="noopener" title="hanayashiki"><img src="https://avatars.githubusercontent.com/u/26056783?u=06c3b9205a16fd41a871e82da1cc2a09306d53f5&amp;v=4" width="119" alt="hanayashiki"/><br />hanayashiki</a></td>
131
- <td align="center"><a href="https://github.com/ldub?ref=orpc" target="_blank" rel="noopener" title="Lev Dubinets"><img src="https://avatars.githubusercontent.com/u/3114081?u=f547f5d5012cab54851f1b1ad72d10e537f78fc2&amp;v=4" width="119" alt="Lev Dubinets"/><br />Lev Dubinets</a></td>
132
- <td align="center"><a href="https://github.com/mr-kelly?ref=orpc" target="_blank" rel="noopener" title="Kelly Peilin Chan"><img src="https://avatars.githubusercontent.com/u/520852?u=6b0f7105f694e7b5cacf410a3f04c7044b469dc8&amp;v=4" width="119" alt="Kelly Peilin Chan"/><br />Kelly Peilin Chan</a></td>
132
+ <td align="center"><a href="http://ballingt.com/?ref=middleapi&amp;utm_source=middleapi&amp;utm_medium=sponsor" target="_blank" rel="noopener sponsored" title="Tom Ballinger"><img src="https://avatars.githubusercontent.com/u/458879?u=4b045ac75d721b6ac2b42a74d7d37f61f0414031&amp;v=4" width="119" alt="Tom Ballinger"/><br />Tom Ballinger</a></td>
133
+ <td align="center"><a href="https://lee-sam.com/?ref=middleapi&amp;utm_source=middleapi&amp;utm_medium=sponsor" target="_blank" rel="noopener sponsored" title="Sam"><img src="https://avatars.githubusercontent.com/u/102863520?u=3c89611f549d5070be232eb4532f690c8f2e7a65&amp;v=4" width="119" alt="Sam"/><br />Sam</a></td>
134
+ <td align="center"><a href="https://github.com/Titoine?ref=middleapi&amp;utm_source=middleapi&amp;utm_medium=sponsor" target="_blank" rel="noopener sponsored" title="Titoine"><img src="https://avatars.githubusercontent.com/u/3514286?u=1bb1e86b0c99c8a1121372e56d51a177eea12191&amp;v=4" width="119" alt="Titoine"/><br />Titoine</a></td>
135
+ <td align="center"><a href="https://rigtch.fm/?ref=middleapi&amp;utm_source=middleapi&amp;utm_medium=sponsor" target="_blank" rel="noopener sponsored" title="Igor Makowski"><img src="https://avatars.githubusercontent.com/u/56691628?u=ee8c879478f7c151b9156aef6c74243fa3e247a8&amp;v=4" width="119" alt="Igor Makowski"/><br />Igor Makowski</a></td>
136
+ <td align="center"><a href="https://blog.cwang.io/?ref=middleapi&amp;utm_source=middleapi&amp;utm_medium=sponsor" target="_blank" rel="noopener sponsored" title="hanayashiki"><img src="https://avatars.githubusercontent.com/u/26056783?u=06c3b9205a16fd41a871e82da1cc2a09306d53f5&amp;v=4" width="119" alt="hanayashiki"/><br />hanayashiki</a></td>
137
+ <td align="center"><a href="https://dubinets.io/?ref=middleapi&amp;utm_source=middleapi&amp;utm_medium=sponsor" target="_blank" rel="noopener sponsored" title="Lev Dubinets"><img src="https://avatars.githubusercontent.com/u/3114081?u=f547f5d5012cab54851f1b1ad72d10e537f78fc2&amp;v=4" width="119" alt="Lev Dubinets"/><br />Lev Dubinets</a></td>
138
+ <td align="center"><a href="https://bika.ai/?ref=middleapi&amp;utm_source=middleapi&amp;utm_medium=sponsor" target="_blank" rel="noopener sponsored" title="Kelly Peilin Chan"><img src="https://avatars.githubusercontent.com/u/520852?u=6b0f7105f694e7b5cacf410a3f04c7044b469dc8&amp;v=4" width="119" alt="Kelly Peilin Chan"/><br />Kelly Peilin Chan</a></td>
133
139
  </tr>
134
140
  <tr>
135
- <td align="center"><a href="https://github.com/piscis?ref=orpc" target="_blank" rel="noopener" title="Alex"><img src="https://avatars.githubusercontent.com/u/326163?u=b245f368bd940cf51d08c0b6bf55f8257f359437&amp;v=4" width="119" alt="Alex"/><br />Alex</a></td>
136
- <td align="center"><a href="https://github.com/nattstack?ref=orpc" target="_blank" rel="noopener" title="nattstack"><img src="https://avatars.githubusercontent.com/u/31426677?u=fa9dbb8b3e66eb0ea3c88db5dc07f31c8c5418fe&amp;v=4" width="119" alt="nattstack"/><br />nattstack</a></td>
137
- <td align="center"><a href="https://github.com/finom?ref=orpc" target="_blank" rel="noopener" title="Andrey Gubanov"><img src="https://avatars.githubusercontent.com/u/1082083?u=29e91400dbd4a9c217048a8f59562c4f740498e6&amp;v=4" width="119" alt="Andrey Gubanov"/><br />Andrey Gubanov</a></td>
141
+ <td align="center"><a href="https://guyariely.com/?ref=middleapi&amp;utm_source=middleapi&amp;utm_medium=sponsor" target="_blank" rel="noopener sponsored" title="Guy Ariely"><img src="https://avatars.githubusercontent.com/u/42813496?u=edb6b7f563bf28e160a290832e7da57c0506f8ca&amp;v=4" width="119" alt="Guy Ariely"/><br />Guy Ariely</a></td>
142
+ <td align="center"><a href="https://piscis.dev/?ref=middleapi&amp;utm_source=middleapi&amp;utm_medium=sponsor" target="_blank" rel="noopener sponsored" title="Alex"><img src="https://avatars.githubusercontent.com/u/326163?u=b245f368bd940cf51d08c0b6bf55f8257f359437&amp;v=4" width="119" alt="Alex"/><br />Alex</a></td>
143
+ <td align="center"><a href="https://opensource.gubanov.eu/?ref=middleapi&amp;utm_source=middleapi&amp;utm_medium=sponsor" target="_blank" rel="noopener sponsored" title="Andrey Gubanov"><img src="https://avatars.githubusercontent.com/u/1082083?u=c5f2daf7ebece498e85c83367bb37b4e10e2649d&amp;v=4" width="119" alt="Andrey Gubanov"/><br />Andrey Gubanov</a></td>
138
144
  </tr>
139
145
  </table>
140
146
 
141
- ### Past Sponsors
142
-
143
- <p>
144
- <a href="https://github.com/MrMaxie?ref=orpc" target="_blank" rel="noopener" title="Maxie"><img src="https://avatars.githubusercontent.com/u/3857836?u=5e6b57973d4385d655663ffdd836e487856f2984&amp;v=4" width="32" height="32" alt="Maxie" /></a>
145
- <a href="https://github.com/Stijn-Timmer?ref=orpc" target="_blank" rel="noopener" title="Stijn Timmer"><img src="https://avatars.githubusercontent.com/u/100147665?u=106b2c18e9c98a61861b4ee7fc100f5b9906a6c9&amp;v=4" width="32" height="32" alt="Stijn Timmer" /></a>
146
- <a href="https://github.com/u1-liquid?ref=orpc" target="_blank" rel="noopener" title="あわわわとーにゅ"><img src="https://avatars.githubusercontent.com/u/17376330?u=de3353804be889f009f7e0a1582daf04d0ab292d&amp;v=4" width="32" height="32" alt="あわわわとーにゅ" /></a>
147
- <a href="https://github.com/zuplo?ref=orpc" target="_blank" rel="noopener" title="Zuplo"><img src="https://avatars.githubusercontent.com/u/85497839?v=4" width="32" height="32" alt="Zuplo" /></a>
148
- <a href="https://github.com/motopods?ref=orpc" target="_blank" rel="noopener" title="motopods"><img src="https://avatars.githubusercontent.com/u/58200641?v=4" width="32" height="32" alt="motopods" /></a>
149
- <a href="https://github.com/franciscohermida?ref=orpc" target="_blank" rel="noopener" title="Francisco Hermida"><img src="https://avatars.githubusercontent.com/u/483242?u=bbcbc80eb9d8781ff401f7dafc3b59cd7bea0561&amp;v=4" width="32" height="32" alt="Francisco Hermida" /></a>
150
- <a href="https://github.com/theoludwig?ref=orpc" target="_blank" rel="noopener" title="ThΓ©o LUDWIG"><img src="https://avatars.githubusercontent.com/u/25207499?u=a6a9653725a2f574c07893748806668e0598cdbe&amp;v=4" width="32" height="32" alt="ThΓ©o LUDWIG" /></a>
151
- <a href="https://github.com/abhay-ramesh?ref=orpc" target="_blank" rel="noopener" title="Abhay Ramesh"><img src="https://avatars.githubusercontent.com/u/66196314?u=c5c2b0327b26606c2efcfaf17046ab18c3d25c57&amp;v=4" width="32" height="32" alt="Abhay Ramesh" /></a>
152
- <a href="https://github.com/shr-ink?ref=orpc" target="_blank" rel="noopener" title="shr.ink oΓΌ"><img src="https://avatars.githubusercontent.com/u/139700438?v=4" width="32" height="32" alt="shr.ink oΓΌ" /></a>
153
- <a href="https://github.com/johngerome?ref=orpc" target="_blank" rel="noopener" title="0x4e32"><img src="https://avatars.githubusercontent.com/u/2002000?u=24e8dd943cfc862aa284d858a023532c75071ade&amp;v=4" width="32" height="32" alt="0x4e32" /></a>
154
- <a href="https://github.com/yzuyr?ref=orpc" target="_blank" rel="noopener" title="Ryuz"><img src="https://avatars.githubusercontent.com/u/196539378?u=d38374588d219b6748b16406982f6559411466d4&amp;v=4" width="32" height="32" alt="Ryuz" /></a>
155
- <a href="https://github.com/happyboy2022?ref=orpc" target="_blank" rel="noopener" title="happyboy"><img src="https://avatars.githubusercontent.com/u/103669586?u=65b49c4b893ed3703909fbb3a7a22313f3f9c121&amp;v=4" width="32" height="32" alt="happyboy" /></a>
156
- <a href="https://github.com/YiCChi?ref=orpc" target="_blank" rel="noopener" title="yicchi"><img src="https://avatars.githubusercontent.com/u/86967274?u=6c2756f09fe15dd94d572f560e979cd157982852&amp;v=4" width="32" height="32" alt="yicchi" /></a>
157
- <a href="https://github.com/cloudycotton?ref=orpc" target="_blank" rel="noopener" title="Saksham"><img src="https://avatars.githubusercontent.com/u/168998965?u=9b9634a5aed66a51c1b880663272725b00b92b14&amp;v=4" width="32" height="32" alt="Saksham" /></a>
158
- <a href="https://github.com/hrynevychroman?ref=orpc" target="_blank" rel="noopener" title="Roman Hrynevych"><img src="https://avatars.githubusercontent.com/u/82209198?u=1a1d111ab3d589855b9cc8a7fefb1b5c6a4fbbaf&amp;v=4" width="32" height="32" alt="Roman Hrynevych" /></a>
159
- <a href="https://github.com/rokitgg?ref=orpc" target="_blank" rel="noopener" title="rokitg"><img src="https://avatars.githubusercontent.com/u/125133357?u=06c74aefaa2236b06a2e5fba5a5c612339f45912&amp;v=4" width="32" height="32" alt="rokitg" /></a>
160
- <a href="https://github.com/omarkhatibgg?ref=orpc" target="_blank" rel="noopener" title="Omar Khatib"><img src="https://avatars.githubusercontent.com/u/9054278?u=afbba7331b85c51b8eee4130f5fd31b1017dc919&amp;v=4" width="32" height="32" alt="Omar Khatib" /></a>
161
- <a href="https://github.com/YuSabo90002?ref=orpc" target="_blank" rel="noopener" title="Yu-Sabo"><img src="https://avatars.githubusercontent.com/u/13120582?v=4" width="32" height="32" alt="Yu-Sabo" /></a>
162
- <a href="https://github.com/bapspatil?ref=orpc" target="_blank" rel="noopener" title="Bapusaheb Patil"><img src="https://avatars.githubusercontent.com/u/16699418?u=6d9d8e0a64a6f91ca1c4d559c72d931172bdcbbd&amp;v=4" width="32" height="32" alt="Bapusaheb Patil" /></a>
163
- <a href="https://github.com/ripgrim?ref=orpc" target="_blank" rel="noopener" title="grim"><img src="https://avatars.githubusercontent.com/u/75869731?u=b17c42ec2309552fdb822a86b25a2f99146a4d72&amp;v=4" width="32" height="32" alt="grim" /></a>
164
- <a href="https://github.com/nelsonlaidev?ref=orpc" target="_blank" rel="noopener" title="Nelson Lai"><img src="https://avatars.githubusercontent.com/u/75498339?u=2fc0e0b95dd184c5ffb744df977cb15a18b60672&amp;v=4" width="32" height="32" alt="Nelson Lai" /></a>
165
- <a href="https://github.com/nguyenlc1993?ref=orpc" target="_blank" rel="noopener" title="LΓͺ Cao NguyΓͺn"><img src="https://avatars.githubusercontent.com/u/13871971?u=83c8b69d9e35b589c4e1f066cc113b1d9461386f&amp;v=4" width="32" height="32" alt="LΓͺ Cao NguyΓͺn" /></a>
166
- <a href="https://github.com/wobsoriano?ref=orpc" target="_blank" rel="noopener" title="Robert Soriano"><img src="https://avatars.githubusercontent.com/u/13049130?u=6d72104182e7c9ed25934815313fb69107332111&amp;v=4" width="32" height="32" alt="Robert Soriano" /></a>
167
- <a href="https://github.com/SKostyukovich?ref=orpc" target="_blank" rel="noopener" title="SKostyukovich"><img src="https://avatars.githubusercontent.com/u/10700067?v=4" width="32" height="32" alt="SKostyukovich" /></a>
168
- <a href="https://github.com/FabworksHQ?ref=orpc" target="_blank" rel="noopener" title="Fabworks"><img src="https://avatars.githubusercontent.com/u/160179500?v=4" width="32" height="32" alt="Fabworks" /></a>
169
- <a href="https://github.com/NovakAnton?ref=orpc" target="_blank" rel="noopener" title="Novak Antonijevic"><img src="https://avatars.githubusercontent.com/u/157126729?u=ae49fa22292d55c0434ff0ca008206155b18663b&amp;v=4" width="32" height="32" alt="Novak Antonijevic" /></a>
170
- <a href="https://github.com/laduniestu?ref=orpc" target="_blank" rel="noopener" title="Laduni Estu Syalwa"><img src="https://avatars.githubusercontent.com/u/44757637?u=a2fc1ea8f7d827a96721176f79d30592d1c48059&amp;v=4" width="32" height="32" alt="Laduni Estu Syalwa" /></a>
171
- <a href="https://github.com/yukimotochern?ref=orpc" target="_blank" rel="noopener" title="Chen, Zhi-Yuan"><img src="https://avatars.githubusercontent.com/u/20896173?u=945c33fc21725e4d566a0d02afc54b136ca1d67a&amp;v=4" width="32" height="32" alt="Chen, Zhi-Yuan" /></a>
172
- <a href="https://github.com/illarionvk?ref=orpc" target="_blank" rel="noopener" title="Illarion Koperski"><img src="https://avatars.githubusercontent.com/u/5012724?u=7cfa13652f7ac5fb3c56d880e3eb3fbe40c3ea34&amp;v=4" width="32" height="32" alt="Illarion Koperski" /></a>
173
- <a href="https://github.com/steelbrain?ref=orpc" target="_blank" rel="noopener" title="Anees Iqbal"><img src="https://avatars.githubusercontent.com/u/4278113?u=22b80b5399eed68ac76cd58b02961b0481f1db11&amp;v=4" width="32" height="32" alt="Anees Iqbal" /></a>
174
- <a href="https://github.com/Scrumplex?ref=orpc" target="_blank" rel="noopener" title="Sefa Eyeoglu"><img src="https://avatars.githubusercontent.com/u/11587657?u=ab503582165c0bbff0cca47ce31c9450bb1553c9&amp;v=4" width="32" height="32" alt="Sefa Eyeoglu" /></a>
175
- <a href="https://github.com/ChromeGG?ref=orpc" target="_blank" rel="noopener" title="Adam Tkaczyk"><img src="https://avatars.githubusercontent.com/u/39050595?u=a58ca6042a6950e94e6e92442db76ef584279bc0&amp;v=4" width="32" height="32" alt="Adam Tkaczyk" /></a>
176
- <a href="https://github.com/plancraft?ref=orpc" target="_blank" rel="noopener" title="plancraft"><img src="https://avatars.githubusercontent.com/u/46482287?v=4" width="32" height="32" alt="plancraft" /></a>
177
- </p>
147
+ With thanks to [37 past sponsors](https://htmlpreview.github.io/?https://github.com/middleapi/static/blob/main/sponsors.svg) who helped get oRPC here.
178
148
 
179
149
  ## References
180
150
 
@@ -3,16 +3,16 @@ import '@orpc/shared';
3
3
 
4
4
  interface MemoryPublisherOptions extends PublisherOptions {
5
5
  /**
6
- * Configuration for event replay support.
6
+ * Configuration for event resume support.
7
7
  *
8
8
  * When enabled, published events are temporarily stored so new
9
9
  * subscribers can resume from a previous position using `lastEventId`.
10
10
  *
11
11
  * @default { enabled: false }
12
12
  */
13
- replay?: {
13
+ resume?: {
14
14
  /**
15
- * Whether event replay support is enabled.
15
+ * Whether event resume support is enabled.
16
16
  *
17
17
  * When enabled, published events are temporarily stored so new
18
18
  * subscribers can resume from a previous position using `lastEventId`.
@@ -21,7 +21,7 @@ interface MemoryPublisherOptions extends PublisherOptions {
21
21
  */
22
22
  enabled: boolean;
23
23
  /**
24
- * How long (in seconds) to retain events for replay.
24
+ * How long (in seconds) to retain events for resume.
25
25
  *
26
26
  * Expired events are cleaned up lazily for performance reasons, so
27
27
  * some events may remain available slightly longer than this period.
@@ -31,13 +31,19 @@ interface MemoryPublisherOptions extends PublisherOptions {
31
31
  seconds?: number;
32
32
  };
33
33
  }
34
+ /**
35
+ * Publisher adapter backed by in-memory storage, with optional resume support.
36
+ * Events are delivered to subscribers within the same process only.
37
+ *
38
+ * @see {@link https://orpc.dev/docs/helpers/publisher#adapters | Publisher Helpers - Adapters}
39
+ */
34
40
  declare class MemoryPublisher<T extends Record<string, object>> extends Publisher<T> {
35
41
  private readonly listenersMap;
36
42
  private readonly idGenerator;
37
43
  private readonly eventsMap;
38
- private readonly replayEnabled;
39
- private readonly replaySeconds;
40
- constructor({ replay, ...options }?: MemoryPublisherOptions);
44
+ private readonly resumeEnabled;
45
+ private readonly resumeSeconds;
46
+ constructor({ resume, ...options }?: MemoryPublisherOptions);
41
47
  publish<K extends keyof T & string>(event: K, payload: T[K]): Promise<void>;
42
48
  protected subscribeListener<K extends keyof T & string>(event: K, listener: (payload: T[K]) => void, options?: PublisherSubscribeListenerOptions): Promise<() => Promise<void>>;
43
49
  private lastCleanupTime;
@@ -3,16 +3,16 @@ import '@orpc/shared';
3
3
 
4
4
  interface MemoryPublisherOptions extends PublisherOptions {
5
5
  /**
6
- * Configuration for event replay support.
6
+ * Configuration for event resume support.
7
7
  *
8
8
  * When enabled, published events are temporarily stored so new
9
9
  * subscribers can resume from a previous position using `lastEventId`.
10
10
  *
11
11
  * @default { enabled: false }
12
12
  */
13
- replay?: {
13
+ resume?: {
14
14
  /**
15
- * Whether event replay support is enabled.
15
+ * Whether event resume support is enabled.
16
16
  *
17
17
  * When enabled, published events are temporarily stored so new
18
18
  * subscribers can resume from a previous position using `lastEventId`.
@@ -21,7 +21,7 @@ interface MemoryPublisherOptions extends PublisherOptions {
21
21
  */
22
22
  enabled: boolean;
23
23
  /**
24
- * How long (in seconds) to retain events for replay.
24
+ * How long (in seconds) to retain events for resume.
25
25
  *
26
26
  * Expired events are cleaned up lazily for performance reasons, so
27
27
  * some events may remain available slightly longer than this period.
@@ -31,13 +31,19 @@ interface MemoryPublisherOptions extends PublisherOptions {
31
31
  seconds?: number;
32
32
  };
33
33
  }
34
+ /**
35
+ * Publisher adapter backed by in-memory storage, with optional resume support.
36
+ * Events are delivered to subscribers within the same process only.
37
+ *
38
+ * @see {@link https://orpc.dev/docs/helpers/publisher#adapters | Publisher Helpers - Adapters}
39
+ */
34
40
  declare class MemoryPublisher<T extends Record<string, object>> extends Publisher<T> {
35
41
  private readonly listenersMap;
36
42
  private readonly idGenerator;
37
43
  private readonly eventsMap;
38
- private readonly replayEnabled;
39
- private readonly replaySeconds;
40
- constructor({ replay, ...options }?: MemoryPublisherOptions);
44
+ private readonly resumeEnabled;
45
+ private readonly resumeSeconds;
46
+ constructor({ resume, ...options }?: MemoryPublisherOptions);
41
47
  publish<K extends keyof T & string>(event: K, payload: T[K]): Promise<void>;
42
48
  protected subscribeListener<K extends keyof T & string>(event: K, listener: (payload: T[K]) => void, options?: PublisherSubscribeListenerOptions): Promise<() => Promise<void>>;
43
49
  private lastCleanupTime;
@@ -6,17 +6,17 @@ class MemoryPublisher extends Publisher {
6
6
  listenersMap = /* @__PURE__ */ new Map();
7
7
  idGenerator = new SequentialIdGenerator();
8
8
  eventsMap = /* @__PURE__ */ new Map();
9
- replayEnabled;
10
- replaySeconds;
11
- constructor({ replay, ...options } = {}) {
9
+ resumeEnabled;
10
+ resumeSeconds;
11
+ constructor({ resume, ...options } = {}) {
12
12
  super(options);
13
- this.replayEnabled = replay?.enabled ?? false;
14
- this.replaySeconds = replay?.seconds ?? 300;
13
+ this.resumeEnabled = resume?.enabled ?? false;
14
+ this.resumeSeconds = resume?.seconds ?? 300;
15
15
  }
16
16
  async publish(event, payload) {
17
17
  this.cleanup();
18
- if (this.replayEnabled) {
19
- const expiresAt = Date.now() + this.replaySeconds * 1e3;
18
+ if (this.resumeEnabled) {
19
+ const expiresAt = Date.now() + this.resumeSeconds * 1e3;
20
20
  let bucket = this.eventsMap.get(event);
21
21
  if (!bucket) {
22
22
  this.eventsMap.set(event, bucket = []);
@@ -30,10 +30,10 @@ class MemoryPublisher extends Publisher {
30
30
  }
31
31
  async subscribeListener(event, listener, options) {
32
32
  this.cleanup();
33
- if (this.replayEnabled && options?.lastEventId !== void 0) {
33
+ if (this.resumeEnabled && options?.lastEventId !== void 0) {
34
34
  const bucket = this.eventsMap.get(event);
35
35
  if (bucket?.length) {
36
- const startIdx = findReplayStartIndex(bucket, options.lastEventId);
36
+ const startIdx = findResumeStartIndex(bucket, options.lastEventId);
37
37
  for (let i = startIdx; i < bucket.length; i++) {
38
38
  listener(bucket[i].payload);
39
39
  }
@@ -53,11 +53,11 @@ class MemoryPublisher extends Publisher {
53
53
  }
54
54
  lastCleanupTime = 0;
55
55
  cleanup() {
56
- if (!this.replayEnabled) {
56
+ if (!this.resumeEnabled) {
57
57
  return;
58
58
  }
59
59
  const now = Date.now();
60
- if (now - this.lastCleanupTime < this.replaySeconds * 1e3) {
60
+ if (now - this.lastCleanupTime < this.resumeSeconds * 1e3) {
61
61
  return;
62
62
  }
63
63
  this.lastCleanupTime = now;
@@ -69,7 +69,7 @@ class MemoryPublisher extends Publisher {
69
69
  }
70
70
  }
71
71
  }
72
- function findReplayStartIndex(bucket, lastEventId) {
72
+ function findResumeStartIndex(bucket, lastEventId) {
73
73
  let lo = 0;
74
74
  let hi = bucket.length;
75
75
  while (lo < hi) {
@@ -14,6 +14,8 @@ interface RedisPublisherOptions extends PublisherOptions {
14
14
  subscriber?: undefined | RedisClientType<any, any, any, any, any>;
15
15
  /**
16
16
  * The prefix to use for Redis keys.
17
+ *
18
+ * @default ''
17
19
  */
18
20
  prefix?: string;
19
21
  /**
@@ -23,16 +25,16 @@ interface RedisPublisherOptions extends PublisherOptions {
23
25
  */
24
26
  serializer?: undefined | Pick<RPCSerializer, keyof RPCSerializer>;
25
27
  /**
26
- * Configuration for event replay support.
28
+ * Configuration for event resume support.
27
29
  *
28
30
  * When enabled, published events are temporarily stored so new
29
31
  * subscribers can resume from a previous position using `lastEventId`.
30
32
  *
31
33
  * @default { enabled: false }
32
34
  */
33
- replay?: {
35
+ resume?: {
34
36
  /**
35
- * Whether event replay support is enabled.
37
+ * Whether event resume support is enabled.
36
38
  *
37
39
  * When enabled, published events are temporarily stored so new
38
40
  * subscribers can resume from a previous position using `lastEventId`.
@@ -41,7 +43,7 @@ interface RedisPublisherOptions extends PublisherOptions {
41
43
  */
42
44
  enabled: boolean;
43
45
  /**
44
- * How long (in seconds) to retain events for replay.
46
+ * How long (in seconds) to retain events for resume.
45
47
  *
46
48
  * Expired events are cleaned up lazily for performance reasons, so
47
49
  * some events may remain available slightly longer than this period.
@@ -51,13 +53,19 @@ interface RedisPublisherOptions extends PublisherOptions {
51
53
  seconds?: number;
52
54
  };
53
55
  }
56
+ /**
57
+ * Publisher adapter for Redis. Distributes events across processes via
58
+ * Redis Pub/Sub, with optional resume support backed by Redis Streams.
59
+ *
60
+ * @see {@link https://orpc.dev/docs/helpers/publisher#adapters | Publisher Helpers - Adapters}
61
+ */
54
62
  declare class RedisPublisher<T extends Record<string, object>> extends Publisher<T> {
55
63
  private readonly redis;
56
64
  private readonly subscriber;
57
65
  private readonly prefix;
58
66
  private readonly serializer;
59
- private readonly replayEnabled;
60
- private readonly replaySeconds;
67
+ private readonly resumeEnabled;
68
+ private readonly resumeSeconds;
61
69
  /**
62
70
  * The exactness of the `XTRIM` command.
63
71
  * Used for testing purpose.
@@ -14,6 +14,8 @@ interface RedisPublisherOptions extends PublisherOptions {
14
14
  subscriber?: undefined | RedisClientType<any, any, any, any, any>;
15
15
  /**
16
16
  * The prefix to use for Redis keys.
17
+ *
18
+ * @default ''
17
19
  */
18
20
  prefix?: string;
19
21
  /**
@@ -23,16 +25,16 @@ interface RedisPublisherOptions extends PublisherOptions {
23
25
  */
24
26
  serializer?: undefined | Pick<RPCSerializer, keyof RPCSerializer>;
25
27
  /**
26
- * Configuration for event replay support.
28
+ * Configuration for event resume support.
27
29
  *
28
30
  * When enabled, published events are temporarily stored so new
29
31
  * subscribers can resume from a previous position using `lastEventId`.
30
32
  *
31
33
  * @default { enabled: false }
32
34
  */
33
- replay?: {
35
+ resume?: {
34
36
  /**
35
- * Whether event replay support is enabled.
37
+ * Whether event resume support is enabled.
36
38
  *
37
39
  * When enabled, published events are temporarily stored so new
38
40
  * subscribers can resume from a previous position using `lastEventId`.
@@ -41,7 +43,7 @@ interface RedisPublisherOptions extends PublisherOptions {
41
43
  */
42
44
  enabled: boolean;
43
45
  /**
44
- * How long (in seconds) to retain events for replay.
46
+ * How long (in seconds) to retain events for resume.
45
47
  *
46
48
  * Expired events are cleaned up lazily for performance reasons, so
47
49
  * some events may remain available slightly longer than this period.
@@ -51,13 +53,19 @@ interface RedisPublisherOptions extends PublisherOptions {
51
53
  seconds?: number;
52
54
  };
53
55
  }
56
+ /**
57
+ * Publisher adapter for Redis. Distributes events across processes via
58
+ * Redis Pub/Sub, with optional resume support backed by Redis Streams.
59
+ *
60
+ * @see {@link https://orpc.dev/docs/helpers/publisher#adapters | Publisher Helpers - Adapters}
61
+ */
54
62
  declare class RedisPublisher<T extends Record<string, object>> extends Publisher<T> {
55
63
  private readonly redis;
56
64
  private readonly subscriber;
57
65
  private readonly prefix;
58
66
  private readonly serializer;
59
- private readonly replayEnabled;
60
- private readonly replaySeconds;
67
+ private readonly resumeEnabled;
68
+ private readonly resumeSeconds;
61
69
  /**
62
70
  * The exactness of the `XTRIM` command.
63
71
  * Used for testing purpose.
@@ -9,15 +9,15 @@ class RedisPublisher extends Publisher {
9
9
  this.redis = redis;
10
10
  this.prefix = options.prefix ?? "";
11
11
  this.serializer = options.serializer ?? new RPCSerializer();
12
- this.replayEnabled = options.replay?.enabled ?? false;
13
- this.replaySeconds = options.replay?.seconds ?? 300;
12
+ this.resumeEnabled = options.resume?.enabled ?? false;
13
+ this.resumeSeconds = options.resume?.seconds ?? 300;
14
14
  this.subscriber = options.subscriber ?? redis.duplicate();
15
15
  }
16
16
  subscriber;
17
17
  prefix;
18
18
  serializer;
19
- replayEnabled;
20
- replaySeconds;
19
+ resumeEnabled;
20
+ resumeSeconds;
21
21
  /**
22
22
  * The exactness of the `XTRIM` command.
23
23
  * Used for testing purpose.
@@ -31,16 +31,16 @@ class RedisPublisher extends Publisher {
31
31
  if (!this.redis.isOpen) {
32
32
  await this.redis.connect();
33
33
  }
34
- if (this.replayEnabled) {
34
+ if (this.resumeEnabled) {
35
35
  const now = Date.now();
36
36
  for (const [event2, firstPublishTime] of this.firstPublishTimeMap) {
37
- if (firstPublishTime + this.replaySeconds * 1e3 < now) {
37
+ if (firstPublishTime + this.resumeSeconds * 1e3 < now) {
38
38
  this.firstPublishTimeMap.delete(event2);
39
39
  }
40
40
  }
41
41
  if (!this.firstPublishTimeMap.has(event)) {
42
42
  this.firstPublishTimeMap.set(event, now);
43
- const result = await this.redis.multi().xAdd(redisKey, "*", { data: stringifyJSON(data) }).xTrim(redisKey, "MINID", `${now - this.replaySeconds * 1e3}-0`, { strategyModifier: this.xTrimExactness }).expire(redisKey, this.replaySeconds * 2).exec();
43
+ const result = await this.redis.multi().xAdd(redisKey, "*", { data: stringifyJSON(data) }).xTrim(redisKey, "MINID", `${now - this.resumeSeconds * 1e3}-0`, { strategyModifier: this.xTrimExactness }).expire(redisKey, this.resumeSeconds * 2).exec();
44
44
  id = result[0];
45
45
  } else {
46
46
  id = await this.redis.xAdd(redisKey, "*", { data: stringifyJSON(data) });
@@ -54,14 +54,14 @@ class RedisPublisher extends Publisher {
54
54
  await this.subscriber.connect();
55
55
  }
56
56
  let pendingPayloads = [];
57
- const replayedIds = /* @__PURE__ */ new Set();
57
+ const resumedIds = /* @__PURE__ */ new Set();
58
58
  const deduplicatingListener = (payload) => {
59
59
  if (pendingPayloads) {
60
60
  pendingPayloads.push(payload);
61
61
  return;
62
62
  }
63
63
  const id = getEventMeta(payload)?.id;
64
- if (id !== void 0 && replayedIds.has(id)) {
64
+ if (id !== void 0 && resumedIds.has(id)) {
65
65
  return;
66
66
  }
67
67
  originalListener(payload);
@@ -78,7 +78,7 @@ class RedisPublisher extends Publisher {
78
78
  try {
79
79
  const subscribePromise = this.subscriber.subscribe(redisKey, redisListener);
80
80
  try {
81
- if (this.replayEnabled && lastEventId !== void 0) {
81
+ if (this.resumeEnabled && lastEventId !== void 0) {
82
82
  if (!this.redis.isOpen) {
83
83
  await this.redis.connect();
84
84
  }
@@ -89,7 +89,7 @@ class RedisPublisher extends Publisher {
89
89
  const rawData = message.data;
90
90
  const data = parseEmptyableJSON(rawData);
91
91
  const payload = this.deserializePayload(id, data);
92
- replayedIds.add(id);
92
+ resumedIds.add(id);
93
93
  originalListener(payload);
94
94
  }
95
95
  }
@@ -6,6 +6,8 @@ import '@orpc/shared';
6
6
  interface UpstashPublisherOptions extends PublisherOptions {
7
7
  /**
8
8
  * The prefix to use for Redis keys.
9
+ *
10
+ * @default ''
9
11
  */
10
12
  prefix?: string;
11
13
  /**
@@ -15,16 +17,16 @@ interface UpstashPublisherOptions extends PublisherOptions {
15
17
  */
16
18
  serializer?: undefined | Pick<RPCSerializer, keyof RPCSerializer>;
17
19
  /**
18
- * Configuration for event replay support.
20
+ * Configuration for event resume support.
19
21
  *
20
22
  * When enabled, published events are temporarily stored so new
21
23
  * subscribers can resume from a previous position using `lastEventId`.
22
24
  *
23
25
  * @default { enabled: false }
24
26
  */
25
- replay?: {
27
+ resume?: {
26
28
  /**
27
- * Whether event replay support is enabled.
29
+ * Whether event resume support is enabled.
28
30
  *
29
31
  * When enabled, published events are temporarily stored so new
30
32
  * subscribers can resume from a previous position using `lastEventId`.
@@ -33,7 +35,7 @@ interface UpstashPublisherOptions extends PublisherOptions {
33
35
  */
34
36
  enabled: boolean;
35
37
  /**
36
- * How long (in seconds) to retain events for replay.
38
+ * How long (in seconds) to retain events for resume.
37
39
  *
38
40
  * Expired events are cleaned up lazily for performance reasons, so
39
41
  * some events may remain available slightly longer than this period.
@@ -43,6 +45,12 @@ interface UpstashPublisherOptions extends PublisherOptions {
43
45
  seconds?: number;
44
46
  };
45
47
  }
48
+ /**
49
+ * Publisher adapter for Upstash Redis. Distributes events across processes via
50
+ * Upstash Pub/Sub, with optional resume support backed by Redis Streams.
51
+ *
52
+ * @see {@link https://orpc.dev/docs/helpers/publisher#adapters | Publisher Helpers - Adapters}
53
+ */
46
54
  declare class UpstashPublisher<T extends Record<string, object>> extends Publisher<T> {
47
55
  private readonly redis;
48
56
  private readonly prefix;
@@ -50,14 +58,14 @@ declare class UpstashPublisher<T extends Record<string, object>> extends Publish
50
58
  private readonly listenersMap;
51
59
  private readonly onErrorsMap;
52
60
  private readonly subscriptionMap;
53
- private readonly replayEnabled;
54
- private readonly replaySeconds;
61
+ private readonly resumeEnabled;
62
+ private readonly resumeSeconds;
55
63
  /**
56
64
  * The exactness of the `XTRIM` command.
57
65
  * Used for testing purpose.
58
66
  */
59
67
  private readonly xTrimExactness;
60
- constructor(redis: Redis, { replay, prefix, serializer, ...options }?: UpstashPublisherOptions);
68
+ constructor(redis: Redis, { resume, prefix, serializer, ...options }?: UpstashPublisherOptions);
61
69
  private readonly firstPublishTimeMap;
62
70
  publish<K extends keyof T & string>(event: K, payload: T[K]): Promise<void>;
63
71
  protected subscribeListener<K extends keyof T & string>(event: K, originalListener: (payload: T[K]) => void, { lastEventId, onError }?: PublisherSubscribeListenerOptions): Promise<() => Promise<void>>;
@@ -6,6 +6,8 @@ import '@orpc/shared';
6
6
  interface UpstashPublisherOptions extends PublisherOptions {
7
7
  /**
8
8
  * The prefix to use for Redis keys.
9
+ *
10
+ * @default ''
9
11
  */
10
12
  prefix?: string;
11
13
  /**
@@ -15,16 +17,16 @@ interface UpstashPublisherOptions extends PublisherOptions {
15
17
  */
16
18
  serializer?: undefined | Pick<RPCSerializer, keyof RPCSerializer>;
17
19
  /**
18
- * Configuration for event replay support.
20
+ * Configuration for event resume support.
19
21
  *
20
22
  * When enabled, published events are temporarily stored so new
21
23
  * subscribers can resume from a previous position using `lastEventId`.
22
24
  *
23
25
  * @default { enabled: false }
24
26
  */
25
- replay?: {
27
+ resume?: {
26
28
  /**
27
- * Whether event replay support is enabled.
29
+ * Whether event resume support is enabled.
28
30
  *
29
31
  * When enabled, published events are temporarily stored so new
30
32
  * subscribers can resume from a previous position using `lastEventId`.
@@ -33,7 +35,7 @@ interface UpstashPublisherOptions extends PublisherOptions {
33
35
  */
34
36
  enabled: boolean;
35
37
  /**
36
- * How long (in seconds) to retain events for replay.
38
+ * How long (in seconds) to retain events for resume.
37
39
  *
38
40
  * Expired events are cleaned up lazily for performance reasons, so
39
41
  * some events may remain available slightly longer than this period.
@@ -43,6 +45,12 @@ interface UpstashPublisherOptions extends PublisherOptions {
43
45
  seconds?: number;
44
46
  };
45
47
  }
48
+ /**
49
+ * Publisher adapter for Upstash Redis. Distributes events across processes via
50
+ * Upstash Pub/Sub, with optional resume support backed by Redis Streams.
51
+ *
52
+ * @see {@link https://orpc.dev/docs/helpers/publisher#adapters | Publisher Helpers - Adapters}
53
+ */
46
54
  declare class UpstashPublisher<T extends Record<string, object>> extends Publisher<T> {
47
55
  private readonly redis;
48
56
  private readonly prefix;
@@ -50,14 +58,14 @@ declare class UpstashPublisher<T extends Record<string, object>> extends Publish
50
58
  private readonly listenersMap;
51
59
  private readonly onErrorsMap;
52
60
  private readonly subscriptionMap;
53
- private readonly replayEnabled;
54
- private readonly replaySeconds;
61
+ private readonly resumeEnabled;
62
+ private readonly resumeSeconds;
55
63
  /**
56
64
  * The exactness of the `XTRIM` command.
57
65
  * Used for testing purpose.
58
66
  */
59
67
  private readonly xTrimExactness;
60
- constructor(redis: Redis, { replay, prefix, serializer, ...options }?: UpstashPublisherOptions);
68
+ constructor(redis: Redis, { resume, prefix, serializer, ...options }?: UpstashPublisherOptions);
61
69
  private readonly firstPublishTimeMap;
62
70
  publish<K extends keyof T & string>(event: K, payload: T[K]): Promise<void>;
63
71
  protected subscribeListener<K extends keyof T & string>(event: K, originalListener: (payload: T[K]) => void, { lastEventId, onError }?: PublisherSubscribeListenerOptions): Promise<() => Promise<void>>;
@@ -4,12 +4,12 @@ import { unwrapEvent, withEventMeta, getEventMeta } from '@standardserver/core';
4
4
  import { P as Publisher } from '../shared/publisher.BSQf8ybR.mjs';
5
5
 
6
6
  class UpstashPublisher extends Publisher {
7
- constructor(redis, { replay, prefix, serializer, ...options } = {}) {
7
+ constructor(redis, { resume, prefix, serializer, ...options } = {}) {
8
8
  super(options);
9
9
  this.redis = redis;
10
10
  this.prefix = prefix ?? "";
11
- this.replayEnabled = replay?.enabled ?? false;
12
- this.replaySeconds = replay?.seconds ?? 300;
11
+ this.resumeEnabled = resume?.enabled ?? false;
12
+ this.resumeSeconds = resume?.seconds ?? 300;
13
13
  this.serializer = serializer ?? new RPCSerializer();
14
14
  }
15
15
  prefix;
@@ -18,8 +18,8 @@ class UpstashPublisher extends Publisher {
18
18
  onErrorsMap = /* @__PURE__ */ new Map();
19
19
  subscriptionMap = /* @__PURE__ */ new Map();
20
20
  // Upstash subscription objects
21
- replayEnabled;
22
- replaySeconds;
21
+ resumeEnabled;
22
+ resumeSeconds;
23
23
  /**
24
24
  * The exactness of the `XTRIM` command.
25
25
  * Used for testing purpose.
@@ -30,16 +30,16 @@ class UpstashPublisher extends Publisher {
30
30
  const redisKey = `${this.prefix}${event}`;
31
31
  const data = this.serializePayload(payload);
32
32
  let id;
33
- if (this.replayEnabled) {
33
+ if (this.resumeEnabled) {
34
34
  const now = Date.now();
35
35
  for (const [event2, firstPublishTime] of this.firstPublishTimeMap) {
36
- if (firstPublishTime + this.replaySeconds * 1e3 < now) {
36
+ if (firstPublishTime + this.resumeSeconds * 1e3 < now) {
37
37
  this.firstPublishTimeMap.delete(event2);
38
38
  }
39
39
  }
40
40
  if (!this.firstPublishTimeMap.has(event)) {
41
41
  this.firstPublishTimeMap.set(event, now);
42
- const results = await this.redis.multi().xadd(redisKey, "*", { data }).xtrim(redisKey, { strategy: "MINID", exactness: this.xTrimExactness, threshold: `${now - this.replaySeconds * 1e3}-0` }).expire(redisKey, this.replaySeconds * 2).exec();
42
+ const results = await this.redis.multi().xadd(redisKey, "*", { data }).xtrim(redisKey, { strategy: "MINID", exactness: this.xTrimExactness, threshold: `${now - this.resumeSeconds * 1e3}-0` }).expire(redisKey, this.resumeSeconds * 2).exec();
43
43
  id = results[0];
44
44
  } else {
45
45
  id = await this.redis.xadd(redisKey, "*", { data });
@@ -50,14 +50,14 @@ class UpstashPublisher extends Publisher {
50
50
  async subscribeListener(event, originalListener, { lastEventId, onError } = {}) {
51
51
  const redisKey = `${this.prefix}${event}`;
52
52
  let pendingPayloads = [];
53
- const replayedIds = /* @__PURE__ */ new Set();
53
+ const resumedIds = /* @__PURE__ */ new Set();
54
54
  const deduplicatingListener = (payload) => {
55
55
  if (pendingPayloads) {
56
56
  pendingPayloads.push(payload);
57
57
  return;
58
58
  }
59
59
  const id = getEventMeta(payload)?.id;
60
- if (id !== void 0 && replayedIds.has(id)) {
60
+ if (id !== void 0 && resumedIds.has(id)) {
61
61
  return;
62
62
  }
63
63
  originalListener(payload);
@@ -70,14 +70,14 @@ class UpstashPublisher extends Publisher {
70
70
  try {
71
71
  const subscribeEventPromise = this.subscribeEvent(event);
72
72
  try {
73
- if (this.replayEnabled && lastEventId !== void 0) {
73
+ if (this.resumeEnabled && lastEventId !== void 0) {
74
74
  const results = await this.redis.xread(redisKey, lastEventId);
75
75
  if (results && results[0]) {
76
76
  const [_, items] = results[0];
77
77
  for (const [id, fields] of items) {
78
78
  const data = fields[1];
79
79
  const payload = this.deserializePayload(id, data);
80
- replayedIds.add(id);
80
+ resumedIds.add(id);
81
81
  originalListener(payload);
82
82
  }
83
83
  }
package/dist/index.d.mts CHANGED
@@ -2,7 +2,7 @@ import { ThrowableError, AsyncIteratorClass } from '@orpc/shared';
2
2
 
3
3
  interface PublisherOptions {
4
4
  /**
5
- * Maximum number of events to buffer for async iterator subscribers.
5
+ * Maximum number of events to buffer for AsyncIteratorObject subscribers.
6
6
  *
7
7
  * If the buffer exceeds this limit, the oldest event is dropped.
8
8
  * This prevents unbounded memory growth if consumers process events slowly.
@@ -68,7 +68,7 @@ declare abstract class Publisher<T extends Record<string, object>> {
68
68
  */
69
69
  subscribe<K extends keyof T & string>(event: K, listener: (payload: T[K]) => void, options?: PublisherSubscribeListenerOptions): Promise<() => Promise<void>>;
70
70
  /**
71
- * Subscribes to a specific event using an async iterator.
71
+ * Subscribes to a specific event using an AsyncIteratorObject.
72
72
  * Useful for `for await...of` loops with optional buffering and abort support.
73
73
  *
74
74
  * @example
package/dist/index.d.ts CHANGED
@@ -2,7 +2,7 @@ import { ThrowableError, AsyncIteratorClass } from '@orpc/shared';
2
2
 
3
3
  interface PublisherOptions {
4
4
  /**
5
- * Maximum number of events to buffer for async iterator subscribers.
5
+ * Maximum number of events to buffer for AsyncIteratorObject subscribers.
6
6
  *
7
7
  * If the buffer exceeds this limit, the oldest event is dropped.
8
8
  * This prevents unbounded memory growth if consumers process events slowly.
@@ -68,7 +68,7 @@ declare abstract class Publisher<T extends Record<string, object>> {
68
68
  */
69
69
  subscribe<K extends keyof T & string>(event: K, listener: (payload: T[K]) => void, options?: PublisherSubscribeListenerOptions): Promise<() => Promise<void>>;
70
70
  /**
71
- * Subscribes to a specific event using an async iterator.
71
+ * Subscribes to a specific event using an AsyncIteratorObject.
72
72
  * Useful for `for await...of` loops with optional buffering and abort support.
73
73
  *
74
74
  * @example
package/package.json CHANGED
@@ -1,8 +1,13 @@
1
1
  {
2
2
  "name": "@orpc/publisher",
3
3
  "type": "module",
4
- "version": "2.0.0-beta.3",
4
+ "version": "2.0.0-beta.30",
5
+ "description": "Typesafe pub/sub for oRPC event streaming, with memory, Redis, and Upstash adapters",
5
6
  "license": "MIT",
7
+ "funding": [
8
+ "https://github.com/sponsors/dinwwwh",
9
+ "https://opencollective.com/middleapi"
10
+ ],
6
11
  "homepage": "https://orpc.dev",
7
12
  "repository": {
8
13
  "type": "git",
@@ -10,7 +15,15 @@
10
15
  "directory": "packages/publisher"
11
16
  },
12
17
  "keywords": [
13
- "orpc"
18
+ "orpc",
19
+ "pubsub",
20
+ "publish-subscribe",
21
+ "events",
22
+ "event-iterator",
23
+ "sse",
24
+ "redis",
25
+ "upstash",
26
+ "typescript"
14
27
  ],
15
28
  "sideEffects": false,
16
29
  "exports": {
@@ -52,13 +65,13 @@
52
65
  }
53
66
  },
54
67
  "dependencies": {
55
- "@standardserver/core": "^0.0.25",
56
- "@orpc/client": "2.0.0-beta.3",
57
- "@orpc/shared": "2.0.0-beta.3"
68
+ "@standardserver/core": "^0.8.0",
69
+ "@orpc/client": "2.0.0-beta.30",
70
+ "@orpc/shared": "2.0.0-beta.30"
58
71
  },
59
72
  "devDependencies": {
60
- "@upstash/redis": "^1.38.0",
61
- "redis": "^6.0.0"
73
+ "@upstash/redis": "^1.38.2",
74
+ "redis": "^6.2.1"
62
75
  },
63
76
  "scripts": {
64
77
  "build": "unbuild",