Skip to content

Commit

Permalink
Backport AbortSignal feature from cohere.ai (#9)
Browse files Browse the repository at this point in the history
* Backport AbortSignal feature from cohere.ai fork

Credits:
- @kipply
- @udameli
- @wujessica
- @1vn
- @robertkozin

cohere-ai/webrpc#1
cohere-ai/webrpc#3
cohere-ai/webrpc#20

---

AbortSignal docs:

https://developer.mozilla.org/en-US/docs/Web/API/AbortSignal

---

Example:

  const controller = new AbortController();
  const signal = controller.signal;

  setTimeout(() => controller.abort(), 5000);

  const { user } = await rpc.GetUser({ userId }, null, signal);

* AbortSignal is already in Fetch's RequestInit argument

* Fix TypeScript error TS2304: Cannot find name 'AbortSignal'

  server.gen.ts:41:57 - error TS2304: Cannot find name 'AbortSignal'

Add "DOM" to compilerOptions.lib in your tsconfig.json file.
  • Loading branch information
VojtechVitek authored Jul 19, 2023
1 parent f50891a commit 38f5b96
Show file tree
Hide file tree
Showing 6 changed files with 21 additions and 19 deletions.
4 changes: 2 additions & 2 deletions _examples/node-ts/server/server.gen.ts
Original file line number Diff line number Diff line change
Expand Up @@ -37,8 +37,8 @@ export interface Page {
}

export interface ExampleService {
ping(headers?: object): Promise<PingReturn>
getUser(args: GetUserArgs, headers?: object): Promise<GetUserReturn>
ping(headers?: object, signal?: AbortSignal): Promise<PingReturn>
getUser(args: GetUserArgs, headers?: object, signal?: AbortSignal): Promise<GetUserReturn>
}

export interface PingArgs {
Expand Down
3 changes: 2 additions & 1 deletion _examples/node-ts/server/tsconfig.json
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,8 @@
"target": "es5" /* Specify ECMAScript target version: 'ES3' (default), 'ES5', 'ES2015', 'ES2016', 'ES2017','ES2018' or 'ESNEXT'. */,
"module": "commonjs" /* Specify module code generation: 'none', 'commonjs', 'amd', 'system', 'umd', 'es2015', or 'ESNext'. */,
"lib": [
"es2016"
"es2016",
"DOM"
] /* Specify library files to be included in the compilation. */,
// "allowJs": true, /* Allow javascript files to be compiled. */
// "checkJs": true, /* Report errors in .js files. */
Expand Down
20 changes: 10 additions & 10 deletions _examples/node-ts/webapp/client.gen.ts
Original file line number Diff line number Diff line change
Expand Up @@ -37,8 +37,8 @@ export interface Page {
}

export interface ExampleService {
ping(headers?: object): Promise<PingReturn>
getUser(args: GetUserArgs, headers?: object): Promise<GetUserReturn>
ping(headers?: object, signal?: AbortSignal): Promise<PingReturn>
getUser(args: GetUserArgs, headers?: object, signal?: AbortSignal): Promise<GetUserReturn>
}

export interface PingArgs {
Expand Down Expand Up @@ -74,11 +74,11 @@ export class ExampleService implements ExampleService {
return this.hostname + this.path + name
}

ping = (headers?: object): Promise<PingReturn> => {
ping = (headers?: object, signal?: AbortSignal): Promise<PingReturn> => {
return this.fetch(
this.url('Ping'),
createHTTPRequest({}, headers)
).then((res) => {
createHTTPRequest({}, headers, signal)
).then((res) => {
return buildResponse(res).then(_data => {
return {}
})
Expand All @@ -87,11 +87,10 @@ export class ExampleService implements ExampleService {
})
}

getUser = (args: GetUserArgs, headers?: object): Promise<GetUserReturn> => {
getUser = (args: GetUserArgs, headers?: object, signal?: AbortSignal): Promise<GetUserReturn> => {
return this.fetch(
this.url('GetUser'),
createHTTPRequest(args, headers)
).then((res) => {
createHTTPRequest(args, headers, signal)).then((res) => {
return buildResponse(res).then(_data => {
return {
code: <number>(_data.code),
Expand All @@ -105,11 +104,12 @@ export class ExampleService implements ExampleService {

}

const createHTTPRequest = (body: object = {}, headers: object = {}): object => {
const createHTTPRequest = (body: object = {}, headers: object = {}, signal: AbortSignal | null = null): object => {
return {
method: 'POST',
headers: { ...headers, 'Content-Type': 'application/json' },
body: JSON.stringify(body || {})
body: JSON.stringify(body || {}),
signal
}
}

Expand Down
6 changes: 3 additions & 3 deletions client.go.tmpl
Original file line number Diff line number Diff line change
Expand Up @@ -26,10 +26,10 @@ export class {{.Name}} implements {{.Name}} {
return this.fetch(
this.url('{{.Name}}'),
{{- if .Inputs | len}}
createHTTPRequest(args, headers)
createHTTPRequest(args, headers, signal)
{{- else}}
createHTTPRequest({}, headers)
{{- end}}
createHTTPRequest({}, headers, signal)
{{end -}}
).then((res) => {
return buildResponse(res).then(_data => {
return {
Expand Down
5 changes: 3 additions & 2 deletions clientHelpers.go.tmpl
Original file line number Diff line number Diff line change
Expand Up @@ -2,11 +2,12 @@
{{- $webrpcErrors := .WebrpcErrors -}}
{{- $schemaErrors := .SchemaErrors -}}

const createHTTPRequest = (body: object = {}, headers: object = {}): object => {
const createHTTPRequest = (body: object = {}, headers: object = {}, signal: AbortSignal | null = null): object => {
return {
method: 'POST',
headers: { ...headers, 'Content-Type': 'application/json' },
body: JSON.stringify(body || {})
body: JSON.stringify(body || {}),
signal
}
}

Expand Down
2 changes: 1 addition & 1 deletion methodInputs.go.tmpl
Original file line number Diff line number Diff line change
Expand Up @@ -3,5 +3,5 @@
{{- $method := .Method -}}
{{- $typeMap := .TypeMap -}}

{{if gt (len $method.Inputs) 0}}args: {{$method.Name}}Args, {{end}}headers?: object
{{if gt (len $method.Inputs) 0}}args: {{$method.Name}}Args, {{end}}headers?: object, signal?: AbortSignal
{{- end -}}

0 comments on commit 38f5b96

Please sign in to comment.