@orpc/standard-server-peer 0.0.0-next.a320605 β 0.0.0-next.a45fc95
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 +126 -12
- package/dist/index.d.mts +127 -41
- package/dist/index.d.ts +127 -41
- package/dist/index.mjs +163 -59
- package/package.json +5 -5
package/README.md
CHANGED
|
@@ -1,22 +1,25 @@
|
|
|
1
1
|
<div align="center">
|
|
2
|
-
<image align="center" src="https://orpc.
|
|
2
|
+
<image align="center" src="https://orpc.dev/logo.webp" width=280 alt="oRPC logo" />
|
|
3
3
|
</div>
|
|
4
4
|
|
|
5
5
|
<h1></h1>
|
|
6
6
|
|
|
7
7
|
<div align="center">
|
|
8
|
-
<a href="https://codecov.io/gh/
|
|
9
|
-
<img alt="codecov" src="https://codecov.io/gh/
|
|
8
|
+
<a href="https://codecov.io/gh/middleapi/orpc">
|
|
9
|
+
<img alt="codecov" src="https://codecov.io/gh/middleapi/orpc/branch/main/graph/badge.svg">
|
|
10
10
|
</a>
|
|
11
11
|
<a href="https://www.npmjs.com/package/@orpc/standard-server-peer">
|
|
12
12
|
<img alt="weekly downloads" src="https://img.shields.io/npm/dw/%40orpc%2Fstandard-server-peer?logo=npm" />
|
|
13
13
|
</a>
|
|
14
|
-
<a href="https://github.com/
|
|
15
|
-
<img alt="MIT License" src="https://img.shields.io/github/license/
|
|
14
|
+
<a href="https://github.com/middleapi/orpc/blob/main/LICENSE">
|
|
15
|
+
<img alt="MIT License" src="https://img.shields.io/github/license/middleapi/orpc?logo=open-source-initiative" />
|
|
16
16
|
</a>
|
|
17
17
|
<a href="https://discord.gg/TXEbwRBvQn">
|
|
18
18
|
<img alt="Discord" src="https://img.shields.io/discord/1308966753044398161?color=7389D8&label&logo=discord&logoColor=ffffff" />
|
|
19
19
|
</a>
|
|
20
|
+
<a href="https://deepwiki.com/middleapi/orpc">
|
|
21
|
+
<img src="https://deepwiki.com/badge.svg" alt="Ask DeepWiki">
|
|
22
|
+
</a>
|
|
20
23
|
</div>
|
|
21
24
|
|
|
22
25
|
<h3 align="center">Typesafe APIs Made Simple πͺ</h3>
|
|
@@ -31,7 +34,7 @@
|
|
|
31
34
|
- **π First-Class OpenAPI**: Built-in support that fully adheres to the OpenAPI standard.
|
|
32
35
|
- **π Contract-First Development**: Optionally define your API contract before implementation.
|
|
33
36
|
- **π First-Class OpenTelemetry**: Seamlessly integrate with OpenTelemetry for observability.
|
|
34
|
-
- **βοΈ Framework Integrations**: Seamlessly integrate with TanStack Query (React, Vue, Solid, Svelte, Angular), Pinia Colada, and more.
|
|
37
|
+
- **βοΈ Framework Integrations**: Seamlessly integrate with TanStack Query (React, Vue, Solid, Svelte, Angular), SWR, Pinia Colada, and more.
|
|
35
38
|
- **π Server Actions**: Fully compatible with React Server Actions on Next.js, TanStack Start, and other platforms.
|
|
36
39
|
- **π Standard Schema Support**: Works out of the box with Zod, Valibot, ArkType, and other schema validators.
|
|
37
40
|
- **ποΈ Native Types**: Supports native types like Date, File, Blob, BigInt, URL, and more.
|
|
@@ -42,7 +45,7 @@
|
|
|
42
45
|
|
|
43
46
|
## Documentation
|
|
44
47
|
|
|
45
|
-
You can find the full documentation [here](https://orpc.
|
|
48
|
+
You can find the full documentation [here](https://orpc.dev).
|
|
46
49
|
|
|
47
50
|
## Packages
|
|
48
51
|
|
|
@@ -54,6 +57,7 @@ You can find the full documentation [here](https://orpc.unnoq.com).
|
|
|
54
57
|
- [@orpc/nest](https://www.npmjs.com/package/@orpc/nest): Deeply integrate oRPC with [NestJS](https://nestjs.com/).
|
|
55
58
|
- [@orpc/react](https://www.npmjs.com/package/@orpc/react): Utilities for integrating oRPC with React and React Server Actions.
|
|
56
59
|
- [@orpc/tanstack-query](https://www.npmjs.com/package/@orpc/tanstack-query): [TanStack Query](https://tanstack.com/query/latest) integration.
|
|
60
|
+
- [@orpc/experimental-react-swr](https://www.npmjs.com/package/@orpc/experimental-react-swr): [SWR](https://swr.vercel.app/) integration.
|
|
57
61
|
- [@orpc/vue-colada](https://www.npmjs.com/package/@orpc/vue-colada): Integration with [Pinia Colada](https://pinia-colada.esm.dev/).
|
|
58
62
|
- [@orpc/hey-api](https://www.npmjs.com/package/@orpc/hey-api): [Hey API](https://heyapi.dev/) integration.
|
|
59
63
|
- [@orpc/zod](https://www.npmjs.com/package/@orpc/zod): More schemas that [Zod](https://zod.dev/) doesn't support yet.
|
|
@@ -66,12 +70,122 @@ Provides a standard interface for oRPC server adapters to interact with connecte
|
|
|
66
70
|
|
|
67
71
|
## Sponsors
|
|
68
72
|
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
+
If you find oRPC valuable and would like to support its development, you can do so here: [GitHub Sponsors](https://github.com/sponsors/dinwwwh).
|
|
74
|
+
|
|
75
|
+
### π Platinum Sponsor
|
|
76
|
+
|
|
77
|
+
<table>
|
|
78
|
+
<tr>
|
|
79
|
+
<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>
|
|
80
|
+
</tr>
|
|
81
|
+
</table>
|
|
82
|
+
|
|
83
|
+
### π₯ Gold Sponsor
|
|
84
|
+
|
|
85
|
+
<table>
|
|
86
|
+
<tr>
|
|
87
|
+
<td align="center"><a href="https://zuplo.link/orpc?ref=orpc" target="_blank" rel="noopener" title="Zuplo"><img src="https://avatars.githubusercontent.com/u/85497839?v=4" width="209" alt="Zuplo"/><br />Zuplo</a></td>
|
|
88
|
+
</tr>
|
|
89
|
+
</table>
|
|
90
|
+
|
|
91
|
+
### π₯ Silver Sponsor
|
|
92
|
+
|
|
93
|
+
<table>
|
|
94
|
+
<tr>
|
|
95
|
+
<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&v=4" width="167" alt="ζδΈγγ"/><br />ζδΈγγ</a></td>
|
|
96
|
+
<td align="center"><a href="https://valerii15298.github.io/?ref=orpc" target="_blank" rel="noopener" title="Valerii Petryniak"><img src="https://avatars.githubusercontent.com/u/44531564?u=88ac74d9bacd20401518441907acad21063cd397&v=4" width="167" alt="Valerii Petryniak"/><br />Valerii Petryniak</a></td>
|
|
97
|
+
<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="167" alt="christ12938"/><br />christ12938</a></td>
|
|
98
|
+
</tr>
|
|
99
|
+
</table>
|
|
100
|
+
|
|
101
|
+
### Generous Sponsors
|
|
102
|
+
|
|
103
|
+
<table>
|
|
104
|
+
<tr>
|
|
105
|
+
<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="139" alt="LN Markets"/><br />LN Markets</a></td>
|
|
106
|
+
</tr>
|
|
107
|
+
</table>
|
|
108
|
+
|
|
109
|
+
### Sponsors
|
|
110
|
+
|
|
111
|
+
<table>
|
|
112
|
+
<tr>
|
|
113
|
+
<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="119" alt="Reece McDonald"/><br />Reece McDonald</a></td>
|
|
114
|
+
<td align="center"><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&v=4" width="119" alt="Sefa Eyeoglu"/><br />Sefa Eyeoglu</a></td>
|
|
115
|
+
<td align="center"><a href="https://github.com/u1-liquid?ref=orpc" target="_blank" rel="noopener" title="γγγγγ¨γΌγ«γ
"><img src="https://avatars.githubusercontent.com/u/17376330?u=de3353804be889f009f7e0a1582daf04d0ab292d&v=4" width="119" alt="γγγγγ¨γΌγ«γ
"/><br />γγγγγ¨γΌγ«γ
</a></td>
|
|
116
|
+
<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&v=4" width="119" alt="nk"/><br />nk</a></td>
|
|
117
|
+
<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="119" alt="supastarter"/><br />supastarter</a></td>
|
|
118
|
+
<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&v=4" width="119" alt="Dexter Miguel"/><br />Dexter Miguel</a></td>
|
|
119
|
+
<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&v=4" width="119" alt="herrfugbaum"/><br />herrfugbaum</a></td>
|
|
120
|
+
</tr>
|
|
121
|
+
<tr>
|
|
122
|
+
<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&v=4" width="119" alt="Ryota Murakami"/><br />Ryota Murakami</a></td>
|
|
123
|
+
<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="119" alt="David Cramer"/><br />David Cramer</a></td>
|
|
124
|
+
<td align="center"><a href="https://github.com/happyboy2022?ref=orpc" target="_blank" rel="noopener" title="happyboy"><img src="https://avatars.githubusercontent.com/u/103669586?u=65b49c4b893ed3703909fbb3a7a22313f3f9c121&v=4" width="119" alt="happyboy"/><br />happyboy</a></td>
|
|
125
|
+
<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&v=4" width="119" alt="Valerii Strilets"/><br />Valerii Strilets</a></td>
|
|
126
|
+
<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&v=4" width="119" alt="Kyle Mistele"/><br />Kyle Mistele</a></td>
|
|
127
|
+
<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="119" alt="Andrew Peters"/><br />Andrew Peters</a></td>
|
|
128
|
+
<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&v=4" width="119" alt="Ryan Vogel"/><br />Ryan Vogel</a></td>
|
|
129
|
+
</tr>
|
|
130
|
+
<tr>
|
|
131
|
+
<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&v=4" width="119" alt="Peter Adam"/><br />Peter Adam</a></td>
|
|
132
|
+
<td align="center"><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&v=4" width="119" alt="Chen, Zhi-Yuan"/><br />Chen, Zhi-Yuan</a></td>
|
|
133
|
+
<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&v=4" width="119" alt="Ryan Soderberg"/><br />Ryan Soderberg</a></td>
|
|
134
|
+
</tr>
|
|
135
|
+
</table>
|
|
136
|
+
|
|
137
|
+
### Backers
|
|
138
|
+
|
|
139
|
+
<table>
|
|
140
|
+
<tr>
|
|
141
|
+
<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&v=4" width="104" alt="David Walsh"/><br />David Walsh</a></td>
|
|
142
|
+
<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&v=4" width="104" alt="Robbe Vaes"/><br />Robbe Vaes</a></td>
|
|
143
|
+
<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="104" alt="Aidan Sunbury"/><br />Aidan Sunbury</a></td>
|
|
144
|
+
<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&v=4" width="104" alt="soonoo"/><br />soonoo</a></td>
|
|
145
|
+
<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&v=4" width="104" alt="Kevin Porten"/><br />Kevin Porten</a></td>
|
|
146
|
+
<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&v=4" width="104" alt="Denis"/><br />Denis</a></td>
|
|
147
|
+
<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?v=4" width="104" alt="Christopher Kapic"/><br />Christopher Kapic</a></td>
|
|
148
|
+
<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&v=4" width="104" alt="Tom Ballinger"/><br />Tom Ballinger</a></td>
|
|
149
|
+
</tr>
|
|
150
|
+
<tr>
|
|
151
|
+
<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&v=4" width="104" alt="Sam"/><br />Sam</a></td>
|
|
152
|
+
<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&v=4" width="104" alt="Titoine"/><br />Titoine</a></td>
|
|
153
|
+
<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&v=4" width="104" alt="Igor Makowski"/><br />Igor Makowski</a></td>
|
|
154
|
+
<td align="center"><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&v=4" width="104" alt="Anees Iqbal"/><br />Anees Iqbal</a></td>
|
|
155
|
+
<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&v=4" width="104" alt="Alex"/><br />Alex</a></td>
|
|
156
|
+
</tr>
|
|
157
|
+
</table>
|
|
158
|
+
|
|
159
|
+
### Past Sponsors
|
|
160
|
+
|
|
161
|
+
<p>
|
|
162
|
+
<a href="https://github.com/MrMaxie?ref=orpc" target="_blank" rel="noopener" title="Maxie"><img src="https://avatars.githubusercontent.com/u/3857836?u=5e6b57973d4385d655663ffdd836e487856f2984&v=4" width="32" height="32" alt="Maxie" /></a>
|
|
163
|
+
<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&v=4" width="32" height="32" alt="Stijn Timmer" /></a>
|
|
164
|
+
<a href="https://github.com/motopods?ref=orpc" target="_blank" rel="noopener" title="motopods"><img src="https://avatars.githubusercontent.com/u/58200641?u=18833983d65b481ae90a4adec2373064ec58bcf3&v=4" width="32" height="32" alt="motopods" /></a>
|
|
165
|
+
<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&v=4" width="32" height="32" alt="Francisco Hermida" /></a>
|
|
166
|
+
<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&v=4" width="32" height="32" alt="ThΓ©o LUDWIG" /></a>
|
|
167
|
+
<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&v=4" width="32" height="32" alt="Abhay Ramesh" /></a>
|
|
168
|
+
<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>
|
|
169
|
+
<a href="https://github.com/johngerome?ref=orpc" target="_blank" rel="noopener" title="0x4e32"><img src="https://avatars.githubusercontent.com/u/2002000?u=24e8dd943cfc862aa284d858a023532c75071ade&v=4" width="32" height="32" alt="0x4e32" /></a>
|
|
170
|
+
<a href="https://github.com/yzuyr?ref=orpc" target="_blank" rel="noopener" title="Ryuz"><img src="https://avatars.githubusercontent.com/u/196539378?u=d38374588d219b6748b16406982f6559411466d4&v=4" width="32" height="32" alt="Ryuz" /></a>
|
|
171
|
+
<a href="https://github.com/YiCChi?ref=orpc" target="_blank" rel="noopener" title="yicchi"><img src="https://avatars.githubusercontent.com/u/86967274?u=6c2756f09fe15dd94d572f560e979cd157982852&v=4" width="32" height="32" alt="yicchi" /></a>
|
|
172
|
+
<a href="https://github.com/cloudycotton?ref=orpc" target="_blank" rel="noopener" title="Saksham"><img src="https://avatars.githubusercontent.com/u/168998965?u=9b9634a5aed66a51c1b880663272725b00b92b14&v=4" width="32" height="32" alt="Saksham" /></a>
|
|
173
|
+
<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&v=4" width="32" height="32" alt="Roman Hrynevych" /></a>
|
|
174
|
+
<a href="https://github.com/rokitgg?ref=orpc" target="_blank" rel="noopener" title="rokitg"><img src="https://avatars.githubusercontent.com/u/125133357?u=06c74aefaa2236b06a2e5fba5a5c612339f45912&v=4" width="32" height="32" alt="rokitg" /></a>
|
|
175
|
+
<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&v=4" width="32" height="32" alt="Omar Khatib" /></a>
|
|
176
|
+
<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>
|
|
177
|
+
<a href="https://github.com/bapspatil?ref=orpc" target="_blank" rel="noopener" title="Bapusaheb Patil"><img src="https://avatars.githubusercontent.com/u/16699418?v=4" width="32" height="32" alt="Bapusaheb Patil" /></a>
|
|
178
|
+
<a href="https://github.com/ripgrim?ref=orpc" target="_blank" rel="noopener" title="grim"><img src="https://avatars.githubusercontent.com/u/75869731?u=b17c42ec2309552fdb822a86b25a2f99146a4d72&v=4" width="32" height="32" alt="grim" /></a>
|
|
179
|
+
<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&v=4" width="32" height="32" alt="Nelson Lai" /></a>
|
|
180
|
+
<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&v=4" width="32" height="32" alt="LΓͺ Cao NguyΓͺn" /></a>
|
|
181
|
+
<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&v=4" width="32" height="32" alt="Robert Soriano" /></a>
|
|
182
|
+
<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>
|
|
183
|
+
<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>
|
|
184
|
+
<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&v=4" width="32" height="32" alt="Novak Antonijevic" /></a>
|
|
185
|
+
<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&v=4" width="32" height="32" alt="Laduni Estu Syalwa" /></a>
|
|
186
|
+
<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&v=4" width="32" height="32" alt="Illarion Koperski" /></a>
|
|
73
187
|
</p>
|
|
74
188
|
|
|
75
189
|
## License
|
|
76
190
|
|
|
77
|
-
Distributed under the MIT License. See [LICENSE](https://github.com/
|
|
191
|
+
Distributed under the MIT License. See [LICENSE](https://github.com/middleapi/orpc/blob/main/LICENSE) for more information.
|
package/dist/index.d.mts
CHANGED
|
@@ -1,11 +1,100 @@
|
|
|
1
1
|
import { Promisable, AsyncIdQueueCloseOptions as AsyncIdQueueCloseOptions$1, SetSpanErrorOptions, AsyncIteratorClassCleanupFn, AsyncIteratorClass } from '@orpc/shared';
|
|
2
|
-
import { StandardRequest, StandardResponse,
|
|
2
|
+
import { StandardRequest, EventMeta, StandardResponse, StandardBody, StandardHeaders } from '@orpc/standard-server';
|
|
3
3
|
|
|
4
4
|
type EncodedMessage = string | ArrayBufferLike | Uint8Array;
|
|
5
5
|
interface EncodedMessageSendFn {
|
|
6
6
|
(message: EncodedMessage): Promisable<void>;
|
|
7
7
|
}
|
|
8
8
|
|
|
9
|
+
declare enum MessageType {
|
|
10
|
+
REQUEST = 1,
|
|
11
|
+
RESPONSE = 2,
|
|
12
|
+
EVENT_ITERATOR = 3,
|
|
13
|
+
ABORT_SIGNAL = 4
|
|
14
|
+
}
|
|
15
|
+
type EventIteratorEvent = 'message' | 'error' | 'done';
|
|
16
|
+
interface EventIteratorPayload {
|
|
17
|
+
event: EventIteratorEvent;
|
|
18
|
+
data: unknown;
|
|
19
|
+
meta?: EventMeta;
|
|
20
|
+
}
|
|
21
|
+
interface RequestMessageMap {
|
|
22
|
+
[MessageType.REQUEST]: Omit<StandardRequest, 'signal'>;
|
|
23
|
+
[MessageType.EVENT_ITERATOR]: EventIteratorPayload;
|
|
24
|
+
[MessageType.ABORT_SIGNAL]: void;
|
|
25
|
+
}
|
|
26
|
+
interface ResponseMessageMap {
|
|
27
|
+
[MessageType.RESPONSE]: StandardResponse;
|
|
28
|
+
[MessageType.EVENT_ITERATOR]: EventIteratorPayload;
|
|
29
|
+
[MessageType.ABORT_SIGNAL]: void;
|
|
30
|
+
}
|
|
31
|
+
interface BaseMessageFormat<P = unknown> {
|
|
32
|
+
/**
|
|
33
|
+
* Client-guaranteed unique identifier
|
|
34
|
+
*/
|
|
35
|
+
i: string;
|
|
36
|
+
/**
|
|
37
|
+
* @default REQUEST | RESPONSE
|
|
38
|
+
*/
|
|
39
|
+
t?: MessageType;
|
|
40
|
+
p: P;
|
|
41
|
+
}
|
|
42
|
+
interface SerializedEventIteratorPayload {
|
|
43
|
+
e: EventIteratorEvent;
|
|
44
|
+
d: unknown;
|
|
45
|
+
m?: EventMeta;
|
|
46
|
+
}
|
|
47
|
+
interface SerializedRequestPayload {
|
|
48
|
+
/**
|
|
49
|
+
* The url of the request
|
|
50
|
+
*
|
|
51
|
+
* might be relative path if origin is `http://orpc`
|
|
52
|
+
*/
|
|
53
|
+
u: string;
|
|
54
|
+
b: StandardBody;
|
|
55
|
+
/**
|
|
56
|
+
* @default {}
|
|
57
|
+
*/
|
|
58
|
+
h?: StandardHeaders;
|
|
59
|
+
/**
|
|
60
|
+
* @default POST
|
|
61
|
+
*/
|
|
62
|
+
m?: string;
|
|
63
|
+
}
|
|
64
|
+
interface SerializedResponsePayload {
|
|
65
|
+
/**
|
|
66
|
+
* @default 200
|
|
67
|
+
*/
|
|
68
|
+
s?: number;
|
|
69
|
+
/**
|
|
70
|
+
* @default {}
|
|
71
|
+
*/
|
|
72
|
+
h?: StandardHeaders;
|
|
73
|
+
b: StandardBody;
|
|
74
|
+
}
|
|
75
|
+
type DecodedMessageUnion<TMap extends RequestMessageMap | ResponseMessageMap> = {
|
|
76
|
+
[K in keyof TMap]: [id: string, type: K, payload: TMap[K]];
|
|
77
|
+
}[keyof TMap];
|
|
78
|
+
type DecodedRequestMessage = DecodedMessageUnion<RequestMessageMap>;
|
|
79
|
+
type DecodedResponseMessage = DecodedMessageUnion<ResponseMessageMap>;
|
|
80
|
+
/**
|
|
81
|
+
* New serialization functions without Blob handling
|
|
82
|
+
*/
|
|
83
|
+
declare function serializeRequestMessage<T extends keyof RequestMessageMap>(id: string, type: T, payload: RequestMessageMap[T]): BaseMessageFormat;
|
|
84
|
+
declare function deserializeRequestMessage(message: BaseMessageFormat): DecodedRequestMessage;
|
|
85
|
+
declare function serializeResponseMessage<T extends keyof ResponseMessageMap>(id: string, type: T, payload: ResponseMessageMap[T]): BaseMessageFormat;
|
|
86
|
+
declare function deserializeResponseMessage(message: BaseMessageFormat): DecodedResponseMessage;
|
|
87
|
+
/**
|
|
88
|
+
* Original encode/decode functions now using the new serialize/deserialize functions
|
|
89
|
+
*/
|
|
90
|
+
declare function encodeRequestMessage<T extends keyof RequestMessageMap>(id: string, type: T, payload: RequestMessageMap[T]): Promise<EncodedMessage>;
|
|
91
|
+
declare function decodeRequestMessage(raw: EncodedMessage): Promise<DecodedRequestMessage>;
|
|
92
|
+
declare function encodeResponseMessage<T extends keyof ResponseMessageMap>(id: string, type: T, payload: ResponseMessageMap[T]): Promise<EncodedMessage>;
|
|
93
|
+
declare function decodeResponseMessage(raw: EncodedMessage): Promise<DecodedResponseMessage>;
|
|
94
|
+
|
|
95
|
+
interface experimental_RequestMessageSendFn {
|
|
96
|
+
(message: DecodedRequestMessage): Promisable<void>;
|
|
97
|
+
}
|
|
9
98
|
interface ClientPeerCloseOptions extends AsyncIdQueueCloseOptions$1 {
|
|
10
99
|
/**
|
|
11
100
|
* Should abort or not?
|
|
@@ -15,6 +104,15 @@ interface ClientPeerCloseOptions extends AsyncIdQueueCloseOptions$1 {
|
|
|
15
104
|
abort?: boolean;
|
|
16
105
|
}
|
|
17
106
|
declare class ClientPeer {
|
|
107
|
+
private readonly peer;
|
|
108
|
+
constructor(send: EncodedMessageSendFn);
|
|
109
|
+
get length(): number;
|
|
110
|
+
open(id: string): AbortController;
|
|
111
|
+
request(request: StandardRequest): Promise<StandardResponse>;
|
|
112
|
+
message(raw: EncodedMessage): Promise<void>;
|
|
113
|
+
close(options?: AsyncIdQueueCloseOptions$1): void;
|
|
114
|
+
}
|
|
115
|
+
declare class experimental_ClientPeerWithoutCodec {
|
|
18
116
|
private readonly idGenerator;
|
|
19
117
|
/**
|
|
20
118
|
* Queue of responses sent from server, awaiting consumption
|
|
@@ -33,55 +131,25 @@ declare class ClientPeer {
|
|
|
33
131
|
*/
|
|
34
132
|
private readonly cleanupFns;
|
|
35
133
|
private readonly send;
|
|
36
|
-
constructor(send:
|
|
134
|
+
constructor(send: experimental_RequestMessageSendFn);
|
|
37
135
|
get length(): number;
|
|
38
136
|
open(id: string): AbortController;
|
|
39
137
|
request(request: StandardRequest): Promise<StandardResponse>;
|
|
40
|
-
message(
|
|
138
|
+
message([id, type, payload]: DecodedResponseMessage): Promise<void>;
|
|
41
139
|
close(options?: AsyncIdQueueCloseOptions$1): void;
|
|
42
140
|
}
|
|
43
141
|
|
|
44
|
-
declare enum MessageType {
|
|
45
|
-
REQUEST = 1,
|
|
46
|
-
RESPONSE = 2,
|
|
47
|
-
EVENT_ITERATOR = 3,
|
|
48
|
-
ABORT_SIGNAL = 4
|
|
49
|
-
}
|
|
50
|
-
type EventIteratorEvent = 'message' | 'error' | 'done';
|
|
51
|
-
interface EventIteratorPayload {
|
|
52
|
-
event: EventIteratorEvent;
|
|
53
|
-
data: unknown;
|
|
54
|
-
meta?: EventMeta;
|
|
55
|
-
}
|
|
56
|
-
interface RequestMessageMap {
|
|
57
|
-
[MessageType.REQUEST]: Omit<StandardRequest, 'signal'>;
|
|
58
|
-
[MessageType.EVENT_ITERATOR]: EventIteratorPayload;
|
|
59
|
-
[MessageType.ABORT_SIGNAL]: void;
|
|
60
|
-
}
|
|
61
|
-
interface ResponseMessageMap {
|
|
62
|
-
[MessageType.RESPONSE]: StandardResponse;
|
|
63
|
-
[MessageType.EVENT_ITERATOR]: EventIteratorPayload;
|
|
64
|
-
[MessageType.ABORT_SIGNAL]: void;
|
|
65
|
-
}
|
|
66
|
-
type DecodedMessageUnion<TMap extends RequestMessageMap | ResponseMessageMap> = {
|
|
67
|
-
[K in keyof TMap]: [id: string, type: K, payload: TMap[K]];
|
|
68
|
-
}[keyof TMap];
|
|
69
|
-
type DecodedRequestMessage = DecodedMessageUnion<RequestMessageMap>;
|
|
70
|
-
type DecodedResponseMessage = DecodedMessageUnion<ResponseMessageMap>;
|
|
71
|
-
declare function encodeRequestMessage<T extends keyof RequestMessageMap>(id: string, type: T, payload: RequestMessageMap[T]): Promise<EncodedMessage>;
|
|
72
|
-
declare function decodeRequestMessage(raw: EncodedMessage): Promise<DecodedRequestMessage>;
|
|
73
|
-
declare function encodeResponseMessage<T extends keyof ResponseMessageMap>(id: string, type: T, payload: ResponseMessageMap[T]): Promise<EncodedMessage>;
|
|
74
|
-
declare function decodeResponseMessage(raw: EncodedMessage): Promise<DecodedResponseMessage>;
|
|
75
|
-
|
|
76
142
|
interface AsyncIdQueueCloseOptions {
|
|
77
143
|
id?: string;
|
|
78
144
|
reason?: unknown;
|
|
79
145
|
}
|
|
80
146
|
declare class AsyncIdQueue<T> {
|
|
81
147
|
private readonly openIds;
|
|
82
|
-
private readonly
|
|
83
|
-
private readonly
|
|
148
|
+
private readonly queues;
|
|
149
|
+
private readonly waiters;
|
|
84
150
|
get length(): number;
|
|
151
|
+
get waiterIds(): string[];
|
|
152
|
+
hasBufferedItems(id: string): boolean;
|
|
85
153
|
open(id: string): void;
|
|
86
154
|
isOpen(id: string): boolean;
|
|
87
155
|
push(id: string, item: T): void;
|
|
@@ -95,6 +163,9 @@ interface ToEventIteratorOptions extends SetSpanErrorOptions {
|
|
|
95
163
|
declare function toEventIterator(queue: AsyncIdQueue<EventIteratorPayload>, id: string, cleanup: AsyncIteratorClassCleanupFn, options?: ToEventIteratorOptions): AsyncIteratorClass<unknown>;
|
|
96
164
|
declare function resolveEventIterator(iterator: AsyncIterator<any>, callback: (payload: EventIteratorPayload) => Promise<'next' | 'abort'>): Promise<void>;
|
|
97
165
|
|
|
166
|
+
interface experimental_ResponseMessageSendFn {
|
|
167
|
+
(message: DecodedResponseMessage): Promisable<void>;
|
|
168
|
+
}
|
|
98
169
|
interface ServerPeerHandleRequestFn {
|
|
99
170
|
(request: StandardRequest): Promise<StandardResponse>;
|
|
100
171
|
}
|
|
@@ -107,6 +178,21 @@ interface ServerPeerCloseOptions extends AsyncIdQueueCloseOptions$1 {
|
|
|
107
178
|
abort?: boolean;
|
|
108
179
|
}
|
|
109
180
|
declare class ServerPeer {
|
|
181
|
+
private readonly peer;
|
|
182
|
+
constructor(send: EncodedMessageSendFn);
|
|
183
|
+
get length(): number;
|
|
184
|
+
open(id: string): AbortController;
|
|
185
|
+
/**
|
|
186
|
+
* @todo This method will return Promise<void> in the next major version.
|
|
187
|
+
*/
|
|
188
|
+
message(raw: EncodedMessage, handleRequest?: ServerPeerHandleRequestFn): Promise<[id: string, StandardRequest | undefined]>;
|
|
189
|
+
/**
|
|
190
|
+
* @deprecated Please pass the `handleRequest` (second arg) function to the `message` method instead.
|
|
191
|
+
*/
|
|
192
|
+
response(id: string, response: StandardResponse): Promise<void>;
|
|
193
|
+
close({ abort, ...options }?: ServerPeerCloseOptions): void;
|
|
194
|
+
}
|
|
195
|
+
declare class experimental_ServerPeerWithoutCodec {
|
|
110
196
|
/**
|
|
111
197
|
* Queue of event iterator messages sent from client, awaiting consumption
|
|
112
198
|
*/
|
|
@@ -116,13 +202,13 @@ declare class ServerPeer {
|
|
|
116
202
|
*/
|
|
117
203
|
private readonly clientControllers;
|
|
118
204
|
private readonly send;
|
|
119
|
-
constructor(send:
|
|
205
|
+
constructor(send: experimental_ResponseMessageSendFn);
|
|
120
206
|
get length(): number;
|
|
121
207
|
open(id: string): AbortController;
|
|
122
208
|
/**
|
|
123
209
|
* @todo This method will return Promise<void> in the next major version.
|
|
124
210
|
*/
|
|
125
|
-
message(
|
|
211
|
+
message([id, type, payload]: DecodedRequestMessage, handleRequest?: ServerPeerHandleRequestFn): Promise<[id: string, StandardRequest | undefined]>;
|
|
126
212
|
/**
|
|
127
213
|
* @deprecated Please pass the `handleRequest` (second arg) function to the `message` method instead.
|
|
128
214
|
*/
|
|
@@ -130,5 +216,5 @@ declare class ServerPeer {
|
|
|
130
216
|
close({ abort, ...options }?: ServerPeerCloseOptions): void;
|
|
131
217
|
}
|
|
132
218
|
|
|
133
|
-
export { ClientPeer, MessageType, ServerPeer, decodeRequestMessage, decodeResponseMessage, encodeRequestMessage, encodeResponseMessage, resolveEventIterator, toEventIterator };
|
|
134
|
-
export type { ClientPeerCloseOptions, DecodedRequestMessage, DecodedResponseMessage, EncodedMessage, EncodedMessageSendFn, EventIteratorEvent, EventIteratorPayload, RequestMessageMap, ResponseMessageMap, ServerPeerCloseOptions, ServerPeerHandleRequestFn, ToEventIteratorOptions };
|
|
219
|
+
export { ClientPeer, MessageType, ServerPeer, decodeRequestMessage, decodeResponseMessage, deserializeRequestMessage, deserializeResponseMessage, encodeRequestMessage, encodeResponseMessage, experimental_ClientPeerWithoutCodec, experimental_ServerPeerWithoutCodec, resolveEventIterator, serializeRequestMessage, serializeResponseMessage, toEventIterator };
|
|
220
|
+
export type { BaseMessageFormat, ClientPeerCloseOptions, DecodedMessageUnion, DecodedRequestMessage, DecodedResponseMessage, EncodedMessage, EncodedMessageSendFn, EventIteratorEvent, EventIteratorPayload, RequestMessageMap, ResponseMessageMap, SerializedEventIteratorPayload, SerializedRequestPayload, SerializedResponsePayload, ServerPeerCloseOptions, ServerPeerHandleRequestFn, ToEventIteratorOptions, experimental_RequestMessageSendFn, experimental_ResponseMessageSendFn };
|
package/dist/index.d.ts
CHANGED
|
@@ -1,11 +1,100 @@
|
|
|
1
1
|
import { Promisable, AsyncIdQueueCloseOptions as AsyncIdQueueCloseOptions$1, SetSpanErrorOptions, AsyncIteratorClassCleanupFn, AsyncIteratorClass } from '@orpc/shared';
|
|
2
|
-
import { StandardRequest, StandardResponse,
|
|
2
|
+
import { StandardRequest, EventMeta, StandardResponse, StandardBody, StandardHeaders } from '@orpc/standard-server';
|
|
3
3
|
|
|
4
4
|
type EncodedMessage = string | ArrayBufferLike | Uint8Array;
|
|
5
5
|
interface EncodedMessageSendFn {
|
|
6
6
|
(message: EncodedMessage): Promisable<void>;
|
|
7
7
|
}
|
|
8
8
|
|
|
9
|
+
declare enum MessageType {
|
|
10
|
+
REQUEST = 1,
|
|
11
|
+
RESPONSE = 2,
|
|
12
|
+
EVENT_ITERATOR = 3,
|
|
13
|
+
ABORT_SIGNAL = 4
|
|
14
|
+
}
|
|
15
|
+
type EventIteratorEvent = 'message' | 'error' | 'done';
|
|
16
|
+
interface EventIteratorPayload {
|
|
17
|
+
event: EventIteratorEvent;
|
|
18
|
+
data: unknown;
|
|
19
|
+
meta?: EventMeta;
|
|
20
|
+
}
|
|
21
|
+
interface RequestMessageMap {
|
|
22
|
+
[MessageType.REQUEST]: Omit<StandardRequest, 'signal'>;
|
|
23
|
+
[MessageType.EVENT_ITERATOR]: EventIteratorPayload;
|
|
24
|
+
[MessageType.ABORT_SIGNAL]: void;
|
|
25
|
+
}
|
|
26
|
+
interface ResponseMessageMap {
|
|
27
|
+
[MessageType.RESPONSE]: StandardResponse;
|
|
28
|
+
[MessageType.EVENT_ITERATOR]: EventIteratorPayload;
|
|
29
|
+
[MessageType.ABORT_SIGNAL]: void;
|
|
30
|
+
}
|
|
31
|
+
interface BaseMessageFormat<P = unknown> {
|
|
32
|
+
/**
|
|
33
|
+
* Client-guaranteed unique identifier
|
|
34
|
+
*/
|
|
35
|
+
i: string;
|
|
36
|
+
/**
|
|
37
|
+
* @default REQUEST | RESPONSE
|
|
38
|
+
*/
|
|
39
|
+
t?: MessageType;
|
|
40
|
+
p: P;
|
|
41
|
+
}
|
|
42
|
+
interface SerializedEventIteratorPayload {
|
|
43
|
+
e: EventIteratorEvent;
|
|
44
|
+
d: unknown;
|
|
45
|
+
m?: EventMeta;
|
|
46
|
+
}
|
|
47
|
+
interface SerializedRequestPayload {
|
|
48
|
+
/**
|
|
49
|
+
* The url of the request
|
|
50
|
+
*
|
|
51
|
+
* might be relative path if origin is `http://orpc`
|
|
52
|
+
*/
|
|
53
|
+
u: string;
|
|
54
|
+
b: StandardBody;
|
|
55
|
+
/**
|
|
56
|
+
* @default {}
|
|
57
|
+
*/
|
|
58
|
+
h?: StandardHeaders;
|
|
59
|
+
/**
|
|
60
|
+
* @default POST
|
|
61
|
+
*/
|
|
62
|
+
m?: string;
|
|
63
|
+
}
|
|
64
|
+
interface SerializedResponsePayload {
|
|
65
|
+
/**
|
|
66
|
+
* @default 200
|
|
67
|
+
*/
|
|
68
|
+
s?: number;
|
|
69
|
+
/**
|
|
70
|
+
* @default {}
|
|
71
|
+
*/
|
|
72
|
+
h?: StandardHeaders;
|
|
73
|
+
b: StandardBody;
|
|
74
|
+
}
|
|
75
|
+
type DecodedMessageUnion<TMap extends RequestMessageMap | ResponseMessageMap> = {
|
|
76
|
+
[K in keyof TMap]: [id: string, type: K, payload: TMap[K]];
|
|
77
|
+
}[keyof TMap];
|
|
78
|
+
type DecodedRequestMessage = DecodedMessageUnion<RequestMessageMap>;
|
|
79
|
+
type DecodedResponseMessage = DecodedMessageUnion<ResponseMessageMap>;
|
|
80
|
+
/**
|
|
81
|
+
* New serialization functions without Blob handling
|
|
82
|
+
*/
|
|
83
|
+
declare function serializeRequestMessage<T extends keyof RequestMessageMap>(id: string, type: T, payload: RequestMessageMap[T]): BaseMessageFormat;
|
|
84
|
+
declare function deserializeRequestMessage(message: BaseMessageFormat): DecodedRequestMessage;
|
|
85
|
+
declare function serializeResponseMessage<T extends keyof ResponseMessageMap>(id: string, type: T, payload: ResponseMessageMap[T]): BaseMessageFormat;
|
|
86
|
+
declare function deserializeResponseMessage(message: BaseMessageFormat): DecodedResponseMessage;
|
|
87
|
+
/**
|
|
88
|
+
* Original encode/decode functions now using the new serialize/deserialize functions
|
|
89
|
+
*/
|
|
90
|
+
declare function encodeRequestMessage<T extends keyof RequestMessageMap>(id: string, type: T, payload: RequestMessageMap[T]): Promise<EncodedMessage>;
|
|
91
|
+
declare function decodeRequestMessage(raw: EncodedMessage): Promise<DecodedRequestMessage>;
|
|
92
|
+
declare function encodeResponseMessage<T extends keyof ResponseMessageMap>(id: string, type: T, payload: ResponseMessageMap[T]): Promise<EncodedMessage>;
|
|
93
|
+
declare function decodeResponseMessage(raw: EncodedMessage): Promise<DecodedResponseMessage>;
|
|
94
|
+
|
|
95
|
+
interface experimental_RequestMessageSendFn {
|
|
96
|
+
(message: DecodedRequestMessage): Promisable<void>;
|
|
97
|
+
}
|
|
9
98
|
interface ClientPeerCloseOptions extends AsyncIdQueueCloseOptions$1 {
|
|
10
99
|
/**
|
|
11
100
|
* Should abort or not?
|
|
@@ -15,6 +104,15 @@ interface ClientPeerCloseOptions extends AsyncIdQueueCloseOptions$1 {
|
|
|
15
104
|
abort?: boolean;
|
|
16
105
|
}
|
|
17
106
|
declare class ClientPeer {
|
|
107
|
+
private readonly peer;
|
|
108
|
+
constructor(send: EncodedMessageSendFn);
|
|
109
|
+
get length(): number;
|
|
110
|
+
open(id: string): AbortController;
|
|
111
|
+
request(request: StandardRequest): Promise<StandardResponse>;
|
|
112
|
+
message(raw: EncodedMessage): Promise<void>;
|
|
113
|
+
close(options?: AsyncIdQueueCloseOptions$1): void;
|
|
114
|
+
}
|
|
115
|
+
declare class experimental_ClientPeerWithoutCodec {
|
|
18
116
|
private readonly idGenerator;
|
|
19
117
|
/**
|
|
20
118
|
* Queue of responses sent from server, awaiting consumption
|
|
@@ -33,55 +131,25 @@ declare class ClientPeer {
|
|
|
33
131
|
*/
|
|
34
132
|
private readonly cleanupFns;
|
|
35
133
|
private readonly send;
|
|
36
|
-
constructor(send:
|
|
134
|
+
constructor(send: experimental_RequestMessageSendFn);
|
|
37
135
|
get length(): number;
|
|
38
136
|
open(id: string): AbortController;
|
|
39
137
|
request(request: StandardRequest): Promise<StandardResponse>;
|
|
40
|
-
message(
|
|
138
|
+
message([id, type, payload]: DecodedResponseMessage): Promise<void>;
|
|
41
139
|
close(options?: AsyncIdQueueCloseOptions$1): void;
|
|
42
140
|
}
|
|
43
141
|
|
|
44
|
-
declare enum MessageType {
|
|
45
|
-
REQUEST = 1,
|
|
46
|
-
RESPONSE = 2,
|
|
47
|
-
EVENT_ITERATOR = 3,
|
|
48
|
-
ABORT_SIGNAL = 4
|
|
49
|
-
}
|
|
50
|
-
type EventIteratorEvent = 'message' | 'error' | 'done';
|
|
51
|
-
interface EventIteratorPayload {
|
|
52
|
-
event: EventIteratorEvent;
|
|
53
|
-
data: unknown;
|
|
54
|
-
meta?: EventMeta;
|
|
55
|
-
}
|
|
56
|
-
interface RequestMessageMap {
|
|
57
|
-
[MessageType.REQUEST]: Omit<StandardRequest, 'signal'>;
|
|
58
|
-
[MessageType.EVENT_ITERATOR]: EventIteratorPayload;
|
|
59
|
-
[MessageType.ABORT_SIGNAL]: void;
|
|
60
|
-
}
|
|
61
|
-
interface ResponseMessageMap {
|
|
62
|
-
[MessageType.RESPONSE]: StandardResponse;
|
|
63
|
-
[MessageType.EVENT_ITERATOR]: EventIteratorPayload;
|
|
64
|
-
[MessageType.ABORT_SIGNAL]: void;
|
|
65
|
-
}
|
|
66
|
-
type DecodedMessageUnion<TMap extends RequestMessageMap | ResponseMessageMap> = {
|
|
67
|
-
[K in keyof TMap]: [id: string, type: K, payload: TMap[K]];
|
|
68
|
-
}[keyof TMap];
|
|
69
|
-
type DecodedRequestMessage = DecodedMessageUnion<RequestMessageMap>;
|
|
70
|
-
type DecodedResponseMessage = DecodedMessageUnion<ResponseMessageMap>;
|
|
71
|
-
declare function encodeRequestMessage<T extends keyof RequestMessageMap>(id: string, type: T, payload: RequestMessageMap[T]): Promise<EncodedMessage>;
|
|
72
|
-
declare function decodeRequestMessage(raw: EncodedMessage): Promise<DecodedRequestMessage>;
|
|
73
|
-
declare function encodeResponseMessage<T extends keyof ResponseMessageMap>(id: string, type: T, payload: ResponseMessageMap[T]): Promise<EncodedMessage>;
|
|
74
|
-
declare function decodeResponseMessage(raw: EncodedMessage): Promise<DecodedResponseMessage>;
|
|
75
|
-
|
|
76
142
|
interface AsyncIdQueueCloseOptions {
|
|
77
143
|
id?: string;
|
|
78
144
|
reason?: unknown;
|
|
79
145
|
}
|
|
80
146
|
declare class AsyncIdQueue<T> {
|
|
81
147
|
private readonly openIds;
|
|
82
|
-
private readonly
|
|
83
|
-
private readonly
|
|
148
|
+
private readonly queues;
|
|
149
|
+
private readonly waiters;
|
|
84
150
|
get length(): number;
|
|
151
|
+
get waiterIds(): string[];
|
|
152
|
+
hasBufferedItems(id: string): boolean;
|
|
85
153
|
open(id: string): void;
|
|
86
154
|
isOpen(id: string): boolean;
|
|
87
155
|
push(id: string, item: T): void;
|
|
@@ -95,6 +163,9 @@ interface ToEventIteratorOptions extends SetSpanErrorOptions {
|
|
|
95
163
|
declare function toEventIterator(queue: AsyncIdQueue<EventIteratorPayload>, id: string, cleanup: AsyncIteratorClassCleanupFn, options?: ToEventIteratorOptions): AsyncIteratorClass<unknown>;
|
|
96
164
|
declare function resolveEventIterator(iterator: AsyncIterator<any>, callback: (payload: EventIteratorPayload) => Promise<'next' | 'abort'>): Promise<void>;
|
|
97
165
|
|
|
166
|
+
interface experimental_ResponseMessageSendFn {
|
|
167
|
+
(message: DecodedResponseMessage): Promisable<void>;
|
|
168
|
+
}
|
|
98
169
|
interface ServerPeerHandleRequestFn {
|
|
99
170
|
(request: StandardRequest): Promise<StandardResponse>;
|
|
100
171
|
}
|
|
@@ -107,6 +178,21 @@ interface ServerPeerCloseOptions extends AsyncIdQueueCloseOptions$1 {
|
|
|
107
178
|
abort?: boolean;
|
|
108
179
|
}
|
|
109
180
|
declare class ServerPeer {
|
|
181
|
+
private readonly peer;
|
|
182
|
+
constructor(send: EncodedMessageSendFn);
|
|
183
|
+
get length(): number;
|
|
184
|
+
open(id: string): AbortController;
|
|
185
|
+
/**
|
|
186
|
+
* @todo This method will return Promise<void> in the next major version.
|
|
187
|
+
*/
|
|
188
|
+
message(raw: EncodedMessage, handleRequest?: ServerPeerHandleRequestFn): Promise<[id: string, StandardRequest | undefined]>;
|
|
189
|
+
/**
|
|
190
|
+
* @deprecated Please pass the `handleRequest` (second arg) function to the `message` method instead.
|
|
191
|
+
*/
|
|
192
|
+
response(id: string, response: StandardResponse): Promise<void>;
|
|
193
|
+
close({ abort, ...options }?: ServerPeerCloseOptions): void;
|
|
194
|
+
}
|
|
195
|
+
declare class experimental_ServerPeerWithoutCodec {
|
|
110
196
|
/**
|
|
111
197
|
* Queue of event iterator messages sent from client, awaiting consumption
|
|
112
198
|
*/
|
|
@@ -116,13 +202,13 @@ declare class ServerPeer {
|
|
|
116
202
|
*/
|
|
117
203
|
private readonly clientControllers;
|
|
118
204
|
private readonly send;
|
|
119
|
-
constructor(send:
|
|
205
|
+
constructor(send: experimental_ResponseMessageSendFn);
|
|
120
206
|
get length(): number;
|
|
121
207
|
open(id: string): AbortController;
|
|
122
208
|
/**
|
|
123
209
|
* @todo This method will return Promise<void> in the next major version.
|
|
124
210
|
*/
|
|
125
|
-
message(
|
|
211
|
+
message([id, type, payload]: DecodedRequestMessage, handleRequest?: ServerPeerHandleRequestFn): Promise<[id: string, StandardRequest | undefined]>;
|
|
126
212
|
/**
|
|
127
213
|
* @deprecated Please pass the `handleRequest` (second arg) function to the `message` method instead.
|
|
128
214
|
*/
|
|
@@ -130,5 +216,5 @@ declare class ServerPeer {
|
|
|
130
216
|
close({ abort, ...options }?: ServerPeerCloseOptions): void;
|
|
131
217
|
}
|
|
132
218
|
|
|
133
|
-
export { ClientPeer, MessageType, ServerPeer, decodeRequestMessage, decodeResponseMessage, encodeRequestMessage, encodeResponseMessage, resolveEventIterator, toEventIterator };
|
|
134
|
-
export type { ClientPeerCloseOptions, DecodedRequestMessage, DecodedResponseMessage, EncodedMessage, EncodedMessageSendFn, EventIteratorEvent, EventIteratorPayload, RequestMessageMap, ResponseMessageMap, ServerPeerCloseOptions, ServerPeerHandleRequestFn, ToEventIteratorOptions };
|
|
219
|
+
export { ClientPeer, MessageType, ServerPeer, decodeRequestMessage, decodeResponseMessage, deserializeRequestMessage, deserializeResponseMessage, encodeRequestMessage, encodeResponseMessage, experimental_ClientPeerWithoutCodec, experimental_ServerPeerWithoutCodec, resolveEventIterator, serializeRequestMessage, serializeResponseMessage, toEventIterator };
|
|
220
|
+
export type { BaseMessageFormat, ClientPeerCloseOptions, DecodedMessageUnion, DecodedRequestMessage, DecodedResponseMessage, EncodedMessage, EncodedMessageSendFn, EventIteratorEvent, EventIteratorPayload, RequestMessageMap, ResponseMessageMap, SerializedEventIteratorPayload, SerializedRequestPayload, SerializedResponsePayload, ServerPeerCloseOptions, ServerPeerHandleRequestFn, ToEventIteratorOptions, experimental_RequestMessageSendFn, experimental_ResponseMessageSendFn };
|
package/dist/index.mjs
CHANGED
|
@@ -1,6 +1,8 @@
|
|
|
1
1
|
import { isAsyncIteratorObject, stringifyJSON, readAsBuffer, AsyncIteratorClass, startSpan, runInSpanContext, isTypescriptObject, setSpanError, runWithSpan, SequentialIdGenerator, AsyncIdQueue, getGlobalOtelConfig, clone, AbortError } from '@orpc/shared';
|
|
2
2
|
import { generateContentDisposition, flattenHeader, getFilenameFromContentDisposition, withEventMeta, ErrorEvent, getEventMeta, isEventIteratorHeaders, HibernationEventIterator } from '@orpc/standard-server';
|
|
3
3
|
|
|
4
|
+
const SHORTABLE_ORIGIN = "http://orpc";
|
|
5
|
+
const SHORTABLE_ORIGIN_MATCHER = /^http:\/\/orpc\//;
|
|
4
6
|
var MessageType = /* @__PURE__ */ ((MessageType2) => {
|
|
5
7
|
MessageType2[MessageType2["REQUEST"] = 1] = "REQUEST";
|
|
6
8
|
MessageType2[MessageType2["RESPONSE"] = 2] = "RESPONSE";
|
|
@@ -8,7 +10,7 @@ var MessageType = /* @__PURE__ */ ((MessageType2) => {
|
|
|
8
10
|
MessageType2[MessageType2["ABORT_SIGNAL"] = 4] = "ABORT_SIGNAL";
|
|
9
11
|
return MessageType2;
|
|
10
12
|
})(MessageType || {});
|
|
11
|
-
|
|
13
|
+
function serializeRequestMessage(id, type, payload) {
|
|
12
14
|
if (type === 3 /* EVENT_ITERATOR */) {
|
|
13
15
|
const eventPayload = payload;
|
|
14
16
|
const serializedPayload2 = {
|
|
@@ -16,35 +18,26 @@ async function encodeRequestMessage(id, type, payload) {
|
|
|
16
18
|
d: eventPayload.data,
|
|
17
19
|
m: eventPayload.meta
|
|
18
20
|
};
|
|
19
|
-
return
|
|
21
|
+
return { i: id, t: type, p: serializedPayload2 };
|
|
20
22
|
}
|
|
21
23
|
if (type === 4 /* ABORT_SIGNAL */) {
|
|
22
|
-
return
|
|
24
|
+
return { i: id, t: type, p: payload };
|
|
23
25
|
}
|
|
24
26
|
const request = payload;
|
|
25
|
-
const { body: processedBody, headers: processedHeaders } = await serializeBodyAndHeaders(
|
|
26
|
-
request.body,
|
|
27
|
-
request.headers
|
|
28
|
-
);
|
|
29
27
|
const serializedPayload = {
|
|
30
|
-
u: request.url.toString().replace(
|
|
31
|
-
b:
|
|
32
|
-
h: Object.keys(
|
|
28
|
+
u: request.url.toString().replace(SHORTABLE_ORIGIN_MATCHER, "/"),
|
|
29
|
+
b: request.body,
|
|
30
|
+
h: Object.keys(request.headers).length > 0 ? request.headers : void 0,
|
|
33
31
|
m: request.method === "POST" ? void 0 : request.method
|
|
34
32
|
};
|
|
35
|
-
|
|
33
|
+
return {
|
|
36
34
|
i: id,
|
|
37
35
|
p: serializedPayload
|
|
38
36
|
};
|
|
39
|
-
if (processedBody instanceof Blob) {
|
|
40
|
-
return encodeRawMessage(baseMessage, processedBody);
|
|
41
|
-
}
|
|
42
|
-
return encodeRawMessage(baseMessage);
|
|
43
37
|
}
|
|
44
|
-
|
|
45
|
-
const { json: message, buffer } = await decodeRawMessage(raw);
|
|
38
|
+
function deserializeRequestMessage(message) {
|
|
46
39
|
const id = message.i;
|
|
47
|
-
const type = message.t
|
|
40
|
+
const type = message.t ?? 1 /* REQUEST */;
|
|
48
41
|
if (type === 3 /* EVENT_ITERATOR */) {
|
|
49
42
|
const payload2 = message.p;
|
|
50
43
|
return [id, type, { event: payload2.e, data: payload2.d, meta: payload2.m }];
|
|
@@ -53,11 +46,14 @@ async function decodeRequestMessage(raw) {
|
|
|
53
46
|
return [id, type, message.p];
|
|
54
47
|
}
|
|
55
48
|
const payload = message.p;
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
49
|
+
return [id, 1 /* REQUEST */, {
|
|
50
|
+
url: payload.u.startsWith("/") ? new URL(`${SHORTABLE_ORIGIN}${payload.u}`) : new URL(payload.u),
|
|
51
|
+
headers: payload.h ?? {},
|
|
52
|
+
method: payload.m ?? "POST",
|
|
53
|
+
body: payload.b
|
|
54
|
+
}];
|
|
59
55
|
}
|
|
60
|
-
|
|
56
|
+
function serializeResponseMessage(id, type, payload) {
|
|
61
57
|
if (type === 3 /* EVENT_ITERATOR */) {
|
|
62
58
|
const eventPayload = payload;
|
|
63
59
|
const serializedPayload2 = {
|
|
@@ -65,32 +61,23 @@ async function encodeResponseMessage(id, type, payload) {
|
|
|
65
61
|
d: eventPayload.data,
|
|
66
62
|
m: eventPayload.meta
|
|
67
63
|
};
|
|
68
|
-
return
|
|
64
|
+
return { i: id, t: type, p: serializedPayload2 };
|
|
69
65
|
}
|
|
70
66
|
if (type === 4 /* ABORT_SIGNAL */) {
|
|
71
|
-
return
|
|
67
|
+
return { i: id, t: type, p: void 0 };
|
|
72
68
|
}
|
|
73
69
|
const response = payload;
|
|
74
|
-
const { body: processedBody, headers: processedHeaders } = await serializeBodyAndHeaders(
|
|
75
|
-
response.body,
|
|
76
|
-
response.headers
|
|
77
|
-
);
|
|
78
70
|
const serializedPayload = {
|
|
79
71
|
s: response.status === 200 ? void 0 : response.status,
|
|
80
|
-
h: Object.keys(
|
|
81
|
-
b:
|
|
72
|
+
h: Object.keys(response.headers).length > 0 ? response.headers : void 0,
|
|
73
|
+
b: response.body
|
|
82
74
|
};
|
|
83
|
-
|
|
75
|
+
return {
|
|
84
76
|
i: id,
|
|
85
77
|
p: serializedPayload
|
|
86
78
|
};
|
|
87
|
-
if (processedBody instanceof Blob) {
|
|
88
|
-
return encodeRawMessage(baseMessage, processedBody);
|
|
89
|
-
}
|
|
90
|
-
return encodeRawMessage(baseMessage);
|
|
91
79
|
}
|
|
92
|
-
|
|
93
|
-
const { json: message, buffer } = await decodeRawMessage(raw);
|
|
80
|
+
function deserializeResponseMessage(message) {
|
|
94
81
|
const id = message.i;
|
|
95
82
|
const type = message.t;
|
|
96
83
|
if (type === 3 /* EVENT_ITERATOR */) {
|
|
@@ -101,9 +88,71 @@ async function decodeResponseMessage(raw) {
|
|
|
101
88
|
return [id, type, message.p];
|
|
102
89
|
}
|
|
103
90
|
const payload = message.p;
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
91
|
+
return [id, 2 /* RESPONSE */, {
|
|
92
|
+
status: payload.s ?? 200,
|
|
93
|
+
headers: payload.h ?? {},
|
|
94
|
+
body: payload.b
|
|
95
|
+
}];
|
|
96
|
+
}
|
|
97
|
+
async function encodeRequestMessage(id, type, payload) {
|
|
98
|
+
if (type === 3 /* EVENT_ITERATOR */ || type === 4 /* ABORT_SIGNAL */) {
|
|
99
|
+
return encodeRawMessage(serializeRequestMessage(id, type, payload));
|
|
100
|
+
}
|
|
101
|
+
const request = payload;
|
|
102
|
+
const { body: processedBody, headers: processedHeaders } = await serializeBodyAndHeaders(
|
|
103
|
+
request.body,
|
|
104
|
+
request.headers
|
|
105
|
+
);
|
|
106
|
+
const modifiedRequest = {
|
|
107
|
+
...request,
|
|
108
|
+
body: processedBody instanceof Blob ? void 0 : processedBody,
|
|
109
|
+
headers: processedHeaders
|
|
110
|
+
};
|
|
111
|
+
const baseMessage = serializeRequestMessage(id, 1 /* REQUEST */, modifiedRequest);
|
|
112
|
+
if (processedBody instanceof Blob) {
|
|
113
|
+
return encodeRawMessage(baseMessage, processedBody);
|
|
114
|
+
}
|
|
115
|
+
return encodeRawMessage(baseMessage);
|
|
116
|
+
}
|
|
117
|
+
async function decodeRequestMessage(raw) {
|
|
118
|
+
const { json: message, buffer } = await decodeRawMessage(raw);
|
|
119
|
+
const [id, type, payload] = deserializeRequestMessage(message);
|
|
120
|
+
if (type === 3 /* EVENT_ITERATOR */ || type === 4 /* ABORT_SIGNAL */) {
|
|
121
|
+
return [id, type, payload];
|
|
122
|
+
}
|
|
123
|
+
const request = payload;
|
|
124
|
+
const body = await deserializeBody(request.headers, request.body, buffer);
|
|
125
|
+
return [id, type, { ...request, body }];
|
|
126
|
+
}
|
|
127
|
+
async function encodeResponseMessage(id, type, payload) {
|
|
128
|
+
if (type === 3 /* EVENT_ITERATOR */ || type === 4 /* ABORT_SIGNAL */) {
|
|
129
|
+
return encodeRawMessage(serializeResponseMessage(id, type, payload));
|
|
130
|
+
}
|
|
131
|
+
const response = payload;
|
|
132
|
+
const { body: processedBody, headers: processedHeaders } = await serializeBodyAndHeaders(
|
|
133
|
+
response.body,
|
|
134
|
+
response.headers
|
|
135
|
+
);
|
|
136
|
+
const modifiedResponse = {
|
|
137
|
+
...response,
|
|
138
|
+
body: processedBody instanceof Blob ? void 0 : processedBody,
|
|
139
|
+
headers: processedHeaders
|
|
140
|
+
};
|
|
141
|
+
const baseMessage = serializeResponseMessage(id, 2 /* RESPONSE */, modifiedResponse);
|
|
142
|
+
if (processedBody instanceof Blob) {
|
|
143
|
+
return encodeRawMessage(baseMessage, processedBody);
|
|
144
|
+
}
|
|
145
|
+
return encodeRawMessage(baseMessage);
|
|
146
|
+
}
|
|
147
|
+
async function decodeResponseMessage(raw) {
|
|
148
|
+
const { json: message, buffer } = await decodeRawMessage(raw);
|
|
149
|
+
const [id, type, payload] = deserializeResponseMessage(message);
|
|
150
|
+
if (type === 3 /* EVENT_ITERATOR */ || type === 4 /* ABORT_SIGNAL */) {
|
|
151
|
+
return [id, type, payload];
|
|
152
|
+
}
|
|
153
|
+
const response = payload;
|
|
154
|
+
const body = await deserializeBody(response.headers, response.body, buffer);
|
|
155
|
+
return [id, type, { ...response, body }];
|
|
107
156
|
}
|
|
108
157
|
async function serializeBodyAndHeaders(body, originalHeaders) {
|
|
109
158
|
const headers = { ...originalHeaders };
|
|
@@ -294,6 +343,29 @@ function resolveEventIterator(iterator, callback) {
|
|
|
294
343
|
}
|
|
295
344
|
|
|
296
345
|
class ClientPeer {
|
|
346
|
+
peer;
|
|
347
|
+
constructor(send) {
|
|
348
|
+
this.peer = new experimental_ClientPeerWithoutCodec(async ([id, type, payload]) => {
|
|
349
|
+
await send(await encodeRequestMessage(id, type, payload));
|
|
350
|
+
});
|
|
351
|
+
}
|
|
352
|
+
get length() {
|
|
353
|
+
return this.peer.length;
|
|
354
|
+
}
|
|
355
|
+
open(id) {
|
|
356
|
+
return this.peer.open(id);
|
|
357
|
+
}
|
|
358
|
+
async request(request) {
|
|
359
|
+
return this.peer.request(request);
|
|
360
|
+
}
|
|
361
|
+
async message(raw) {
|
|
362
|
+
return this.peer.message(await decodeResponseMessage(raw));
|
|
363
|
+
}
|
|
364
|
+
close(options = {}) {
|
|
365
|
+
return this.peer.close(options);
|
|
366
|
+
}
|
|
367
|
+
}
|
|
368
|
+
class experimental_ClientPeerWithoutCodec {
|
|
297
369
|
idGenerator = new SequentialIdGenerator();
|
|
298
370
|
/**
|
|
299
371
|
* Queue of responses sent from server, awaiting consumption
|
|
@@ -313,11 +385,12 @@ class ClientPeer {
|
|
|
313
385
|
cleanupFns = /* @__PURE__ */ new Map();
|
|
314
386
|
send;
|
|
315
387
|
constructor(send) {
|
|
316
|
-
this.send = async (
|
|
388
|
+
this.send = async (message) => {
|
|
389
|
+
const id = message[0];
|
|
317
390
|
if (this.serverControllers.has(id)) {
|
|
318
|
-
await send(
|
|
391
|
+
await send(message);
|
|
319
392
|
}
|
|
320
|
-
}
|
|
393
|
+
};
|
|
321
394
|
}
|
|
322
395
|
get length() {
|
|
323
396
|
return (+this.responseQueue.length + this.serverEventIteratorQueue.length + this.serverControllers.size + this.cleanupFns.size) / 4;
|
|
@@ -347,14 +420,14 @@ class ClientPeer {
|
|
|
347
420
|
otelConfig.propagation.inject(otelConfig.context.active(), headers);
|
|
348
421
|
request = { ...request, headers };
|
|
349
422
|
}
|
|
350
|
-
await this.send(id, MessageType.REQUEST, request);
|
|
423
|
+
await this.send([id, MessageType.REQUEST, request]);
|
|
351
424
|
if (signal?.aborted) {
|
|
352
|
-
await this.send(id, MessageType.ABORT_SIGNAL, void 0);
|
|
425
|
+
await this.send([id, MessageType.ABORT_SIGNAL, void 0]);
|
|
353
426
|
throw signal.reason;
|
|
354
427
|
}
|
|
355
428
|
let abortListener;
|
|
356
429
|
signal?.addEventListener("abort", abortListener = async () => {
|
|
357
|
-
await this.send(id, MessageType.ABORT_SIGNAL, void 0);
|
|
430
|
+
await this.send([id, MessageType.ABORT_SIGNAL, void 0]);
|
|
358
431
|
this.close({ id, reason: signal.reason });
|
|
359
432
|
}, { once: true });
|
|
360
433
|
this.cleanupFns.get(id)?.push(() => {
|
|
@@ -366,7 +439,7 @@ class ClientPeer {
|
|
|
366
439
|
if (serverController.signal.aborted) {
|
|
367
440
|
return "abort";
|
|
368
441
|
}
|
|
369
|
-
await this.send(id, MessageType.EVENT_ITERATOR, payload);
|
|
442
|
+
await this.send([id, MessageType.EVENT_ITERATOR, payload]);
|
|
370
443
|
return "next";
|
|
371
444
|
});
|
|
372
445
|
}
|
|
@@ -378,7 +451,7 @@ class ClientPeer {
|
|
|
378
451
|
async (reason) => {
|
|
379
452
|
try {
|
|
380
453
|
if (reason !== "next") {
|
|
381
|
-
await this.send(id, MessageType.ABORT_SIGNAL, void 0);
|
|
454
|
+
await this.send([id, MessageType.ABORT_SIGNAL, void 0]);
|
|
382
455
|
}
|
|
383
456
|
} finally {
|
|
384
457
|
this.close({ id });
|
|
@@ -400,8 +473,7 @@ class ClientPeer {
|
|
|
400
473
|
}
|
|
401
474
|
);
|
|
402
475
|
}
|
|
403
|
-
async message(
|
|
404
|
-
const [id, type, payload] = await decodeResponseMessage(raw);
|
|
476
|
+
async message([id, type, payload]) {
|
|
405
477
|
if (type === MessageType.ABORT_SIGNAL) {
|
|
406
478
|
this.serverControllers.get(id)?.abort();
|
|
407
479
|
return;
|
|
@@ -435,6 +507,35 @@ class ClientPeer {
|
|
|
435
507
|
}
|
|
436
508
|
|
|
437
509
|
class ServerPeer {
|
|
510
|
+
peer;
|
|
511
|
+
constructor(send) {
|
|
512
|
+
this.peer = new experimental_ServerPeerWithoutCodec(async ([id, type, payload]) => {
|
|
513
|
+
await send(await encodeResponseMessage(id, type, payload));
|
|
514
|
+
});
|
|
515
|
+
}
|
|
516
|
+
get length() {
|
|
517
|
+
return this.peer.length;
|
|
518
|
+
}
|
|
519
|
+
open(id) {
|
|
520
|
+
return this.peer.open(id);
|
|
521
|
+
}
|
|
522
|
+
/**
|
|
523
|
+
* @todo This method will return Promise<void> in the next major version.
|
|
524
|
+
*/
|
|
525
|
+
async message(raw, handleRequest) {
|
|
526
|
+
return this.peer.message(await decodeRequestMessage(raw), handleRequest);
|
|
527
|
+
}
|
|
528
|
+
/**
|
|
529
|
+
* @deprecated Please pass the `handleRequest` (second arg) function to the `message` method instead.
|
|
530
|
+
*/
|
|
531
|
+
async response(id, response) {
|
|
532
|
+
return this.peer.response(id, response);
|
|
533
|
+
}
|
|
534
|
+
close({ abort = true, ...options } = {}) {
|
|
535
|
+
return this.peer.close({ ...options, abort });
|
|
536
|
+
}
|
|
537
|
+
}
|
|
538
|
+
class experimental_ServerPeerWithoutCodec {
|
|
438
539
|
/**
|
|
439
540
|
* Queue of event iterator messages sent from client, awaiting consumption
|
|
440
541
|
*/
|
|
@@ -445,11 +546,12 @@ class ServerPeer {
|
|
|
445
546
|
clientControllers = /* @__PURE__ */ new Map();
|
|
446
547
|
send;
|
|
447
548
|
constructor(send) {
|
|
448
|
-
this.send =
|
|
549
|
+
this.send = async (message) => {
|
|
550
|
+
const id = message[0];
|
|
449
551
|
if (this.clientControllers.has(id)) {
|
|
450
|
-
await send(
|
|
552
|
+
await send(message);
|
|
451
553
|
}
|
|
452
|
-
}
|
|
554
|
+
};
|
|
453
555
|
}
|
|
454
556
|
get length() {
|
|
455
557
|
return (this.clientEventIteratorQueue.length + this.clientControllers.size) / 2;
|
|
@@ -463,8 +565,7 @@ class ServerPeer {
|
|
|
463
565
|
/**
|
|
464
566
|
* @todo This method will return Promise<void> in the next major version.
|
|
465
567
|
*/
|
|
466
|
-
async message(
|
|
467
|
-
const [id, type, payload] = await decodeRequestMessage(raw);
|
|
568
|
+
async message([id, type, payload], handleRequest) {
|
|
468
569
|
if (type === MessageType.ABORT_SIGNAL) {
|
|
469
570
|
this.close({ id, reason: new AbortError("Client aborted the request") });
|
|
470
571
|
return [id, void 0];
|
|
@@ -475,6 +576,9 @@ class ServerPeer {
|
|
|
475
576
|
}
|
|
476
577
|
return [id, void 0];
|
|
477
578
|
}
|
|
579
|
+
if (this.clientControllers.has(id)) {
|
|
580
|
+
return [id, void 0];
|
|
581
|
+
}
|
|
478
582
|
const clientController = this.open(id);
|
|
479
583
|
const signal = clientController.signal;
|
|
480
584
|
const request = {
|
|
@@ -485,7 +589,7 @@ class ServerPeer {
|
|
|
485
589
|
id,
|
|
486
590
|
async (reason) => {
|
|
487
591
|
if (reason !== "next") {
|
|
488
|
-
await this.send(id, MessageType.ABORT_SIGNAL, void 0);
|
|
592
|
+
await this.send([id, MessageType.ABORT_SIGNAL, void 0]);
|
|
489
593
|
}
|
|
490
594
|
},
|
|
491
595
|
{ signal }
|
|
@@ -529,7 +633,7 @@ class ServerPeer {
|
|
|
529
633
|
return;
|
|
530
634
|
}
|
|
531
635
|
try {
|
|
532
|
-
await this.send(id, MessageType.RESPONSE, response);
|
|
636
|
+
await this.send([id, MessageType.RESPONSE, response]);
|
|
533
637
|
if (!signal.aborted && isAsyncIteratorObject(response.body)) {
|
|
534
638
|
if (response.body instanceof HibernationEventIterator) {
|
|
535
639
|
response.body.hibernationCallback?.(id);
|
|
@@ -539,7 +643,7 @@ class ServerPeer {
|
|
|
539
643
|
if (signal.aborted) {
|
|
540
644
|
return "abort";
|
|
541
645
|
}
|
|
542
|
-
await this.send(id, MessageType.EVENT_ITERATOR, payload);
|
|
646
|
+
await this.send([id, MessageType.EVENT_ITERATOR, payload]);
|
|
543
647
|
return "next";
|
|
544
648
|
});
|
|
545
649
|
}
|
|
@@ -566,4 +670,4 @@ class ServerPeer {
|
|
|
566
670
|
}
|
|
567
671
|
}
|
|
568
672
|
|
|
569
|
-
export { ClientPeer, MessageType, ServerPeer, decodeRequestMessage, decodeResponseMessage, encodeRequestMessage, encodeResponseMessage, resolveEventIterator, toEventIterator };
|
|
673
|
+
export { ClientPeer, MessageType, ServerPeer, decodeRequestMessage, decodeResponseMessage, deserializeRequestMessage, deserializeResponseMessage, encodeRequestMessage, encodeResponseMessage, experimental_ClientPeerWithoutCodec, experimental_ServerPeerWithoutCodec, resolveEventIterator, serializeRequestMessage, serializeResponseMessage, toEventIterator };
|
package/package.json
CHANGED
|
@@ -1,12 +1,12 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@orpc/standard-server-peer",
|
|
3
3
|
"type": "module",
|
|
4
|
-
"version": "0.0.0-next.
|
|
4
|
+
"version": "0.0.0-next.a45fc95",
|
|
5
5
|
"license": "MIT",
|
|
6
|
-
"homepage": "https://
|
|
6
|
+
"homepage": "https://orpc.com",
|
|
7
7
|
"repository": {
|
|
8
8
|
"type": "git",
|
|
9
|
-
"url": "git+https://github.com/
|
|
9
|
+
"url": "git+https://github.com/middleapi/orpc.git",
|
|
10
10
|
"directory": "packages/standard-server-peer"
|
|
11
11
|
},
|
|
12
12
|
"keywords": [
|
|
@@ -23,8 +23,8 @@
|
|
|
23
23
|
"dist"
|
|
24
24
|
],
|
|
25
25
|
"dependencies": {
|
|
26
|
-
"@orpc/shared": "0.0.0-next.
|
|
27
|
-
"@orpc/standard-server": "0.0.0-next.
|
|
26
|
+
"@orpc/shared": "0.0.0-next.a45fc95",
|
|
27
|
+
"@orpc/standard-server": "0.0.0-next.a45fc95"
|
|
28
28
|
},
|
|
29
29
|
"scripts": {
|
|
30
30
|
"build": "unbuild",
|