@neuralinnovations/dataisland-sdk 0.0.1-dev1 → 0.0.1-dev11
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/LICENSE +201 -0
- package/README.md +174 -1
- package/dist/index.d.ts +3 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +3 -0
- package/dist/index.js.map +1 -0
- package/dist/package.json +98 -0
- package/dist/src/appBuilder.d.ts +44 -0
- package/dist/src/appBuilder.d.ts.map +1 -0
- package/dist/src/appBuilder.js +10 -0
- package/dist/src/appBuilder.js.map +1 -0
- package/dist/src/commands/startCommandHandler.d.ts +7 -0
- package/dist/src/commands/startCommandHandler.d.ts.map +1 -0
- package/dist/src/commands/startCommandHandler.js +17 -0
- package/dist/src/commands/startCommandHandler.js.map +1 -0
- package/dist/src/context.d.ts +23 -0
- package/dist/src/context.d.ts.map +1 -0
- package/dist/src/context.js +31 -0
- package/dist/src/context.js.map +1 -0
- package/dist/src/credentials.d.ts +28 -0
- package/dist/src/credentials.d.ts.map +1 -0
- package/dist/src/credentials.js +70 -0
- package/dist/src/credentials.js.map +1 -0
- package/dist/src/dataIslandApp.d.ts +50 -0
- package/dist/src/dataIslandApp.d.ts.map +1 -0
- package/dist/src/dataIslandApp.js +10 -0
- package/dist/src/dataIslandApp.js.map +1 -0
- package/dist/src/disposable.d.ts +84 -0
- package/dist/src/disposable.d.ts.map +1 -0
- package/dist/src/disposable.js +140 -0
- package/dist/src/disposable.js.map +1 -0
- package/dist/src/dto/accessGroupResponse.d.ts +27 -0
- package/dist/src/dto/accessGroupResponse.d.ts.map +1 -0
- package/dist/src/dto/accessGroupResponse.js +3 -0
- package/dist/src/dto/accessGroupResponse.js.map +1 -0
- package/dist/src/dto/chatResponse.d.ts +78 -0
- package/dist/src/dto/chatResponse.d.ts.map +1 -0
- package/dist/src/dto/chatResponse.js +45 -0
- package/dist/src/dto/chatResponse.js.map +1 -0
- package/dist/src/dto/userInfoResponse.d.ts +40 -0
- package/dist/src/dto/userInfoResponse.d.ts.map +1 -0
- package/dist/src/dto/userInfoResponse.js +3 -0
- package/dist/src/dto/userInfoResponse.js.map +1 -0
- package/dist/src/dto/workspacesResponse.d.ts +43 -0
- package/dist/src/dto/workspacesResponse.d.ts.map +1 -0
- package/dist/src/dto/workspacesResponse.js +3 -0
- package/dist/src/dto/workspacesResponse.js.map +1 -0
- package/dist/src/events.d.ts +17 -0
- package/dist/src/events.d.ts.map +1 -0
- package/dist/src/events.js +52 -0
- package/dist/src/events.js.map +1 -0
- package/dist/src/index.d.ts +56 -0
- package/dist/src/index.d.ts.map +1 -0
- package/dist/src/index.js +89 -0
- package/dist/src/index.js.map +1 -0
- package/dist/src/internal/app.impl.d.ts +28 -0
- package/dist/src/internal/app.impl.d.ts.map +1 -0
- package/dist/src/internal/app.impl.js +151 -0
- package/dist/src/internal/app.impl.js.map +1 -0
- package/dist/src/internal/appBuilder.impl.d.ts +27 -0
- package/dist/src/internal/appBuilder.impl.d.ts.map +1 -0
- package/dist/src/internal/appBuilder.impl.js +71 -0
- package/dist/src/internal/appBuilder.impl.js.map +1 -0
- package/dist/src/internal/createApp.impl.d.ts +4 -0
- package/dist/src/internal/createApp.impl.d.ts.map +1 -0
- package/dist/src/internal/createApp.impl.js +11 -0
- package/dist/src/internal/createApp.impl.js.map +1 -0
- package/dist/src/internal/registry.d.ts +22 -0
- package/dist/src/internal/registry.d.ts.map +1 -0
- package/dist/src/internal/registry.js +69 -0
- package/dist/src/internal/registry.js.map +1 -0
- package/dist/src/middleware.d.ts +5 -0
- package/dist/src/middleware.d.ts.map +1 -0
- package/dist/src/middleware.js +3 -0
- package/dist/src/middleware.js.map +1 -0
- package/dist/src/services/commandService.d.ts +18 -0
- package/dist/src/services/commandService.d.ts.map +1 -0
- package/dist/src/services/commandService.js +40 -0
- package/dist/src/services/commandService.js.map +1 -0
- package/dist/src/services/credentialService.d.ts +9 -0
- package/dist/src/services/credentialService.d.ts.map +1 -0
- package/dist/src/services/credentialService.js +26 -0
- package/dist/src/services/credentialService.js.map +1 -0
- package/dist/src/services/middlewareService.d.ts +9 -0
- package/dist/src/services/middlewareService.d.ts.map +1 -0
- package/dist/src/services/middlewareService.js +34 -0
- package/dist/src/services/middlewareService.js.map +1 -0
- package/dist/src/services/organizationService.d.ts +10 -0
- package/dist/src/services/organizationService.d.ts.map +1 -0
- package/dist/src/services/organizationService.js +19 -0
- package/dist/src/services/organizationService.js.map +1 -0
- package/dist/src/services/requestBuilder.d.ts +17 -0
- package/dist/src/services/requestBuilder.d.ts.map +1 -0
- package/dist/src/services/requestBuilder.js +104 -0
- package/dist/src/services/requestBuilder.js.map +1 -0
- package/dist/src/services/responseUtils.d.ts +6 -0
- package/dist/src/services/responseUtils.d.ts.map +1 -0
- package/dist/src/services/responseUtils.js +32 -0
- package/dist/src/services/responseUtils.js.map +1 -0
- package/dist/src/services/rpcService.d.ts +77 -0
- package/dist/src/services/rpcService.d.ts.map +1 -0
- package/dist/src/services/rpcService.js +125 -0
- package/dist/src/services/rpcService.js.map +1 -0
- package/dist/src/services/service.d.ts +21 -0
- package/dist/src/services/service.d.ts.map +1 -0
- package/dist/src/services/service.js +41 -0
- package/dist/src/services/service.js.map +1 -0
- package/dist/src/services/userProfileService.d.ts +8 -0
- package/dist/src/services/userProfileService.d.ts.map +1 -0
- package/dist/src/services/userProfileService.js +32 -0
- package/dist/src/services/userProfileService.js.map +1 -0
- package/dist/src/storages/chats/answer.d.ts +30 -0
- package/dist/src/storages/chats/answer.d.ts.map +1 -0
- package/dist/src/storages/chats/answer.impl.d.ts +23 -0
- package/dist/src/storages/chats/answer.impl.d.ts.map +1 -0
- package/dist/src/storages/chats/answer.impl.js +110 -0
- package/dist/src/storages/chats/answer.impl.js.map +1 -0
- package/dist/src/storages/chats/answer.js +7 -0
- package/dist/src/storages/chats/answer.js.map +1 -0
- package/dist/src/storages/chats/chat.d.ts +30 -0
- package/dist/src/storages/chats/chat.d.ts.map +1 -0
- package/dist/src/storages/chats/chat.impl.d.ts +22 -0
- package/dist/src/storages/chats/chat.impl.d.ts.map +1 -0
- package/dist/src/storages/chats/chat.impl.js +67 -0
- package/dist/src/storages/chats/chat.impl.js.map +1 -0
- package/dist/src/storages/chats/chat.js +12 -0
- package/dist/src/storages/chats/chat.js.map +1 -0
- package/dist/src/storages/chats/chats.d.ts +40 -0
- package/dist/src/storages/chats/chats.d.ts.map +1 -0
- package/dist/src/storages/chats/chats.impl.d.ts +18 -0
- package/dist/src/storages/chats/chats.impl.d.ts.map +1 -0
- package/dist/src/storages/chats/chats.impl.js +102 -0
- package/dist/src/storages/chats/chats.impl.js.map +1 -0
- package/dist/src/storages/chats/chats.js +16 -0
- package/dist/src/storages/chats/chats.js.map +1 -0
- package/dist/src/storages/files/file.d.ts +24 -0
- package/dist/src/storages/files/file.d.ts.map +1 -0
- package/dist/src/storages/files/file.impl.d.ts +18 -0
- package/dist/src/storages/files/file.impl.d.ts.map +1 -0
- package/dist/src/storages/files/file.impl.js +52 -0
- package/dist/src/storages/files/file.impl.js.map +1 -0
- package/dist/src/storages/files/file.js +10 -0
- package/dist/src/storages/files/file.js.map +1 -0
- package/dist/src/storages/files/files.d.ts +33 -0
- package/dist/src/storages/files/files.d.ts.map +1 -0
- package/dist/src/storages/files/files.impl.d.ts +33 -0
- package/dist/src/storages/files/files.impl.d.ts.map +1 -0
- package/dist/src/storages/files/files.impl.js +159 -0
- package/dist/src/storages/files/files.impl.js.map +1 -0
- package/dist/src/storages/files/files.js +19 -0
- package/dist/src/storages/files/files.js.map +1 -0
- package/dist/src/storages/files/filesPage.d.ts +23 -0
- package/dist/src/storages/files/filesPage.d.ts.map +1 -0
- package/dist/src/storages/files/filesPage.js +10 -0
- package/dist/src/storages/files/filesPage.js.map +1 -0
- package/dist/src/storages/groups/groups.d.ts +87 -0
- package/dist/src/storages/groups/groups.d.ts.map +1 -0
- package/dist/src/storages/groups/groups.impl.d.ts +55 -0
- package/dist/src/storages/groups/groups.impl.d.ts.map +1 -0
- package/dist/src/storages/groups/groups.impl.js +245 -0
- package/dist/src/storages/groups/groups.impl.js.map +1 -0
- package/dist/src/storages/groups/groups.js +26 -0
- package/dist/src/storages/groups/groups.js.map +1 -0
- package/dist/src/storages/organizations/organization.d.ts +38 -0
- package/dist/src/storages/organizations/organization.d.ts.map +1 -0
- package/dist/src/storages/organizations/organization.impl.d.ts +30 -0
- package/dist/src/storages/organizations/organization.impl.d.ts.map +1 -0
- package/dist/src/storages/organizations/organization.impl.js +71 -0
- package/dist/src/storages/organizations/organization.impl.js.map +1 -0
- package/dist/src/storages/organizations/organization.js +10 -0
- package/dist/src/storages/organizations/organization.js.map +1 -0
- package/dist/src/storages/organizations/organizations.d.ts +46 -0
- package/dist/src/storages/organizations/organizations.d.ts.map +1 -0
- package/dist/src/storages/organizations/organizations.impl.d.ts +38 -0
- package/dist/src/storages/organizations/organizations.impl.d.ts.map +1 -0
- package/dist/src/storages/organizations/organizations.impl.js +151 -0
- package/dist/src/storages/organizations/organizations.impl.js.map +1 -0
- package/dist/src/storages/organizations/organizations.js +20 -0
- package/dist/src/storages/organizations/organizations.js.map +1 -0
- package/dist/src/storages/user/userProfile.d.ts +32 -0
- package/dist/src/storages/user/userProfile.d.ts.map +1 -0
- package/dist/src/storages/user/userProfile.impl.d.ts +13 -0
- package/dist/src/storages/user/userProfile.impl.d.ts.map +1 -0
- package/dist/src/storages/user/userProfile.impl.js +51 -0
- package/dist/src/storages/user/userProfile.impl.js.map +1 -0
- package/dist/src/storages/user/userProfile.js +12 -0
- package/dist/src/storages/user/userProfile.js.map +1 -0
- package/dist/src/storages/workspaces/workspace.d.ts +40 -0
- package/dist/src/storages/workspaces/workspace.d.ts.map +1 -0
- package/dist/src/storages/workspaces/workspace.impl.d.ts +22 -0
- package/dist/src/storages/workspaces/workspace.impl.d.ts.map +1 -0
- package/dist/src/storages/workspaces/workspace.impl.js +87 -0
- package/dist/src/storages/workspaces/workspace.impl.js.map +1 -0
- package/dist/src/storages/workspaces/workspace.js +18 -0
- package/dist/src/storages/workspaces/workspace.js.map +1 -0
- package/dist/src/storages/workspaces/workspaces.d.ts +47 -0
- package/dist/src/storages/workspaces/workspaces.d.ts.map +1 -0
- package/dist/src/storages/workspaces/workspaces.impl.d.ts +33 -0
- package/dist/src/storages/workspaces/workspaces.impl.d.ts.map +1 -0
- package/dist/src/storages/workspaces/workspaces.impl.js +157 -0
- package/dist/src/storages/workspaces/workspaces.impl.js.map +1 -0
- package/dist/src/storages/workspaces/workspaces.js +19 -0
- package/dist/src/storages/workspaces/workspaces.js.map +1 -0
- package/dist/src/unitTest.d.ts +12 -0
- package/dist/src/unitTest.d.ts.map +1 -0
- package/dist/src/unitTest.js +44 -0
- package/dist/src/unitTest.js.map +1 -0
- package/index.d.ts +1 -0
- package/index.js +1 -0
- package/package.json +41 -3
- package/src/appBuilder.ts +24 -5
- package/src/commands/startCommandHandler.ts +14 -0
- package/src/context.ts +32 -0
- package/src/credentials.ts +31 -9
- package/src/dataIslandApp.ts +59 -0
- package/src/disposable.ts +4 -5
- package/src/dto/accessGroupResponse.ts +35 -0
- package/src/dto/chatResponse.ts +103 -0
- package/src/dto/userInfoResponse.ts +47 -0
- package/src/dto/workspacesResponse.ts +49 -0
- package/src/events.ts +13 -17
- package/src/index.ts +44 -18
- package/src/internal/app.impl.ts +97 -32
- package/src/internal/appBuilder.impl.ts +39 -12
- package/src/internal/createApp.impl.ts +5 -5
- package/src/middleware.ts +1 -1
- package/src/services/commandService.ts +44 -0
- package/src/services/credentialService.ts +3 -3
- package/src/services/middlewareService.ts +8 -6
- package/src/services/organizationService.ts +28 -0
- package/src/services/requestBuilder.ts +127 -0
- package/src/services/responseUtils.ts +32 -0
- package/src/services/rpcService.ts +129 -52
- package/src/services/service.ts +10 -8
- package/src/services/userProfileService.ts +38 -0
- package/src/storages/chats/answer.impl.ts +163 -0
- package/src/storages/chats/answer.ts +42 -0
- package/src/storages/chats/chat.impl.ts +87 -0
- package/src/storages/chats/chat.ts +38 -0
- package/src/storages/chats/chats.impl.ts +142 -0
- package/src/storages/chats/chats.ts +47 -0
- package/src/storages/files/file.impl.ts +69 -0
- package/src/storages/files/file.ts +28 -0
- package/src/storages/files/files.impl.ts +213 -0
- package/src/storages/files/files.ts +38 -0
- package/src/storages/files/filesPage.ts +27 -0
- package/src/storages/groups/groups.impl.ts +326 -0
- package/src/storages/groups/groups.ts +101 -0
- package/src/storages/organizations/organization.impl.ts +95 -0
- package/src/storages/organizations/organization.ts +44 -0
- package/src/storages/organizations/organizations.impl.ts +197 -0
- package/src/storages/organizations/organizations.ts +56 -0
- package/src/storages/user/userProfile.impl.ts +56 -0
- package/src/storages/user/userProfile.ts +42 -0
- package/src/storages/workspaces/workspace.impl.ts +109 -0
- package/src/storages/workspaces/workspace.ts +49 -0
- package/src/storages/workspaces/workspaces.impl.ts +212 -0
- package/src/storages/workspaces/workspaces.ts +53 -0
- package/src/unitTest.ts +53 -0
- package/.browserslistrc +0 -5
- package/.editorconfig +0 -22
- package/.eslintrc.json +0 -44
- package/.github/workflows/publish-npm.yml +0 -28
- package/.prettierignore +0 -1
- package/.prettierrc +0 -11
- package/.yarnrc +0 -2
- package/babel.config.js +0 -6
- package/jest.config.ts +0 -199
- package/src/appSdk.ts +0 -40
- package/src/internal/context.ts +0 -13
- package/src/types.ts +0 -110
- package/test/disposable.test.ts +0 -39
- package/test/events.test.ts +0 -151
- package/test/index.test.ts +0 -83
- package/test/registry.test.ts +0 -44
- package/tsconfig.json +0 -31
@@ -0,0 +1,44 @@
|
|
1
|
+
import { Service } from "./service"
|
2
|
+
import { Context } from "../context"
|
3
|
+
import { Constructor } from "../internal/registry"
|
4
|
+
|
5
|
+
export abstract class CommandHandler<T> {
|
6
|
+
constructor(protected readonly context: Context) {}
|
7
|
+
|
8
|
+
resolve<T>(type: Constructor<T>): T | undefined {
|
9
|
+
return this.context.resolve<T>(type)
|
10
|
+
}
|
11
|
+
|
12
|
+
abstract execute(message: T): Promise<void>
|
13
|
+
}
|
14
|
+
|
15
|
+
export abstract class Command {}
|
16
|
+
|
17
|
+
export class CommandService extends Service {
|
18
|
+
private readonly _registry: Map<
|
19
|
+
Constructor<any>,
|
20
|
+
(context: Context) => CommandHandler<any>
|
21
|
+
> = new Map()
|
22
|
+
private _lastPromise: Promise<void> = Promise.resolve()
|
23
|
+
|
24
|
+
register<T extends Command>(
|
25
|
+
messageType: Constructor<T>,
|
26
|
+
commandFactory: (context: Context) => CommandHandler<T>
|
27
|
+
): void {
|
28
|
+
this._registry.set(messageType, commandFactory)
|
29
|
+
}
|
30
|
+
|
31
|
+
async execute<T extends Command>(message: T): Promise<void> {
|
32
|
+
const commandFactory = this._registry.get((message as any).constructor)
|
33
|
+
if (commandFactory) {
|
34
|
+
const command = commandFactory(this.context)
|
35
|
+
await this._lastPromise
|
36
|
+
this._lastPromise = command.execute(message)
|
37
|
+
await this._lastPromise
|
38
|
+
} else {
|
39
|
+
throw new Error(
|
40
|
+
`Command not found for message type ${message.constructor.name}`
|
41
|
+
)
|
42
|
+
}
|
43
|
+
}
|
44
|
+
}
|
@@ -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)
|
@@ -24,10 +24,12 @@ export class MiddlewareService extends Service {
|
|
24
24
|
const processNext = async (request: Request): Promise<Response> => {
|
25
25
|
index++
|
26
26
|
if (index < middlewares.length) {
|
27
|
-
await middlewares[index](request, processNext)
|
27
|
+
return await middlewares[index](request, processNext)
|
28
|
+
} else {
|
29
|
+
return await next(request)
|
28
30
|
}
|
29
|
-
return await next(request)
|
30
31
|
}
|
32
|
+
|
31
33
|
return await processNext(req)
|
32
34
|
}
|
33
35
|
}
|
@@ -0,0 +1,28 @@
|
|
1
|
+
import { Service } from "./service"
|
2
|
+
import { Organizations } from "../storages/organizations/organizations"
|
3
|
+
import { OrganizationDto, UserSettings } from "../dto/userInfoResponse"
|
4
|
+
import { OrganizationsImpl } from "../storages/organizations/organizations.impl"
|
5
|
+
|
6
|
+
export class OrganizationService extends Service {
|
7
|
+
private _impl?: OrganizationsImpl
|
8
|
+
|
9
|
+
private get impl(): OrganizationsImpl {
|
10
|
+
return this._impl ?? (this._impl = new OrganizationsImpl(this.context))
|
11
|
+
}
|
12
|
+
|
13
|
+
get organizations(): Organizations {
|
14
|
+
return this.impl
|
15
|
+
}
|
16
|
+
|
17
|
+
async initFrom(
|
18
|
+
adminInOrganization: string[],
|
19
|
+
organizations: OrganizationDto[],
|
20
|
+
settings?: UserSettings | null
|
21
|
+
): Promise<void> {
|
22
|
+
await this.impl.internalInitFrom(
|
23
|
+
adminInOrganization,
|
24
|
+
organizations,
|
25
|
+
settings
|
26
|
+
)
|
27
|
+
}
|
28
|
+
}
|
@@ -0,0 +1,127 @@
|
|
1
|
+
export class RequestBuilder {
|
2
|
+
private readonly _headers: Headers
|
3
|
+
private readonly _searchParams: URLSearchParams
|
4
|
+
|
5
|
+
constructor(
|
6
|
+
private readonly _url: URL,
|
7
|
+
private readonly _request: (req: Request) => Promise<Response>
|
8
|
+
) {
|
9
|
+
this._headers = new Headers()
|
10
|
+
this._searchParams = new URLSearchParams()
|
11
|
+
}
|
12
|
+
|
13
|
+
public header(name: string, value: string): RequestBuilder {
|
14
|
+
this._headers.set(name, value)
|
15
|
+
return this
|
16
|
+
}
|
17
|
+
|
18
|
+
public headers(
|
19
|
+
headers?: [string, string][] | Record<string, string> | Headers
|
20
|
+
): RequestBuilder {
|
21
|
+
if (headers === undefined) {
|
22
|
+
return this
|
23
|
+
}
|
24
|
+
if (headers instanceof Headers) {
|
25
|
+
headers.forEach((value, name) => {
|
26
|
+
this._headers.set(name, value)
|
27
|
+
})
|
28
|
+
} else {
|
29
|
+
Object.entries(headers).forEach(([name, value]) => {
|
30
|
+
this._headers.set(name, value)
|
31
|
+
})
|
32
|
+
}
|
33
|
+
return this
|
34
|
+
}
|
35
|
+
|
36
|
+
public searchParam(name: string, value: string): RequestBuilder {
|
37
|
+
this._searchParams.set(name, value)
|
38
|
+
return this
|
39
|
+
}
|
40
|
+
|
41
|
+
public searchParams(searchParams?: Map<string, string>): RequestBuilder {
|
42
|
+
if (searchParams === undefined) {
|
43
|
+
return this
|
44
|
+
}
|
45
|
+
searchParams.forEach((value, name) => {
|
46
|
+
this._searchParams.set(name, value)
|
47
|
+
})
|
48
|
+
return this
|
49
|
+
}
|
50
|
+
|
51
|
+
public async sendPostFormData(body: FormData): Promise<Response> {
|
52
|
+
const url = this._url
|
53
|
+
|
54
|
+
// set search params
|
55
|
+
url.search = this._searchParams.toString()
|
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)
|
79
|
+
}
|
80
|
+
const request = new Request(url, {
|
81
|
+
method: "POST",
|
82
|
+
headers: this._headers,
|
83
|
+
body: json
|
84
|
+
})
|
85
|
+
return await this._request(
|
86
|
+
request
|
87
|
+
)
|
88
|
+
}
|
89
|
+
|
90
|
+
public async sendGet(): Promise<Response> {
|
91
|
+
const url = this._url
|
92
|
+
url.search = this._searchParams.toString()
|
93
|
+
return await this._request(
|
94
|
+
new Request(url, {
|
95
|
+
method: "GET",
|
96
|
+
headers: this._headers
|
97
|
+
})
|
98
|
+
)
|
99
|
+
}
|
100
|
+
|
101
|
+
public async sendDelete(): Promise<Response> {
|
102
|
+
const url = this._url
|
103
|
+
url.search = this._searchParams.toString()
|
104
|
+
return await this._request(
|
105
|
+
new Request(url, {
|
106
|
+
method: "DELETE",
|
107
|
+
headers: this._headers
|
108
|
+
})
|
109
|
+
)
|
110
|
+
}
|
111
|
+
|
112
|
+
public async sendPutJson(body: object | null | undefined): Promise<Response> {
|
113
|
+
const url = this._url
|
114
|
+
url.search = this._searchParams.toString()
|
115
|
+
let json: string | null | undefined = null
|
116
|
+
if (body !== undefined && body !== null && typeof body === "object") {
|
117
|
+
json = JSON.stringify(body)
|
118
|
+
}
|
119
|
+
return await this._request(
|
120
|
+
new Request(url, {
|
121
|
+
method: "PUT",
|
122
|
+
headers: this._headers,
|
123
|
+
body: json
|
124
|
+
})
|
125
|
+
)
|
126
|
+
}
|
127
|
+
}
|
@@ -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,72 +1,149 @@
|
|
1
|
-
import { Service, type ServiceContext } from
|
2
|
-
import { MiddlewareService } from
|
1
|
+
import { Service, type ServiceContext } from "./service"
|
2
|
+
import { MiddlewareService } from "./middlewareService"
|
3
|
+
import { RequestBuilder } from "./requestBuilder"
|
3
4
|
|
5
|
+
/**
|
6
|
+
* Options for the RpcService.
|
7
|
+
*/
|
8
|
+
export interface RequestOptions {
|
9
|
+
searchParams?: Map<string, string>
|
10
|
+
headers?: [string, string][] | Record<string, string> | Headers
|
11
|
+
}
|
12
|
+
|
13
|
+
/**
|
14
|
+
* RPC service.
|
15
|
+
*/
|
4
16
|
export class RpcService extends Service {
|
5
|
-
// eslint-disable-next-line @typescript-eslint/no-unused-vars
|
6
|
-
async request(req: Request): Promise<Response> {
|
7
|
-
throw new Error('Not implemented')
|
8
|
-
}
|
9
17
|
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
18
|
+
constructor(
|
19
|
+
serviceContext: ServiceContext,
|
20
|
+
/**
|
21
|
+
* Host of the RPC service.
|
22
|
+
* It is not used if you use the `urlBuilder` option.
|
23
|
+
*/
|
24
|
+
public readonly host: string,
|
25
|
+
/**
|
26
|
+
* Options for the RpcService.
|
27
|
+
*/
|
28
|
+
private readonly options?: {
|
29
|
+
// make it possible to override the url builder
|
30
|
+
urlBuilder?: (path: string) => URL
|
31
|
+
// make it possible to override the fetch method
|
32
|
+
fetchMethod?: (uri: Request) => Promise<Response>
|
33
|
+
}
|
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
|
+
}
|
14
42
|
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
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)
|
19
50
|
})
|
20
|
-
|
51
|
+
}
|
21
52
|
}
|
22
53
|
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
54
|
+
/**
|
55
|
+
* Request method.
|
56
|
+
*/
|
57
|
+
async request(req: Request): Promise<Response> {
|
58
|
+
const middlewareService = this.resolve(MiddlewareService)
|
59
|
+
if (middlewareService !== undefined) {
|
60
|
+
return await middlewareService.process(req, async req => {
|
61
|
+
return (await this.options?.fetchMethod?.(req)) ?? (await fetch(req))
|
28
62
|
})
|
29
|
-
|
63
|
+
}
|
64
|
+
return (await this.options?.fetchMethod?.(req)) ?? (await fetch(req))
|
30
65
|
}
|
31
66
|
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
|
67
|
+
/**
|
68
|
+
* Build URL.
|
69
|
+
* @param path
|
70
|
+
*/
|
71
|
+
buildUrl(path: string): URL {
|
72
|
+
if (this.options !== undefined && this.options.urlBuilder !== undefined) {
|
73
|
+
return this.options.urlBuilder(path)
|
74
|
+
}
|
75
|
+
if (this.host.endsWith("/") && path.startsWith("/")) {
|
76
|
+
return new URL(`${this.host}${path.slice(1)}`)
|
77
|
+
}
|
78
|
+
if (!this.host.endsWith("/") && !path.startsWith("/")) {
|
79
|
+
return new URL(`${this.host}/${path}`)
|
80
|
+
}
|
81
|
+
return new URL(`${this.host}${path}`)
|
39
82
|
}
|
40
83
|
|
41
|
-
|
42
|
-
|
43
|
-
|
44
|
-
|
45
|
-
|
46
|
-
)
|
84
|
+
/**
|
85
|
+
* Create a request builder.
|
86
|
+
* @param path
|
87
|
+
*/
|
88
|
+
requestBuilder(path: string): RequestBuilder {
|
89
|
+
return new RequestBuilder(this.buildUrl(path), this.request.bind(this))
|
47
90
|
}
|
48
|
-
}
|
49
91
|
|
50
|
-
|
51
|
-
|
52
|
-
|
92
|
+
/**
|
93
|
+
* Send a GET request.
|
94
|
+
* @param path
|
95
|
+
* @param options
|
96
|
+
*/
|
97
|
+
async get(path: string, options?: RequestOptions): Promise<Response> {
|
98
|
+
return this.requestBuilder(path)
|
99
|
+
.searchParams(options?.searchParams)
|
100
|
+
.headers(options?.headers)
|
101
|
+
.sendGet()
|
53
102
|
}
|
54
103
|
|
55
|
-
|
56
|
-
|
57
|
-
|
58
|
-
|
59
|
-
|
60
|
-
|
61
|
-
|
62
|
-
|
63
|
-
|
104
|
+
/**
|
105
|
+
* Send a POST request.
|
106
|
+
* @param path
|
107
|
+
* @param body JSON object
|
108
|
+
* @param options
|
109
|
+
*/
|
110
|
+
async post(
|
111
|
+
path: string,
|
112
|
+
body: object | null | undefined,
|
113
|
+
options?: RequestOptions
|
114
|
+
): Promise<Response> {
|
115
|
+
return this.requestBuilder(path)
|
116
|
+
.searchParams(options?.searchParams)
|
117
|
+
.headers(options?.headers)
|
118
|
+
.sendPostJson(body)
|
64
119
|
}
|
65
120
|
|
66
|
-
|
67
|
-
|
68
|
-
|
69
|
-
|
70
|
-
|
121
|
+
/**
|
122
|
+
* Send a PUT request.
|
123
|
+
* @param path
|
124
|
+
* @param body JSON object
|
125
|
+
* @param options
|
126
|
+
*/
|
127
|
+
async put(
|
128
|
+
path: string,
|
129
|
+
body: object | null | undefined,
|
130
|
+
options?: RequestOptions
|
131
|
+
): Promise<Response> {
|
132
|
+
return this.requestBuilder(path)
|
133
|
+
.searchParams(options?.searchParams)
|
134
|
+
.headers(options?.headers)
|
135
|
+
.sendPutJson(body)
|
136
|
+
}
|
137
|
+
|
138
|
+
/**
|
139
|
+
* Send a DELETE request.
|
140
|
+
* @param path
|
141
|
+
* @param options
|
142
|
+
*/
|
143
|
+
async delete(path: string, options?: RequestOptions): Promise<Response> {
|
144
|
+
return this.requestBuilder(path)
|
145
|
+
.searchParams(options?.searchParams)
|
146
|
+
.headers(options?.headers)
|
147
|
+
.sendDelete()
|
71
148
|
}
|
72
149
|
}
|
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
|
}
|
@@ -0,0 +1,38 @@
|
|
1
|
+
import { Service } from "./service"
|
2
|
+
import { RpcService } from "./rpcService"
|
3
|
+
import { UserProfile } from "../storages/user/userProfile"
|
4
|
+
import { UserInfoResponse } from "../dto/userInfoResponse"
|
5
|
+
import { OrganizationService } from "./organizationService"
|
6
|
+
import { UserProfileImpl } from "../storages/user/userProfile.impl"
|
7
|
+
import { ResponseUtils } from "./responseUtils"
|
8
|
+
|
9
|
+
export class UserProfileService extends Service {
|
10
|
+
private readonly impl: UserProfileImpl = new UserProfileImpl()
|
11
|
+
|
12
|
+
get userProfile(): UserProfile {
|
13
|
+
return this.impl
|
14
|
+
}
|
15
|
+
|
16
|
+
async fetch() {
|
17
|
+
const rpc = this.resolve(RpcService) as RpcService
|
18
|
+
const response = await rpc.requestBuilder("api/v1/Users/self2").sendGet()
|
19
|
+
if (ResponseUtils.isFail(response)) {
|
20
|
+
await ResponseUtils.throwError("Failed to fetch user profile", response)
|
21
|
+
}
|
22
|
+
const content = (await response.json()) as UserInfoResponse
|
23
|
+
|
24
|
+
// init user profile from the server's response
|
25
|
+
this.impl.initFrom(content)
|
26
|
+
|
27
|
+
const organizationService = this.resolve(
|
28
|
+
OrganizationService
|
29
|
+
) as OrganizationService
|
30
|
+
|
31
|
+
// init organization service from user profile
|
32
|
+
await organizationService.initFrom(
|
33
|
+
content.adminInOrganization,
|
34
|
+
content.organizations,
|
35
|
+
content.user.settings
|
36
|
+
)
|
37
|
+
}
|
38
|
+
}
|