@neuralinnovations/dataisland-sdk 0.0.1-dev2 → 0.0.1-dev4

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (64) hide show
  1. package/.editorconfig +4 -1
  2. package/.eslintrc.json +1 -1
  3. package/README.md +91 -2
  4. package/jest.config.ts +3 -3
  5. package/jest.setup.ts +2 -2
  6. package/package.json +3 -2
  7. package/src/appBuilder.ts +6 -6
  8. package/src/appSdk.ts +6 -6
  9. package/src/commands/startCommandHandler.ts +2 -2
  10. package/src/context.ts +3 -3
  11. package/src/credentials.ts +29 -7
  12. package/src/disposable.ts +3 -4
  13. package/src/dto/accessGroupResponse.ts +35 -0
  14. package/src/dto/chatResponse.ts +104 -0
  15. package/src/dto/userInfoResponse.ts +11 -1
  16. package/src/dto/workspacesResponse.ts +49 -0
  17. package/src/events.ts +13 -13
  18. package/src/index.ts +24 -12
  19. package/src/internal/app.impl.ts +25 -28
  20. package/src/internal/appBuilder.impl.ts +16 -16
  21. package/src/internal/createApp.impl.ts +3 -3
  22. package/src/services/commandService.ts +3 -3
  23. package/src/services/credentialService.ts +3 -3
  24. package/src/services/middlewareService.ts +4 -4
  25. package/src/services/organizationService.ts +18 -116
  26. package/src/services/requestBuilder.ts +40 -15
  27. package/src/services/responseUtils.ts +32 -0
  28. package/src/services/rpcService.ts +28 -11
  29. package/src/services/service.ts +10 -8
  30. package/src/services/userProfileService.ts +18 -66
  31. package/src/storages/chat.ts +21 -0
  32. package/src/storages/chats.ts +17 -0
  33. package/src/storages/file.impl.ts +69 -0
  34. package/src/storages/file.ts +28 -0
  35. package/src/storages/files.impl.ts +213 -0
  36. package/src/storages/files.ts +38 -0
  37. package/src/storages/filesPage.ts +27 -0
  38. package/src/storages/groups.impl.ts +337 -0
  39. package/src/storages/groups.ts +43 -0
  40. package/src/storages/organization.impl.ts +68 -0
  41. package/src/storages/organization.ts +33 -0
  42. package/src/storages/organizations.impl.ts +191 -0
  43. package/src/storages/organizations.ts +8 -28
  44. package/src/storages/userProfile.impl.ts +56 -0
  45. package/src/storages/userProfile.ts +2 -2
  46. package/src/storages/workspace.impl.ts +109 -0
  47. package/src/storages/workspace.ts +49 -0
  48. package/src/storages/workspaces.impl.ts +212 -0
  49. package/src/storages/workspaces.ts +53 -0
  50. package/test/commands.test.ts +8 -8
  51. package/test/data/test_file.pdf +0 -0
  52. package/test/disposable.test.ts +3 -3
  53. package/test/events.test.ts +4 -4
  54. package/test/files.test.ts +52 -0
  55. package/test/index.test.ts +42 -83
  56. package/test/organization.test.ts +57 -0
  57. package/test/registry.test.ts +8 -8
  58. package/test/services.test.ts +15 -15
  59. package/test/setup.ts +52 -0
  60. package/test/unitTest.test.ts +2 -2
  61. package/test/workspace.test.ts +71 -0
  62. package/src/services/organizationImpl.ts +0 -51
  63. package/src/services/organizationsImpl.ts +0 -55
  64. package/src/types.ts +0 -86
