@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.
- package/.editorconfig +4 -1
- package/.eslintrc.json +1 -1
- package/README.md +91 -2
- package/jest.config.ts +3 -3
- package/jest.setup.ts +2 -2
- package/package.json +3 -2
- package/src/appBuilder.ts +6 -6
- package/src/appSdk.ts +6 -6
- package/src/commands/startCommandHandler.ts +2 -2
- package/src/context.ts +3 -3
- package/src/credentials.ts +29 -7
- package/src/disposable.ts +3 -4
- package/src/dto/accessGroupResponse.ts +35 -0
- package/src/dto/chatResponse.ts +104 -0
- package/src/dto/userInfoResponse.ts +11 -1
- package/src/dto/workspacesResponse.ts +49 -0
- package/src/events.ts +13 -13
- package/src/index.ts +24 -12
- package/src/internal/app.impl.ts +25 -28
- package/src/internal/appBuilder.impl.ts +16 -16
- package/src/internal/createApp.impl.ts +3 -3
- package/src/services/commandService.ts +3 -3
- package/src/services/credentialService.ts +3 -3
- package/src/services/middlewareService.ts +4 -4
- package/src/services/organizationService.ts +18 -116
- package/src/services/requestBuilder.ts +40 -15
- package/src/services/responseUtils.ts +32 -0
- package/src/services/rpcService.ts +28 -11
- package/src/services/service.ts +10 -8
- package/src/services/userProfileService.ts +18 -66
- package/src/storages/chat.ts +21 -0
- package/src/storages/chats.ts +17 -0
- package/src/storages/file.impl.ts +69 -0
- package/src/storages/file.ts +28 -0
- package/src/storages/files.impl.ts +213 -0
- package/src/storages/files.ts +38 -0
- package/src/storages/filesPage.ts +27 -0
- package/src/storages/groups.impl.ts +337 -0
- package/src/storages/groups.ts +43 -0
- package/src/storages/organization.impl.ts +68 -0
- package/src/storages/organization.ts +33 -0
- package/src/storages/organizations.impl.ts +191 -0
- package/src/storages/organizations.ts +8 -28
- package/src/storages/userProfile.impl.ts +56 -0
- package/src/storages/userProfile.ts +2 -2
- package/src/storages/workspace.impl.ts +109 -0
- package/src/storages/workspace.ts +49 -0
- package/src/storages/workspaces.impl.ts +212 -0
- package/src/storages/workspaces.ts +53 -0
- package/test/commands.test.ts +8 -8
- package/test/data/test_file.pdf +0 -0
- package/test/disposable.test.ts +3 -3
- package/test/events.test.ts +4 -4
- package/test/files.test.ts +52 -0
- package/test/index.test.ts +42 -83
- package/test/organization.test.ts +57 -0
- package/test/registry.test.ts +8 -8
- package/test/services.test.ts +15 -15
- package/test/setup.ts +52 -0
- package/test/unitTest.test.ts +2 -2
- package/test/workspace.test.ts +71 -0
- package/src/services/organizationImpl.ts +0 -51
- package/src/services/organizationsImpl.ts +0 -55
- package/src/types.ts +0 -86
package/src/internal/app.impl.ts
CHANGED
@@ -1,25 +1,25 @@
|
|
1
|
-
import { DEFAULT_HOST } from
|
2
|
-
import { type AppBuilder } from
|
3
|
-
import { AppBuilderImplementation } from
|
4
|
-
import { type Constructor, Registry } from
|
5
|
-
import { Context } from
|
6
|
-
import { DisposableContainer, type Lifetime } from
|
7
|
-
import { type Service, ServiceContext } from
|
8
|
-
import { CredentialService } from
|
9
|
-
import { MiddlewareService } from
|
10
|
-
import { type CredentialBase } from
|
11
|
-
import { AppSdk } from
|
12
|
-
import { RpcService } from
|
13
|
-
import { CommandService } from
|
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
|
18
|
-
import { UserProfileService } from
|
19
|
-
import { OrganizationService } from
|
20
|
-
import { Organizations } from
|
21
|
-
import { UserProfile } from
|
22
|
-
import { isUnitTest, UnitTest } from
|
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
|
-
|
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
|
-
|
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
|
2
|
-
import { DEFAULT_HOST } from
|
3
|
-
import { type CredentialBase, DefaultCredential } from
|
4
|
-
import type { Middleware } from
|
5
|
-
import { type Service, type ServiceContext } from
|
6
|
-
import { type Constructor } from
|
7
|
-
import { Command, CommandHandler } from
|
8
|
-
import { Context } from
|
9
|
-
import { UnitTest } from
|
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
|
-
|
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(
|
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(
|
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(
|
64
|
+
throw new Error("registerService, type is undefined|null")
|
65
65
|
}
|
66
66
|
if (factory === undefined || factory === null) {
|
67
|
-
throw new Error(
|
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(
|
78
|
+
throw new Error("registerCommand, messageType is undefined|null")
|
79
79
|
}
|
80
80
|
if (commandFactory === undefined || commandFactory === null) {
|
81
|
-
throw new Error(
|
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
|
2
|
-
import { type AppBuilder } from
|
3
|
-
import { AppSdk } from
|
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
|
2
|
-
import { Context } from
|
3
|
-
import { Constructor } from
|
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
|
2
|
-
import { Service } from
|
3
|
-
import { type DisposableContainer } from
|
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
|
2
|
-
import { type Middleware } from
|
3
|
-
import { type Disposable } from
|
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
|
2
|
-
import {
|
3
|
-
|
4
|
-
|
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
|
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
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
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
|
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
|
-
|
55
|
-
|
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
|
-
|
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:
|
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:
|
106
|
+
method: "DELETE",
|
83
107
|
headers: this._headers
|
84
108
|
})
|
85
109
|
)
|
86
110
|
}
|
87
111
|
|
88
|
-
public async
|
112
|
+
public async sendPutJson(body: object | null | undefined): Promise<Response> {
|
89
113
|
const url = this._url
|
90
114
|
url.search = this._searchParams.toString()
|
91
|
-
|
92
|
-
|
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:
|
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
|
2
|
-
import { MiddlewareService } from
|
3
|
-
import { RequestBuilder } from
|
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(
|
75
|
+
if (this.host.endsWith("/") && path.startsWith("/")) {
|
59
76
|
return new URL(`${this.host}${path.slice(1)}`)
|
60
77
|
}
|
61
|
-
if (!this.host.endsWith(
|
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
|
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
|
-
.
|
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
|
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
|
-
.
|
135
|
+
.sendPutJson(body)
|
119
136
|
}
|
120
137
|
|
121
138
|
/**
|
package/src/services/service.ts
CHANGED
@@ -1,12 +1,13 @@
|
|
1
|
-
import { type Context } from
|
2
|
-
import { type Constructor } from
|
3
|
-
import { type DisposableContainer, type Lifetime } from
|
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
|
20
|
+
public onRegister: () => Promise<void> = async (): Promise<void> => {
|
20
21
|
await Promise.resolve()
|
21
22
|
}
|
22
23
|
|
23
|
-
public async
|
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
|
}
|