@@ -1,25 +1,25 @@
1
- import { DEFAULT_HOST } from '../index'
2
- import { type AppBuilder } from '../appBuilder'
3
- import { AppBuilderImplementation } from './appBuilder.impl'
4
- import { type Constructor, Registry } from './registry'
5
- import { Context } from '../context'
6
- import { DisposableContainer, type Lifetime } from '../disposable'
7
- import { type Service, ServiceContext } from '../services/service'
8
- import { CredentialService } from '../services/credentialService'
9
- import { MiddlewareService } from '../services/middlewareService'
10
- import { type CredentialBase } from '../credentials'
11
- import { AppSdk } from '../appSdk'
12
- import { RpcService } from '../services/rpcService'
13
- import { CommandService } from '../services/commandService'
1
+ import { DEFAULT_HOST } from "../index"
2
+ import { type AppBuilder } from "../appBuilder"
3
+ import { AppBuilderImplementation } from "./appBuilder.impl"
4
+ import { type Constructor, Registry } from "./registry"
5
+ import { Context } from "../context"
6
+ import { DisposableContainer, type Lifetime } from "../disposable"
7
+ import { type Service, ServiceContext } from "../services/service"
8
+ import { CredentialService } from "../services/credentialService"
9
+ import { MiddlewareService } from "../services/middlewareService"
10
+ import { type CredentialBase } from "../credentials"
11
+ import { AppSdk } from "../appSdk"
12
+ import { RpcService } from "../services/rpcService"
13
+ import { CommandService } from "../services/commandService"
14
14
  import {
15
15
  StartCommandHandler,
16
16
  StartCommand
17
- } from '../commands/startCommandHandler'
18
- import { UserProfileService } from '../services/userProfileService'
19
- import { OrganizationService } from '../services/organizationService'
20
- import { Organizations } from '../storages/organizations'
21
- import { UserProfile } from '../storages/userProfile'
22
- import { isUnitTest, UnitTest } from '../unitTest'
17
+ } from "../commands/startCommandHandler"
18
+ import { UserProfileService } from "../services/userProfileService"
19
+ import { OrganizationService } from "../services/organizationService"
20
+ import { Organizations } from "../storages/organizations"
21
+ import { UserProfile } from "../storages/userProfile"
22
+ import { isUnitTest, UnitTest } from "../unitTest"
23
23
 
24
24
  export class AppImplementation extends AppSdk {
25
25
  readonly name: string
@@ -104,13 +104,6 @@ export class AppImplementation extends AppSdk {
104
104
  return new OrganizationService(context)
105
105
  })
106
106
 
107
- // register middlewares
108
- builder.registerMiddleware(async (req, next) => {
109
- req.headers.set('accept', 'text/plain')
110
- req.headers.set('content-type', 'application/json')
111
- return await next(req)
112
- })
113
-
114
107
  // call customer setup
115
108
  if (setup !== undefined) {
116
109
  await setup(builder)
@@ -154,7 +147,9 @@ export class AppImplementation extends AppSdk {
154
147
  const waitList: Array<Promise<void>> = []
155
148
  // call onRegister service's callback
156
149
  services.forEach(([serviceContext]) => {
157
- waitList.push(serviceContext.onRegister())
150
+ if (typeof serviceContext.onRegister === "function") {
151
+ waitList.push(serviceContext.onRegister())
152
+ }
158
153
  })
159
154
 
160
155
  // wait for all services to register
@@ -167,7 +162,9 @@ export class AppImplementation extends AppSdk {
167
162
  waitList.length = 0
168
163
  // call onStart service's callback
169
164
  services.forEach(([serviceContext]) => {
170
- waitList.push(serviceContext.onStart())
165
+ if (typeof serviceContext.onStart === "function") {
166
+ waitList.push(serviceContext.onStart())
167
+ }
171
168
  })
172
169
 
173
170
  // wait for all services to start
@@ -1,12 +1,12 @@
1
- import { AppBuilder } from '../appBuilder'
2
- import { DEFAULT_HOST } from '../index'
3
- import { type CredentialBase, DefaultCredential } from '../credentials'
4
- import type { Middleware } from '../middleware'
5
- import { type Service, type ServiceContext } from '../services/service'
6
- import { type Constructor } from './registry'
7
- import { Command, CommandHandler } from '../services/commandService'
8
- import { Context } from '../context'
9
- import { UnitTest } from '../unitTest'
1
+ import { AppBuilder } from "../appBuilder"
2
+ import { DEFAULT_HOST } from "../index"
3
+ import { type CredentialBase, DefaultCredential } from "../credentials"
4
+ import type { Middleware } from "../middleware"
5
+ import { type Service, type ServiceContext } from "../services/service"
6
+ import { type Constructor } from "./registry"
7
+ import { Command, CommandHandler } from "../services/commandService"
8
+ import { Context } from "../context"
9
+ import { UnitTest } from "../unitTest"
10
10
 
11
11
  export class AppBuilderImplementation extends AppBuilder {
12
12
  envData: Record<string, any> = {
@@ -33,7 +33,7 @@ export class AppBuilderImplementation extends AppBuilder {
33
33
  useAutomaticDataCollectionEnabled(value: boolean): AppBuilder {
34
34
  if (value === undefined || value === null) {
35
35
  throw new Error(
36
- 'useAutomaticDataCollectionEnabled, value is undefined|null'
36
+ "useAutomaticDataCollectionEnabled, value is undefined|null"
37
37
  )
38
38
  }
39
39
  this.automaticDataCollectionEnabled = value
@@ -42,7 +42,7 @@ export class AppBuilderImplementation extends AppBuilder {
42
42
 
43
43
  useCredential(credential: CredentialBase): AppBuilder {
44
44
  if (credential === undefined || credential === null) {
45
- throw new Error('useCredential, credential is undefined|null')
45
+ throw new Error("useCredential, credential is undefined|null")
46
46
  }
47
47
  this.credential = credential
48
48
  return this
@@ -50,7 +50,7 @@ export class AppBuilderImplementation extends AppBuilder {
50
50
 
51
51
  registerMiddleware(middleware: Middleware): AppBuilder {
52
52
  if (middleware === undefined || middleware === null) {
53
- throw new Error('addMiddleware, middleware is undefined|null')
53
+ throw new Error("addMiddleware, middleware is undefined|null")
54
54
  }
55
55
  this.middlewares.push(middleware)
56
56
  return this
@@ -61,10 +61,10 @@ export class AppBuilderImplementation extends AppBuilder {
61
61
  factory: (context: ServiceContext) => T
62
62
  ): AppBuilder {
63
63
  if (type === undefined || type === null) {
64
- throw new Error('registerService, type is undefined|null')
64
+ throw new Error("registerService, type is undefined|null")
65
65
  }
66
66
  if (factory === undefined || factory === null) {
67
- throw new Error('registerService, factory is undefined|null')
67
+ throw new Error("registerService, factory is undefined|null")
68
68
  }
69
69
  this.services.push([type, factory])
70
70
  return this
@@ -75,10 +75,10 @@ export class AppBuilderImplementation extends AppBuilder {
75
75
  commandFactory: (context: Context) => CommandHandler<T>
76
76
  ): AppBuilder {
77
77
  if (messageType === undefined || messageType === null) {
78
- throw new Error('registerCommand, messageType is undefined|null')
78
+ throw new Error("registerCommand, messageType is undefined|null")
79
79
  }
80
80
  if (commandFactory === undefined || commandFactory === null) {
81
- throw new Error('registerCommand, commandFactory is undefined|null')
81
+ throw new Error("registerCommand, commandFactory is undefined|null")
82
82
  }
83
83
  this.commands.push([messageType, commandFactory])
84
84
  return this
@@ -1,6 +1,6 @@
1
- import { AppImplementation } from './app.impl'
2
- import { type AppBuilder } from '../appBuilder'
3
- import { AppSdk } from '../appSdk'
1
+ import { AppImplementation } from "./app.impl"
2
+ import { type AppBuilder } from "../appBuilder"
3
+ import { AppSdk } from "../appSdk"
4
4
 
5
5
  export async function _createApp(
6
6
  name: string,
@@ -1,6 +1,6 @@
1
- import { Service } from './service'
2
- import { Context } from '../context'
3
- import { Constructor } from '../internal/registry'
1
+ import { Service } from "./service"
2
+ import { Context } from "../context"
3
+ import { Constructor } from "../internal/registry"
4
4
 
5
5
  export abstract class CommandHandler<T> {
6
6
  constructor(protected readonly context: Context) {}
@@ -1,6 +1,6 @@
1
- import { type CredentialBase } from '../credentials'
2
- import { Service } from './service'
3
- import { type DisposableContainer } from '../disposable'
1
+ import { type CredentialBase } from "../credentials"
2
+ import { Service } from "./service"
3
+ import { type DisposableContainer } from "../disposable"
4
4
 
5
5
  export class CredentialService extends Service {
6
6
  private _credentialDispose?: DisposableContainer = undefined
@@ -1,9 +1,9 @@
1
- import { Service } from './service'
2
- import { type Middleware } from '../middleware'
3
- import { type Disposable } from '../disposable'
1
+ import { Service } from "./service"
2
+ import { type Middleware } from "../middleware"
3
+ import { type Disposable } from "../disposable"
4
4
 
5
5
  export class MiddlewareService extends Service {
6
- _middlewares: Middleware[] = []
6
+ private _middlewares: Middleware[] = []
7
7
 
8
8
  public useMiddleware(middleware: Middleware): Disposable {
9
9
  this._middlewares.push(middleware)
@@ -1,126 +1,28 @@
1
- import { Service } from './service'
2
- import {
3
- OrganizationEvent,
4
- OrganizationId,
5
- Organizations
6
- } from '../storages/organizations'
7
- import { OrganizationDto, UserSettings } from '../dto/userInfoResponse'
8
- import { RpcService } from './rpcService'
9
- import { OrganizationImpl } from './organizationImpl'
10
- import { OrganizationsImpl } from './organizationsImpl'
1
+ import { Service } from "./service"
2
+ import { Organizations } from "../storages/organizations"
3
+ import { OrganizationDto, UserSettings } from "../dto/userInfoResponse"
4
+ import { OrganizationsImpl } from "../storages/organizations.impl"
11
5
 
12
6
  export class OrganizationService extends Service {
13
- private impl: OrganizationsImpl = new OrganizationsImpl(this)
7
+ private _impl?: OrganizationsImpl
8
+
9
+ private get impl(): OrganizationsImpl {
10
+ return this._impl ?? (this._impl = new OrganizationsImpl(this.context))
11
+ }
14
12
 
15
13
  get organizations(): Organizations {
16
14
  return this.impl
17
15
  }
18
16
 
19
- initFrom(
20
- settings: UserSettings,
17
+ async initFrom(
21
18
  adminInOrganization: string[],
22
- organizations: OrganizationDto[]
23
- ) {
24
- this.impl.currentOrganizationId = settings.activeOrganizationId
25
- for (const organization of organizations) {
26
- const org = new OrganizationImpl(this, this.impl).initFrom(
27
- organization,
28
- adminInOrganization.includes(organization.id)
29
- )
30
- // add organization to collection
31
- this.impl.organizations.push(org)
32
-
33
- // dispatch event, organization added
34
- this.impl.dispatch({
35
- type: OrganizationEvent.ADDED,
36
- data: org
37
- })
38
- }
39
- }
40
-
41
- async deleteOrganization(id: OrganizationId): Promise<void> {
42
- if (id === undefined || id === null) {
43
- throw new Error('Organization delete, id is undefined or null')
44
- }
45
- if (id.length === 0 || id.trim().length === 0) {
46
- throw new Error('Organization delete, id is empty')
47
- }
48
- if (!this.impl.contains(id)) {
49
- throw new Error(`Organization delete, id: ${id} is not found`)
50
- }
51
- const response = await this.resolve(RpcService)
52
- ?.requestBuilder('/api/v1/Organizations')
53
- .searchParam('id', id)
54
- .sendDelete()
55
- if (!response?.ok) {
56
- let text: string = ''
57
- try {
58
- text = (await response?.text()) ?? ''
59
- } catch (e) {
60
- console.error(e)
61
- }
62
-
63
- throw new Error(
64
- `Organization delete, response is not ok, status: ${response?.status},${response?.statusText} ${text}`
65
- )
66
- }
67
- const org = <OrganizationImpl>this.impl.get(id)
68
- const index = this.impl.organizations.indexOf(org)
69
- if (index < 0) {
70
- throw new Error('Organization delete, index is not found')
71
- }
72
-
73
- // remove organization from collection
74
- this.impl.organizations.splice(index, 1)
75
-
76
- // dispatch event, organization removed
77
- this.impl.dispatch({
78
- type: OrganizationEvent.REMOVED,
79
- data: org
80
- })
81
-
82
- // dispose organization
83
- org.dispose()
84
- }
85
-
86
- async createOrganization(
87
- name: string,
88
- description: string
89
- ): Promise<OrganizationImpl> {
90
- if (name === undefined || name === null) {
91
- throw new Error('Organization create, name is undefined or null')
92
- }
93
- if (description === undefined || description === null) {
94
- throw new Error('Organization create, description is undefined or null')
95
- }
96
- if (name.length === 0 || name.trim().length === 0) {
97
- throw new Error('Organization create, name is empty')
98
- }
99
- const response = await this.resolve(RpcService)
100
- ?.requestBuilder('api/v1/Organizations')
101
- .sendPost({
102
- profile: {
103
- name: name,
104
- description: description
105
- }
106
- })
107
- if (!response?.ok) {
108
- throw new Error('Organization create, response is not ok')
109
- }
110
- const content = (await response.json())['organization'] as OrganizationDto
111
-
112
- // create organization and init from content
113
- const org = new OrganizationImpl(this, this.impl).initFrom(content, true)
114
-
115
- // add organization to collection
116
- this.impl.organizations.push(org)
117
-
118
- // dispatch event, organization added
119
- this.impl.dispatch({
120
- type: OrganizationEvent.ADDED,
121
- data: org
122
- })
123
-
124
- return org
19
+ organizations: OrganizationDto[],
20
+ settings?: UserSettings | null
21
+ ): Promise<void> {
22
+ await this.impl.internalInitFrom(
23
+ adminInOrganization,
24
+ organizations,
25
+ settings
26
+ )
125
27
  }
126
28
  }
@@ -48,18 +48,42 @@ export class RequestBuilder {
48
48
  return this
49
49
  }
50
50
 
51
- public async sendPost(body?: BodyInit | null | object): Promise<Response> {
51
+ public async sendPostFormData(body: FormData): Promise<Response> {
52
52
  const url = this._url
53
+
54
+ // set search params
53
55
  url.search = this._searchParams.toString()
54
- if (body !== undefined && body !== null && typeof body === 'object') {
55
- body = JSON.stringify(body)
56
+
57
+ // create request
58
+ const req = new Request(url, {
59
+ method: "POST",
60
+ headers: this._headers,
61
+ body
62
+ })
63
+
64
+ // discard content type
65
+ const reqAny = req as any
66
+ reqAny.discardContentType = true
67
+
68
+ return await this._request(
69
+ req
70
+ )
71
+ }
72
+
73
+ public async sendPostJson(body: object | null | undefined): Promise<Response> {
74
+ const url = this._url
75
+ url.search = this._searchParams.toString()
76
+ let json: string | null | undefined = null
77
+ if (body !== undefined && body !== null && typeof body === "object") {
78
+ json = JSON.stringify(body)
56
79
  }
80
+ const request = new Request(url, {
81
+ method: "POST",
82
+ headers: this._headers,
83
+ body: json
84
+ })
57
85
  return await this._request(
58
- new Request(url, {
59
- method: 'POST',
60
- headers: this._headers,
61
- body
62
- })
86
+ request
63
87
  )
64
88
  }
65
89
 
@@ -68,7 +92,7 @@ export class RequestBuilder {
68
92
  url.search = this._searchParams.toString()
69
93
  return await this._request(
70
94
  new Request(url, {
71
- method: 'GET',
95
+ method: "GET",
72
96
  headers: this._headers
73
97
  })
74
98
  )
@@ -79,23 +103,24 @@ export class RequestBuilder {
79
103
  url.search = this._searchParams.toString()
80
104
  return await this._request(
81
105
  new Request(url, {
82
- method: 'DELETE',
106
+ method: "DELETE",
83
107
  headers: this._headers
84
108
  })
85
109
  )
86
110
  }
87
111
 
88
- public async sendPut(body?: BodyInit | null | object): Promise<Response> {
112
+ public async sendPutJson(body: object | null | undefined): Promise<Response> {
89
113
  const url = this._url
90
114
  url.search = this._searchParams.toString()
91
- if (body !== undefined && body !== null && typeof body === 'object') {
92
- body = JSON.stringify(body)
115
+ let json: string | null | undefined = null
116
+ if (body !== undefined && body !== null && typeof body === "object") {
117
+ json = JSON.stringify(body)
93
118
  }
94
119
  return await this._request(
95
120
  new Request(url, {
96
- method: 'PUT',
121
+ method: "PUT",
97
122
  headers: this._headers,
98
- body
123
+ body: json
99
124
  })
100
125
  )
101
126
  }
@@ -0,0 +1,32 @@
1
+ export class ResponseUtils {
2
+ public static isOk(response?: Response | null): boolean {
3
+ return response !== undefined && response !== null && response.ok
4
+ }
5
+
6
+ public static isFail(response?: Response | null): boolean {
7
+ return !ResponseUtils.isOk(response)
8
+ }
9
+
10
+ public static async throwError(
11
+ message: string,
12
+ response: Response | undefined | null
13
+ ): Promise<void> {
14
+ if (response === undefined) {
15
+ throw new Error(`${message}. Response is undefined`)
16
+ }
17
+ if (response === null) {
18
+ throw new Error(`${message}. Response is null`)
19
+ }
20
+ let errorBody: string = ""
21
+ if (response) {
22
+ try {
23
+ errorBody = (await response.text()) ?? ""
24
+ } catch (e) {
25
+ console.error(e)
26
+ }
27
+ }
28
+ throw new Error(
29
+ `${message}. Response fail. Status: ${response?.status},${response?.statusText}, body: ${errorBody}`
30
+ )
31
+ }
32
+ }
@@ -1,6 +1,6 @@
1
- import { Service, type ServiceContext } from './service'
2
- import { MiddlewareService } from './middlewareService'
3
- import { RequestBuilder } from './requestBuilder'
1
+ import { Service, type ServiceContext } from "./service"
2
+ import { MiddlewareService } from "./middlewareService"
3
+ import { RequestBuilder } from "./requestBuilder"
4
4
 
5
5
  /**
6
6
  * Options for the RpcService.
@@ -14,6 +14,7 @@ export interface RequestOptions {
14
14
  * RPC service.
15
15
  */
16
16
  export class RpcService extends Service {
17
+
17
18
  constructor(
18
19
  serviceContext: ServiceContext,
19
20
  /**
@@ -32,6 +33,22 @@ export class RpcService extends Service {
32
33
  }
33
34
  ) {
34
35
  super(serviceContext)
36
+
37
+ serviceContext.onRegister = async () => {
38
+ serviceContext.resolve(MiddlewareService)?.useMiddleware((req, next) => {
39
+ if (!req.headers.has("accept")) {
40
+ req.headers.set("accept", "text/plain")
41
+ }
42
+
43
+ if ((req as any).discardContentType) {
44
+ delete (req as any).discardContentType
45
+ } else {
46
+ req.headers.set("content-type", "application/json")
47
+ }
48
+
49
+ return next(req)
50
+ })
51
+ }
35
52
  }
36
53
 
37
54
  /**
@@ -55,10 +72,10 @@ export class RpcService extends Service {
55
72
  if (this.options !== undefined && this.options.urlBuilder !== undefined) {
56
73
  return this.options.urlBuilder(path)
57
74
  }
58
- if (this.host.endsWith('/') && path.startsWith('/')) {
75
+ if (this.host.endsWith("/") && path.startsWith("/")) {
59
76
  return new URL(`${this.host}${path.slice(1)}`)
60
77
  }
61
- if (!this.host.endsWith('/') && !path.startsWith('/')) {
78
+ if (!this.host.endsWith("/") && !path.startsWith("/")) {
62
79
  return new URL(`${this.host}/${path}`)
63
80
  }
64
81
  return new URL(`${this.host}${path}`)
@@ -87,35 +104,35 @@ export class RpcService extends Service {
87
104
  /**
88
105
  * Send a POST request.
89
106
  * @param path
90
- * @param body
107
+ * @param body JSON object
91
108
  * @param options
92
109
  */
93
110
  async post(
94
111
  path: string,
95
- body?: BodyInit | null,
112
+ body: object | null | undefined,
96
113
  options?: RequestOptions
97
114
  ): Promise<Response> {
98
115
  return this.requestBuilder(path)
99
116
  .searchParams(options?.searchParams)
100
117
  .headers(options?.headers)
101
- .sendPost(body)
118
+ .sendPostJson(body)
102
119
  }
103
120
 
104
121
  /**
105
122
  * Send a PUT request.
106
123
  * @param path
107
- * @param body
124
+ * @param body JSON object
108
125
  * @param options
109
126
  */
110
127
  async put(
111
128
  path: string,
112
- body?: BodyInit | null,
129
+ body: object | null | undefined,
113
130
  options?: RequestOptions
114
131
  ): Promise<Response> {
115
132
  return this.requestBuilder(path)
116
133
  .searchParams(options?.searchParams)
117
134
  .headers(options?.headers)
118
- .sendPut(body)
135
+ .sendPutJson(body)
119
136
  }
120
137
 
121
138
  /**
@@ -1,12 +1,13 @@
1
- import { type Context } from '../context'
2
- import { type Constructor } from '../internal/registry'
3
- import { type DisposableContainer, type Lifetime } from '../disposable'
1
+ import { type Context } from "../context"
2
+ import { type Constructor } from "../internal/registry"
3
+ import { type DisposableContainer, type Lifetime } from "../disposable"
4
4
 
5
5
  export class ServiceContext {
6
6
  constructor(
7
7
  public readonly context: Context,
8
8
  private readonly disposableContainer: DisposableContainer
9
- ) {}
9
+ ) {
10
+ }
10
11
 
11
12
  public get lifetime(): Lifetime {
12
13
  return this.disposableContainer.lifetime
@@ -16,15 +17,15 @@ export class ServiceContext {
16
17
  return this.context.resolve(type)
17
18
  }
18
19
 
19
- public async onRegister(): Promise<void> {
20
+ public onRegister: () => Promise<void> = async (): Promise<void> => {
20
21
  await Promise.resolve()
21
22
  }
22
23
 
23
- public async onStart(): Promise<void> {
24
+ public onStart: () => Promise<void> = async (): Promise<void> => {
24
25
  await Promise.resolve()
25
26
  }
26
27
 
27
- public onUnregister(): void {
28
+ public onUnregister: () => void = (): void => {
28
29
  // do nothing
29
30
  }
30
31
  }
@@ -42,5 +43,6 @@ export abstract class Service {
42
43
  return this.serviceContext.context
43
44
  }
44
45
 
45
- public constructor(private readonly serviceContext: ServiceContext) {}
46
+ public constructor(private readonly serviceContext: ServiceContext) {
47
+ }
46
48
  }