@refleet/refleet-sdk-ts 0.1.1
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 +21 -0
- package/README.md +56 -0
- package/dist/client.js +195 -0
- package/dist/client.js.map +1 -0
- package/dist/config.js +7 -0
- package/dist/config.js.map +1 -0
- package/dist/errors.js +96 -0
- package/dist/errors.js.map +1 -0
- package/dist/index.js +18 -0
- package/dist/index.js.map +1 -0
- package/dist/proto/api/shared/error_pb.js +7 -0
- package/dist/proto/api/shared/error_pb.js.map +1 -0
- package/dist/proto/api/shared/user_pb.js +7 -0
- package/dist/proto/api/shared/user_pb.js.map +1 -0
- package/dist/proto/api/v1/auth_pb.js +12 -0
- package/dist/proto/api/v1/auth_pb.js.map +1 -0
- package/dist/proto/api/v1/hello_pb.js +9 -0
- package/dist/proto/api/v1/hello_pb.js.map +1 -0
- package/dist/proto/api/v1/libraries_pb.js +10 -0
- package/dist/proto/api/v1/libraries_pb.js.map +1 -0
- package/dist/proto/api/v1/teams_pb.js +10 -0
- package/dist/proto/api/v1/teams_pb.js.map +1 -0
- package/dist/proto/buf/validate/validate_pb.js +7 -0
- package/dist/proto/buf/validate/validate_pb.js.map +1 -0
- package/dist/proto/google/api/annotations_pb.js +8 -0
- package/dist/proto/google/api/annotations_pb.js.map +1 -0
- package/dist/proto/google/api/http_pb.js +6 -0
- package/dist/proto/google/api/http_pb.js.map +1 -0
- package/dist/services/ai.js +217 -0
- package/dist/services/ai.js.map +1 -0
- package/dist/services/auth.js +105 -0
- package/dist/services/auth.js.map +1 -0
- package/dist/services/base.js +27 -0
- package/dist/services/base.js.map +1 -0
- package/dist/services/collections.js +208 -0
- package/dist/services/collections.js.map +1 -0
- package/dist/services/files.js +82 -0
- package/dist/services/files.js.map +1 -0
- package/dist/services/libraries.js +162 -0
- package/dist/services/libraries.js.map +1 -0
- package/dist/services/runtime-vars.js +84 -0
- package/dist/services/runtime-vars.js.map +1 -0
- package/dist/services/subscriptions.js +178 -0
- package/dist/services/subscriptions.js.map +1 -0
- package/dist/services/teams.js +194 -0
- package/dist/services/teams.js.map +1 -0
- package/dist/services/users.js +65 -0
- package/dist/services/users.js.map +1 -0
- package/dist/transports/grpc.js +194 -0
- package/dist/transports/grpc.js.map +1 -0
- package/dist/transports/http.js +169 -0
- package/dist/transports/http.js.map +1 -0
- package/dist/transports/service-registry.js +49 -0
- package/dist/transports/service-registry.js.map +1 -0
- package/package.json +67 -0
|
@@ -0,0 +1,194 @@
|
|
|
1
|
+
import { BaseService } from './base.js';
|
|
2
|
+
|
|
3
|
+
class TeamsService extends BaseService {
|
|
4
|
+
constructor(options) {
|
|
5
|
+
super(options.transport);
|
|
6
|
+
}
|
|
7
|
+
/**
|
|
8
|
+
* Create a new team
|
|
9
|
+
*
|
|
10
|
+
* @param request - Create team request
|
|
11
|
+
* @returns Created team
|
|
12
|
+
*
|
|
13
|
+
* @example
|
|
14
|
+
* ```typescript
|
|
15
|
+
* const team = await teams.createTeam({
|
|
16
|
+
* name: 'acme-corp',
|
|
17
|
+
* displayName: 'Acme Corporation',
|
|
18
|
+
* icon: '🏢',
|
|
19
|
+
* description: 'The best company'
|
|
20
|
+
* })
|
|
21
|
+
* ```
|
|
22
|
+
*/
|
|
23
|
+
async createTeam(request) {
|
|
24
|
+
return this.request("TeamsService", "CreateTeam", request);
|
|
25
|
+
}
|
|
26
|
+
/**
|
|
27
|
+
* Get a team by ID
|
|
28
|
+
*
|
|
29
|
+
* @param request - Get team request with team_id
|
|
30
|
+
* @returns Team details
|
|
31
|
+
*
|
|
32
|
+
* @example
|
|
33
|
+
* ```typescript
|
|
34
|
+
* const team = await teams.getTeam({
|
|
35
|
+
* teamId: 'team-123'
|
|
36
|
+
* })
|
|
37
|
+
* console.log(team.displayName)
|
|
38
|
+
* ```
|
|
39
|
+
*/
|
|
40
|
+
async getTeam(request) {
|
|
41
|
+
return this.request("TeamsService", "GetTeam", request);
|
|
42
|
+
}
|
|
43
|
+
/**
|
|
44
|
+
* List teams with pagination
|
|
45
|
+
*
|
|
46
|
+
* @param request - List teams request with pagination options
|
|
47
|
+
* @returns List of teams with pagination info
|
|
48
|
+
*
|
|
49
|
+
* @example
|
|
50
|
+
* ```typescript
|
|
51
|
+
* // First page
|
|
52
|
+
* const response = await teams.listTeams({
|
|
53
|
+
* pageSize: 20,
|
|
54
|
+
* filter: 'plan == "pro"',
|
|
55
|
+
* orderBy: 'name asc'
|
|
56
|
+
* })
|
|
57
|
+
*
|
|
58
|
+
* // Next page
|
|
59
|
+
* const nextPage = await teams.listTeams({
|
|
60
|
+
* pageSize: 20,
|
|
61
|
+
* pageToken: response.nextPageToken
|
|
62
|
+
* })
|
|
63
|
+
* ```
|
|
64
|
+
*/
|
|
65
|
+
async listTeams(request) {
|
|
66
|
+
return this.request("TeamsService", "ListTeams", request);
|
|
67
|
+
}
|
|
68
|
+
/**
|
|
69
|
+
* Update a team
|
|
70
|
+
*
|
|
71
|
+
* @param request - Update team request
|
|
72
|
+
* @returns Updated team
|
|
73
|
+
*
|
|
74
|
+
* @example
|
|
75
|
+
* ```typescript
|
|
76
|
+
* const team = await teams.updateTeam({
|
|
77
|
+
* teamId: 'team-123',
|
|
78
|
+
* displayName: 'New Display Name',
|
|
79
|
+
* description: 'Updated description'
|
|
80
|
+
* })
|
|
81
|
+
* ```
|
|
82
|
+
*/
|
|
83
|
+
async updateTeam(request) {
|
|
84
|
+
return this.request("TeamsService", "UpdateTeam", request);
|
|
85
|
+
}
|
|
86
|
+
/**
|
|
87
|
+
* Delete a team
|
|
88
|
+
*
|
|
89
|
+
* @param request - Delete team request
|
|
90
|
+
* @returns Delete response
|
|
91
|
+
*
|
|
92
|
+
* @example
|
|
93
|
+
* ```typescript
|
|
94
|
+
* await teams.deleteTeam({
|
|
95
|
+
* teamId: 'team-123'
|
|
96
|
+
* })
|
|
97
|
+
* ```
|
|
98
|
+
*/
|
|
99
|
+
async deleteTeam(request) {
|
|
100
|
+
return this.request("TeamsService", "DeleteTeam", request);
|
|
101
|
+
}
|
|
102
|
+
// ========== Helper methods ==========
|
|
103
|
+
/**
|
|
104
|
+
* Get a team by ID (simplified)
|
|
105
|
+
*
|
|
106
|
+
* @param teamId - Team ID
|
|
107
|
+
* @returns Team
|
|
108
|
+
*/
|
|
109
|
+
async get(teamId) {
|
|
110
|
+
return this.getTeam({
|
|
111
|
+
teamId
|
|
112
|
+
});
|
|
113
|
+
}
|
|
114
|
+
/**
|
|
115
|
+
* Create a team (simplified)
|
|
116
|
+
*
|
|
117
|
+
* @param options - Create team options
|
|
118
|
+
* @returns Created team
|
|
119
|
+
*/
|
|
120
|
+
async create(options) {
|
|
121
|
+
return this.createTeam({
|
|
122
|
+
name: options.name,
|
|
123
|
+
displayName: options.displayName ?? "",
|
|
124
|
+
icon: options.icon ?? "",
|
|
125
|
+
description: options.description ?? ""
|
|
126
|
+
});
|
|
127
|
+
}
|
|
128
|
+
/**
|
|
129
|
+
* Update a team (simplified)
|
|
130
|
+
*
|
|
131
|
+
* @param teamId - Team ID
|
|
132
|
+
* @param updates - Fields to update
|
|
133
|
+
* @returns Updated team
|
|
134
|
+
*/
|
|
135
|
+
async update(teamId, updates) {
|
|
136
|
+
return this.updateTeam({
|
|
137
|
+
teamId,
|
|
138
|
+
displayName: updates.displayName,
|
|
139
|
+
icon: updates.icon,
|
|
140
|
+
description: updates.description
|
|
141
|
+
});
|
|
142
|
+
}
|
|
143
|
+
/**
|
|
144
|
+
* Delete a team (simplified)
|
|
145
|
+
*
|
|
146
|
+
* @param teamId - Team ID
|
|
147
|
+
*/
|
|
148
|
+
async delete(teamId) {
|
|
149
|
+
await this.deleteTeam({
|
|
150
|
+
teamId
|
|
151
|
+
});
|
|
152
|
+
}
|
|
153
|
+
/**
|
|
154
|
+
* List all teams (simplified)
|
|
155
|
+
*
|
|
156
|
+
* @param options - List options
|
|
157
|
+
* @returns List response
|
|
158
|
+
*/
|
|
159
|
+
async list(options) {
|
|
160
|
+
return this.listTeams({
|
|
161
|
+
pageSize: options?.pageSize ?? 50,
|
|
162
|
+
pageToken: options?.pageToken ?? "",
|
|
163
|
+
filter: options?.filter ?? "",
|
|
164
|
+
orderBy: options?.orderBy ?? ""
|
|
165
|
+
});
|
|
166
|
+
}
|
|
167
|
+
/**
|
|
168
|
+
* Find team by name helper
|
|
169
|
+
* Convenience method to find a team by name
|
|
170
|
+
*
|
|
171
|
+
* @param name - Team name
|
|
172
|
+
* @returns Team or undefined if not found
|
|
173
|
+
*
|
|
174
|
+
* @example
|
|
175
|
+
* ```typescript
|
|
176
|
+
* const team = await teams.findByName('my-team')
|
|
177
|
+
* if (team) {
|
|
178
|
+
* console.log('Found team:', team.displayName)
|
|
179
|
+
* }
|
|
180
|
+
* ```
|
|
181
|
+
*/
|
|
182
|
+
async findByName(name) {
|
|
183
|
+
const response = await this.listTeams({
|
|
184
|
+
pageSize: 100,
|
|
185
|
+
pageToken: "",
|
|
186
|
+
filter: `name == "${name}"`,
|
|
187
|
+
orderBy: ""
|
|
188
|
+
});
|
|
189
|
+
return response.items.find((t) => t.name === name);
|
|
190
|
+
}
|
|
191
|
+
}
|
|
192
|
+
|
|
193
|
+
export { TeamsService };
|
|
194
|
+
//# sourceMappingURL=teams.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"teams.js","sources":["../../src/services/teams.ts"],"sourcesContent":["/**\n * TeamsService implementation\n * Handles team management operations\n */\n\nimport type { Transport } from '../transports/base'\nimport { BaseService } from './base'\nimport type {\n Team,\n CreateTeamRequest,\n GetTeamRequest,\n ListTeamsRequest,\n ListTeamsResponse,\n UpdateTeamRequest,\n DeleteTeamRequest,\n DeleteTeamResponse,\n} from '../proto/api/v1/teams_pb'\n\n/**\n * Constructor options for TeamsService\n */\nexport interface TeamsServiceOptions {\n transport: Transport\n}\n\n/**\n * Simplified create team options\n */\nexport interface CreateTeamOptions {\n name: string\n displayName?: string\n icon?: string\n description?: string\n}\n\n/**\n * TeamsService - Team management operations\n *\n * @example\n * ```typescript\n * const teams = new TeamsService({ transport })\n *\n * // Create a new team\n * const team = await teams.createTeam({\n * name: 'my-team',\n * displayName: 'My Team',\n * icon: '🚀',\n * description: 'A great team'\n * })\n *\n * // Get a team\n * const team = await teams.getTeam({ teamId: 'team-123' })\n *\n * // List teams\n * const teams = await teams.listTeams({\n * pageSize: 10,\n * orderBy: 'name asc'\n * })\n *\n * // Update a team\n * const updated = await teams.updateTeam({\n * teamId: 'team-123',\n * displayName: 'New Name'\n * })\n *\n * // Delete a team\n * await teams.deleteTeam({ teamId: 'team-123' })\n * ```\n */\nexport class TeamsService extends BaseService {\n constructor(options: TeamsServiceOptions) {\n super(options.transport)\n }\n\n /**\n * Create a new team\n *\n * @param request - Create team request\n * @returns Created team\n *\n * @example\n * ```typescript\n * const team = await teams.createTeam({\n * name: 'acme-corp',\n * displayName: 'Acme Corporation',\n * icon: '🏢',\n * description: 'The best company'\n * })\n * ```\n */\n async createTeam(request: CreateTeamRequest): Promise<Team> {\n return this.request<Team>('TeamsService', 'CreateTeam', request)\n }\n\n /**\n * Get a team by ID\n *\n * @param request - Get team request with team_id\n * @returns Team details\n *\n * @example\n * ```typescript\n * const team = await teams.getTeam({\n * teamId: 'team-123'\n * })\n * console.log(team.displayName)\n * ```\n */\n async getTeam(request: GetTeamRequest): Promise<Team> {\n return this.request<Team>('TeamsService', 'GetTeam', request)\n }\n\n /**\n * List teams with pagination\n *\n * @param request - List teams request with pagination options\n * @returns List of teams with pagination info\n *\n * @example\n * ```typescript\n * // First page\n * const response = await teams.listTeams({\n * pageSize: 20,\n * filter: 'plan == \"pro\"',\n * orderBy: 'name asc'\n * })\n *\n * // Next page\n * const nextPage = await teams.listTeams({\n * pageSize: 20,\n * pageToken: response.nextPageToken\n * })\n * ```\n */\n async listTeams(request: ListTeamsRequest): Promise<ListTeamsResponse> {\n return this.request<ListTeamsResponse>('TeamsService', 'ListTeams', request)\n }\n\n /**\n * Update a team\n *\n * @param request - Update team request\n * @returns Updated team\n *\n * @example\n * ```typescript\n * const team = await teams.updateTeam({\n * teamId: 'team-123',\n * displayName: 'New Display Name',\n * description: 'Updated description'\n * })\n * ```\n */\n async updateTeam(request: UpdateTeamRequest): Promise<Team> {\n return this.request<Team>('TeamsService', 'UpdateTeam', request)\n }\n\n /**\n * Delete a team\n *\n * @param request - Delete team request\n * @returns Delete response\n *\n * @example\n * ```typescript\n * await teams.deleteTeam({\n * teamId: 'team-123'\n * })\n * ```\n */\n async deleteTeam(request: DeleteTeamRequest): Promise<DeleteTeamResponse> {\n return this.request<DeleteTeamResponse>('TeamsService', 'DeleteTeam', request)\n }\n\n // ========== Helper methods ==========\n\n /**\n * Get a team by ID (simplified)\n *\n * @param teamId - Team ID\n * @returns Team\n */\n async get(teamId: string): Promise<Team> {\n return this.getTeam({\n teamId,\n } as GetTeamRequest)\n }\n\n /**\n * Create a team (simplified)\n *\n * @param options - Create team options\n * @returns Created team\n */\n async create(options: CreateTeamOptions): Promise<Team> {\n return this.createTeam({\n name: options.name,\n displayName: options.displayName ?? '',\n icon: options.icon ?? '',\n description: options.description ?? '',\n } as CreateTeamRequest)\n }\n\n /**\n * Update a team (simplified)\n *\n * @param teamId - Team ID\n * @param updates - Fields to update\n * @returns Updated team\n */\n async update(\n teamId: string,\n updates: {\n displayName?: string\n icon?: string\n description?: string\n }\n ): Promise<Team> {\n return this.updateTeam({\n teamId,\n displayName: updates.displayName,\n icon: updates.icon,\n description: updates.description,\n } as UpdateTeamRequest)\n }\n\n /**\n * Delete a team (simplified)\n *\n * @param teamId - Team ID\n */\n async delete(teamId: string): Promise<void> {\n await this.deleteTeam({\n teamId,\n } as DeleteTeamRequest)\n }\n\n /**\n * List all teams (simplified)\n *\n * @param options - List options\n * @returns List response\n */\n async list(options?: {\n pageSize?: number\n pageToken?: string\n filter?: string\n orderBy?: string\n }): Promise<ListTeamsResponse> {\n return this.listTeams({\n pageSize: options?.pageSize ?? 50,\n pageToken: options?.pageToken ?? '',\n filter: options?.filter ?? '',\n orderBy: options?.orderBy ?? '',\n } as ListTeamsRequest)\n }\n\n /**\n * Find team by name helper\n * Convenience method to find a team by name\n *\n * @param name - Team name\n * @returns Team or undefined if not found\n *\n * @example\n * ```typescript\n * const team = await teams.findByName('my-team')\n * if (team) {\n * console.log('Found team:', team.displayName)\n * }\n * ```\n */\n async findByName(name: string): Promise<Team | undefined> {\n const response = await this.listTeams({\n pageSize: 100,\n pageToken: '',\n filter: `name == \"${name}\"`,\n orderBy: '',\n } as ListTeamsRequest)\n\n return response.items.find(t => t.name === name)\n }\n}\n"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
import { BaseService } from './base.js';
|
|
2
|
+
|
|
3
|
+
class UsersService extends BaseService {
|
|
4
|
+
constructor(options) {
|
|
5
|
+
super(options.transport);
|
|
6
|
+
}
|
|
7
|
+
/**
|
|
8
|
+
* Get the authenticated user's profile
|
|
9
|
+
*
|
|
10
|
+
* @returns User profile
|
|
11
|
+
*
|
|
12
|
+
* @example
|
|
13
|
+
* ```typescript
|
|
14
|
+
* const profile = await users.getMyProfile()
|
|
15
|
+
* console.log(profile.displayName)
|
|
16
|
+
* ```
|
|
17
|
+
*/
|
|
18
|
+
async getMyProfile() {
|
|
19
|
+
return this.request("UsersService", "GetUserProfile", {
|
|
20
|
+
userId: "-"
|
|
21
|
+
});
|
|
22
|
+
}
|
|
23
|
+
/**
|
|
24
|
+
* Get a user's profile by ID
|
|
25
|
+
* Use "-" as userId to get the authenticated user's profile
|
|
26
|
+
*
|
|
27
|
+
* @param request - Get user profile request
|
|
28
|
+
* @returns User profile
|
|
29
|
+
*
|
|
30
|
+
* @example
|
|
31
|
+
* ```typescript
|
|
32
|
+
* const profile = await users.getUserProfile({
|
|
33
|
+
* userId: 'user-123'
|
|
34
|
+
* })
|
|
35
|
+
* ```
|
|
36
|
+
*/
|
|
37
|
+
async getUserProfile(request) {
|
|
38
|
+
return this.request("UsersService", "GetUserProfile", request);
|
|
39
|
+
}
|
|
40
|
+
/**
|
|
41
|
+
* Update the authenticated user's profile
|
|
42
|
+
*
|
|
43
|
+
* @param request - Update profile request
|
|
44
|
+
* @returns Updated user profile
|
|
45
|
+
*
|
|
46
|
+
* @example
|
|
47
|
+
* ```typescript
|
|
48
|
+
* const updated = await users.updateMyProfile({
|
|
49
|
+
* user: {
|
|
50
|
+
* displayName: 'New Display Name',
|
|
51
|
+
* avatarUrl: 'https://example.com/new-avatar.png'
|
|
52
|
+
* },
|
|
53
|
+
* updateMask: {
|
|
54
|
+
* paths: ['display_name', 'avatar_url']
|
|
55
|
+
* }
|
|
56
|
+
* })
|
|
57
|
+
* ```
|
|
58
|
+
*/
|
|
59
|
+
async updateMyProfile(request) {
|
|
60
|
+
return this.request("UsersService", "UpdateMyProfile", request);
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
export { UsersService };
|
|
65
|
+
//# sourceMappingURL=users.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"users.js","sources":["../../src/services/users.ts"],"sourcesContent":["/**\n * UsersService implementation\n * Handles user profile operations\n */\n\nimport type { Transport } from '../transports/base'\nimport { BaseService } from './base'\nimport type {\n UserProfile,\n UpdateMyProfileRequest,\n GetUserProfileRequest,\n} from '../proto/api/v1/users_pb'\n\n/**\n * Constructor options for UsersService\n */\nexport interface UsersServiceOptions {\n transport: Transport\n}\n\n/**\n * UsersService - User profile operations\n *\n * @example\n * ```typescript\n * const users = new UsersService({ transport })\n *\n * // Get my profile\n * const myProfile = await users.getMyProfile()\n *\n * // Get user profile by ID\n * const profile = await users.getUserProfile({\n * userId: 'user-123'\n * })\n *\n * // Update my profile\n * const updated = await users.updateMyProfile({\n * user: {\n * displayName: 'New Name',\n * avatarUrl: 'https://example.com/avatar.png'\n * }\n * })\n * ```\n */\nexport class UsersService extends BaseService {\n constructor(options: UsersServiceOptions) {\n super(options.transport)\n }\n\n /**\n * Get the authenticated user's profile\n *\n * @returns User profile\n *\n * @example\n * ```typescript\n * const profile = await users.getMyProfile()\n * console.log(profile.displayName)\n * ```\n */\n async getMyProfile(): Promise<UserProfile> {\n return this.request<UserProfile>('UsersService', 'GetUserProfile', {\n userId: '-',\n } as GetUserProfileRequest)\n }\n\n /**\n * Get a user's profile by ID\n * Use \"-\" as userId to get the authenticated user's profile\n *\n * @param request - Get user profile request\n * @returns User profile\n *\n * @example\n * ```typescript\n * const profile = await users.getUserProfile({\n * userId: 'user-123'\n * })\n * ```\n */\n async getUserProfile(request: GetUserProfileRequest): Promise<UserProfile> {\n return this.request<UserProfile>('UsersService', 'GetUserProfile', request)\n }\n\n /**\n * Update the authenticated user's profile\n *\n * @param request - Update profile request\n * @returns Updated user profile\n *\n * @example\n * ```typescript\n * const updated = await users.updateMyProfile({\n * user: {\n * displayName: 'New Display Name',\n * avatarUrl: 'https://example.com/new-avatar.png'\n * },\n * updateMask: {\n * paths: ['display_name', 'avatar_url']\n * }\n * })\n * ```\n */\n async updateMyProfile(request: UpdateMyProfileRequest): Promise<UserProfile> {\n return this.request<UserProfile>('UsersService', 'UpdateMyProfile', request)\n }\n}\n"],"names":[],"mappings":";;AA4CO,MAAM,qBAAqB,WAAA,CAAY;AAAA,EAC5C,YAAY,OAAA,EAA8B;AACxC,IAAA,KAAA,CAAM,QAAQ,SAAS,CAAA;AAAA,EACzB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAaA,MAAM,YAAA,GAAqC;AACzC,IAAA,OAAO,IAAA,CAAK,OAAA,CAAqB,cAAA,EAAgB,gBAAA,EAAkB;AAAA,MACjE,MAAA,EAAQ;AAAA,KACgB,CAAA;AAAA,EAC5B;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAgBA,MAAM,eAAe,OAAA,EAAsD;AACzE,IAAA,OAAO,IAAA,CAAK,OAAA,CAAqB,cAAA,EAAgB,gBAAA,EAAkB,OAAO,CAAA;AAAA,EAC5E;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAqBA,MAAM,gBAAgB,OAAA,EAAuD;AAC3E,IAAA,OAAO,IAAA,CAAK,OAAA,CAAqB,cAAA,EAAgB,iBAAA,EAAmB,OAAO,CAAA;AAAA,EAC7E;AACF;;;;"}
|
|
@@ -0,0 +1,194 @@
|
|
|
1
|
+
import { createClient } from '@connectrpc/connect';
|
|
2
|
+
export { createClient } from '@connectrpc/connect';
|
|
3
|
+
import { createConnectTransport } from '@connectrpc/connect-web';
|
|
4
|
+
export { createConnectTransport } from '@connectrpc/connect-web';
|
|
5
|
+
import { getService, initServices } from './service-registry.js';
|
|
6
|
+
|
|
7
|
+
var __defProp = Object.defineProperty;
|
|
8
|
+
var __defNormalProp = (obj, key, value) => key in obj ? __defProp(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
|
|
9
|
+
var __publicField = (obj, key, value) => __defNormalProp(obj, typeof key !== "symbol" ? key + "" : key, value);
|
|
10
|
+
function isBrowser() {
|
|
11
|
+
return typeof globalThis.window !== "undefined";
|
|
12
|
+
}
|
|
13
|
+
function createDefaultTransport(baseURL, timeout, getAuthToken, setAuthToken, refreshAuthToken, debug) {
|
|
14
|
+
const authInterceptor = (next) => async (req) => {
|
|
15
|
+
const token = getAuthToken();
|
|
16
|
+
if (token) {
|
|
17
|
+
req.header.set("Authorization", `Bearer ${token}`);
|
|
18
|
+
}
|
|
19
|
+
try {
|
|
20
|
+
return await next(req);
|
|
21
|
+
} catch (err) {
|
|
22
|
+
const error = err;
|
|
23
|
+
if (error.code === 16 && refreshAuthToken) {
|
|
24
|
+
try {
|
|
25
|
+
const newToken = await refreshAuthToken();
|
|
26
|
+
setAuthToken(newToken);
|
|
27
|
+
req.header.set("Authorization", `Bearer ${newToken}`);
|
|
28
|
+
return await next(req);
|
|
29
|
+
} catch {
|
|
30
|
+
throw err;
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
throw err;
|
|
34
|
+
}
|
|
35
|
+
};
|
|
36
|
+
const loggingInterceptor = (next) => async (req) => {
|
|
37
|
+
if (!debug) {
|
|
38
|
+
return next(req);
|
|
39
|
+
}
|
|
40
|
+
const start = Date.now();
|
|
41
|
+
console.debug(`[gRPC] ${req.method.name} ->`);
|
|
42
|
+
try {
|
|
43
|
+
const response = await next(req);
|
|
44
|
+
const duration = Date.now() - start;
|
|
45
|
+
console.debug(`[gRPC] ${req.method.name} <- ${duration}ms`);
|
|
46
|
+
return response;
|
|
47
|
+
} catch (err) {
|
|
48
|
+
const duration = Date.now() - start;
|
|
49
|
+
console.debug(`[gRPC] ${req.method.name} <- error (${duration}ms)`, err);
|
|
50
|
+
throw err;
|
|
51
|
+
}
|
|
52
|
+
};
|
|
53
|
+
if (isBrowser()) {
|
|
54
|
+
return createConnectTransport({
|
|
55
|
+
baseUrl: baseURL,
|
|
56
|
+
defaultTimeoutMs: timeout,
|
|
57
|
+
// Use binary format for better performance
|
|
58
|
+
useBinaryFormat: true,
|
|
59
|
+
interceptors: [loggingInterceptor, authInterceptor]
|
|
60
|
+
});
|
|
61
|
+
}
|
|
62
|
+
throw new Error(
|
|
63
|
+
'Node.js environment detected. Please provide a custom transport using @connectrpc/connect-node:\nimport { createConnectTransport } from "@connectrpc/connect-node"\nconst transport = createConnectTransport({ baseUrl, httpVersion: "2" })'
|
|
64
|
+
);
|
|
65
|
+
}
|
|
66
|
+
class GrpcTransport {
|
|
67
|
+
constructor(options) {
|
|
68
|
+
__publicField(this, "authToken");
|
|
69
|
+
__publicField(this, "refreshingToken", null);
|
|
70
|
+
__publicField(this, "options");
|
|
71
|
+
__publicField(this, "connectTransport");
|
|
72
|
+
__publicField(this, "clients", /* @__PURE__ */ new Map());
|
|
73
|
+
__publicField(this, "serviceRegistry");
|
|
74
|
+
__publicField(this, "initialized", null);
|
|
75
|
+
this.options = {
|
|
76
|
+
timeout: 3e4,
|
|
77
|
+
debug: false,
|
|
78
|
+
...options
|
|
79
|
+
};
|
|
80
|
+
this.serviceRegistry = options.serviceRegistry || {
|
|
81
|
+
get: (name) => getService(name),
|
|
82
|
+
has: (name) => getService(name) !== void 0,
|
|
83
|
+
register: () => {
|
|
84
|
+
},
|
|
85
|
+
list: () => []
|
|
86
|
+
};
|
|
87
|
+
this.connectTransport = options.transport || createDefaultTransport(
|
|
88
|
+
this.options.baseURL,
|
|
89
|
+
this.options.timeout ?? 3e4,
|
|
90
|
+
() => this.authToken,
|
|
91
|
+
(token) => {
|
|
92
|
+
this.authToken = token;
|
|
93
|
+
},
|
|
94
|
+
this.options.refreshAuthToken ? () => this.refreshToken() : void 0,
|
|
95
|
+
this.options.debug
|
|
96
|
+
);
|
|
97
|
+
this.initialized = this.initializeServices();
|
|
98
|
+
}
|
|
99
|
+
/**
|
|
100
|
+
* Initialize services
|
|
101
|
+
*/
|
|
102
|
+
async initializeServices() {
|
|
103
|
+
await initServices();
|
|
104
|
+
}
|
|
105
|
+
/**
|
|
106
|
+
* Make a unary gRPC request
|
|
107
|
+
* This method is called by service implementations
|
|
108
|
+
*
|
|
109
|
+
* @param serviceMethod - Service and method name (e.g., 'AuthService.Token')
|
|
110
|
+
* @param request - Request message
|
|
111
|
+
* @returns Promise with response message
|
|
112
|
+
*/
|
|
113
|
+
async request(serviceMethod, request) {
|
|
114
|
+
await this.initialized;
|
|
115
|
+
const [serviceName, methodName] = serviceMethod.split(".");
|
|
116
|
+
const client = this.getOrCreateClient(serviceName);
|
|
117
|
+
const method = client[methodName];
|
|
118
|
+
const response = await method(request);
|
|
119
|
+
return response;
|
|
120
|
+
}
|
|
121
|
+
/**
|
|
122
|
+
* Get or create a client for a service
|
|
123
|
+
*/
|
|
124
|
+
getOrCreateClient(serviceName) {
|
|
125
|
+
const clientKey = serviceName;
|
|
126
|
+
if (this.clients.has(clientKey)) {
|
|
127
|
+
return this.clients.get(clientKey);
|
|
128
|
+
}
|
|
129
|
+
const serviceDefinition = this.serviceRegistry.get(serviceName);
|
|
130
|
+
if (!serviceDefinition) {
|
|
131
|
+
throw new Error(`Service "${serviceName}" not found in registry. Did you forget to register it?`);
|
|
132
|
+
}
|
|
133
|
+
const client = createClient(
|
|
134
|
+
serviceDefinition,
|
|
135
|
+
this.connectTransport
|
|
136
|
+
);
|
|
137
|
+
this.clients.set(clientKey, client);
|
|
138
|
+
return client;
|
|
139
|
+
}
|
|
140
|
+
/**
|
|
141
|
+
* Refresh auth token
|
|
142
|
+
*/
|
|
143
|
+
async refreshToken() {
|
|
144
|
+
if (this.refreshingToken) {
|
|
145
|
+
return this.refreshingToken;
|
|
146
|
+
}
|
|
147
|
+
if (this.options.refreshAuthToken) {
|
|
148
|
+
this.refreshingToken = this.options.refreshAuthToken();
|
|
149
|
+
try {
|
|
150
|
+
const newToken = await this.refreshingToken;
|
|
151
|
+
this.authToken = newToken;
|
|
152
|
+
return newToken;
|
|
153
|
+
} finally {
|
|
154
|
+
this.refreshingToken = null;
|
|
155
|
+
}
|
|
156
|
+
}
|
|
157
|
+
throw new Error("No refreshAuthToken function provided");
|
|
158
|
+
}
|
|
159
|
+
/**
|
|
160
|
+
* Set authentication token
|
|
161
|
+
*/
|
|
162
|
+
setAuthToken(token) {
|
|
163
|
+
this.authToken = token;
|
|
164
|
+
}
|
|
165
|
+
/**
|
|
166
|
+
* Clear authentication token
|
|
167
|
+
*/
|
|
168
|
+
clearAuthToken() {
|
|
169
|
+
this.authToken = void 0;
|
|
170
|
+
}
|
|
171
|
+
/**
|
|
172
|
+
* Close the transport and cleanup resources
|
|
173
|
+
*/
|
|
174
|
+
close() {
|
|
175
|
+
this.clients.clear();
|
|
176
|
+
}
|
|
177
|
+
/**
|
|
178
|
+
* Get the underlying Connect transport
|
|
179
|
+
* Useful for creating custom clients
|
|
180
|
+
*/
|
|
181
|
+
getConnectTransport() {
|
|
182
|
+
return this.connectTransport;
|
|
183
|
+
}
|
|
184
|
+
}
|
|
185
|
+
function createServiceClient(serviceDefinition, transport) {
|
|
186
|
+
const connectTransport = transport.getConnectTransport();
|
|
187
|
+
return createClient(
|
|
188
|
+
serviceDefinition,
|
|
189
|
+
connectTransport
|
|
190
|
+
);
|
|
191
|
+
}
|
|
192
|
+
|
|
193
|
+
export { GrpcTransport, createServiceClient };
|
|
194
|
+
//# sourceMappingURL=grpc.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"grpc.js","sources":["../../src/transports/grpc.ts"],"sourcesContent":["/**\n * gRPC transport implementation using @connectrpc/connect\n *\n * Supports:\n * - Binary protocol with Connect\n * - Automatic authentication via interceptors\n * - Browser (connect-web) and Node.js (connect-node) environments\n * - Token refresh on 401 responses\n */\n\nimport type { Message, DescService } from '@bufbuild/protobuf'\nimport type {\n Interceptor,\n Transport as ConnectTransport,\n} from '@connectrpc/connect'\nimport {\n createClient,\n} from '@connectrpc/connect'\nimport { createConnectTransport } from '@connectrpc/connect-web'\nimport type { Transport as BaseTransport } from './base'\nimport { getService, initServices, type ServiceRegistry } from './service-registry'\n\n/**\n * gRPC transport options\n */\nexport interface GrpcTransportOptions {\n /**\n * Base URL of the gRPC server\n */\n baseURL: string\n\n /**\n * Request timeout in milliseconds\n * @default 30000 (30 seconds)\n */\n timeout?: number\n\n /**\n * Enable debug logging\n * @default false\n */\n debug?: boolean\n\n /**\n * Optional custom Connect transport\n * If not provided, a default web transport will be created\n */\n transport?: ConnectTransport\n\n /**\n * Optional function to refresh auth token\n * Called when receiving a 401 Unauthorized response\n */\n refreshAuthToken?: () => Promise<string>\n\n /**\n * Optional service registry\n * If not provided, will use the global registry\n */\n serviceRegistry?: ServiceRegistry\n}\n\n/**\n * Detect if we're in a browser environment\n */\nfunction isBrowser(): boolean {\n return typeof (globalThis as { window?: unknown }).window !== 'undefined'\n}\n\n/**\n * Create default Connect transport\n */\nfunction createDefaultTransport(\n baseURL: string,\n timeout: number,\n getAuthToken: () => string | undefined,\n setAuthToken: (token: string) => void,\n refreshAuthToken?: () => Promise<string>,\n debug?: boolean\n): ConnectTransport {\n const authInterceptor: Interceptor = (next) => async (req) => {\n const token = getAuthToken()\n if (token) {\n req.header.set('Authorization', `Bearer ${token}`)\n }\n\n try {\n return await next(req)\n } catch (err: unknown) {\n // Handle 401 - try to refresh token\n const error = err as { code?: number; message?: string }\n if (error.code === 16 && refreshAuthToken) {\n // Code 16 = UNAUTHENTICATED\n try {\n const newToken = await refreshAuthToken()\n setAuthToken(newToken)\n\n // Retry request with new token\n req.header.set('Authorization', `Bearer ${newToken}`)\n return await next(req)\n } catch {\n // Refresh failed, throw original error\n throw err\n }\n }\n throw err\n }\n }\n\n const loggingInterceptor: Interceptor = (next) => async (req) => {\n if (!debug) {\n return next(req)\n }\n\n const start = Date.now()\n console.debug(`[gRPC] ${req.method.name} ->`)\n\n try {\n const response = await next(req)\n const duration = Date.now() - start\n console.debug(`[gRPC] ${req.method.name} <- ${duration}ms`)\n return response\n } catch (err) {\n const duration = Date.now() - start\n console.debug(`[gRPC] ${req.method.name} <- error (${duration}ms)`, err)\n throw err\n }\n }\n\n if (isBrowser()) {\n // Browser: use connect-web\n return createConnectTransport({\n baseUrl: baseURL,\n defaultTimeoutMs: timeout,\n // Use binary format for better performance\n useBinaryFormat: true,\n interceptors: [loggingInterceptor, authInterceptor],\n })\n }\n // For Node.js, users should provide their own transport\n // using @connectrpc/connect-node or createConnectTransport from connect-node\n throw new Error(\n 'Node.js environment detected. Please provide a custom transport using @connectrpc/connect-node:\\n' +\n 'import { createConnectTransport } from \"@connectrpc/connect-node\"\\n' +\n 'const transport = createConnectTransport({ baseUrl, httpVersion: \"2\" })'\n )\n}\n\n/**\n * gRPC transport implementation using Connect\n *\n * @example\n * ```typescript\n * // Browser\n * const transport = new GrpcTransport({ baseURL: 'https://api.refleet.cloud' })\n *\n * // Node.js\n * import { createConnectTransport } from '@connectrpc/connect-node'\n * const transport = new GrpcTransport({\n * baseURL: 'https://api.refleet.cloud',\n * transport: createConnectTransport({ baseUrl: 'https://api.refleet.cloud', httpVersion: '2' })\n * })\n * ```\n */\nexport class GrpcTransport implements BaseTransport {\n private authToken: string | undefined\n private refreshingToken: Promise<string> | null = null\n private options: GrpcTransportOptions\n private connectTransport: ConnectTransport\n private clients: Map<string, any> = new Map()\n private serviceRegistry: ServiceRegistry\n private initialized: Promise<void> | null = null\n\n constructor(options: GrpcTransportOptions) {\n this.options = {\n timeout: 30000,\n debug: false,\n ...options,\n }\n\n this.serviceRegistry = options.serviceRegistry || {\n get: (name: string) => getService(name),\n has: (name: string) => getService(name) !== undefined,\n register: () => {},\n list: () => [],\n }\n\n this.connectTransport = options.transport || createDefaultTransport(\n this.options.baseURL,\n this.options.timeout ?? 30000,\n () => this.authToken,\n (token) => { this.authToken = token },\n this.options.refreshAuthToken\n ? () => this.refreshToken()\n : undefined,\n this.options.debug\n )\n\n // Initialize services\n this.initialized = this.initializeServices()\n }\n\n /**\n * Initialize services\n */\n private async initializeServices(): Promise<void> {\n await initServices()\n }\n\n /**\n * Make a unary gRPC request\n * This method is called by service implementations\n *\n * @param serviceMethod - Service and method name (e.g., 'AuthService.Token')\n * @param request - Request message\n * @returns Promise with response message\n */\n async request<TResponse extends Message>(\n serviceMethod: string,\n request: Message\n ): Promise<TResponse> {\n // Ensure services are initialized\n await this.initialized\n\n const [serviceName, methodName] = serviceMethod.split('.')\n\n // Get or create client for the service\n const client = this.getOrCreateClient(serviceName)\n\n // Call the method using dynamic access\n const method = (client as Record<string, unknown>)[methodName] as (req: Message) => Promise<Message>\n const response = await method(request)\n\n return response as TResponse\n }\n\n /**\n * Get or create a client for a service\n */\n private getOrCreateClient(serviceName: string): any {\n const clientKey = serviceName\n\n if (this.clients.has(clientKey)) {\n return this.clients.get(clientKey)\n }\n\n // Get service definition from registry\n const serviceDefinition = this.serviceRegistry.get(serviceName)\n if (!serviceDefinition) {\n throw new Error(`Service \"${serviceName}\" not found in registry. Did you forget to register it?`)\n }\n\n // Create client\n const client = createClient(\n serviceDefinition as DescService,\n this.connectTransport\n )\n\n this.clients.set(clientKey, client)\n return client\n }\n\n /**\n * Refresh auth token\n */\n private async refreshToken(): Promise<string> {\n if (this.refreshingToken) {\n return this.refreshingToken\n }\n\n if (this.options.refreshAuthToken) {\n this.refreshingToken = this.options.refreshAuthToken()\n try {\n const newToken = await this.refreshingToken\n this.authToken = newToken\n return newToken\n } finally {\n this.refreshingToken = null\n }\n }\n\n throw new Error('No refreshAuthToken function provided')\n }\n\n /**\n * Set authentication token\n */\n setAuthToken(token: string): void {\n this.authToken = token\n }\n\n /**\n * Clear authentication token\n */\n clearAuthToken(): void {\n this.authToken = undefined\n }\n\n /**\n * Close the transport and cleanup resources\n */\n close(): void {\n this.clients.clear()\n }\n\n /**\n * Get the underlying Connect transport\n * Useful for creating custom clients\n */\n getConnectTransport(): ConnectTransport {\n return this.connectTransport\n }\n}\n\n/**\n * Create a service client using the gRPC transport\n *\n * @example\n * ```typescript\n * import { AuthService } from '@/proto/api/v1/auth_pb'\n *\n * const client = createServiceClient(AuthService, transport)\n * const response = await client.token({ email: 'user@example.com', password: 'pass' })\n * ```\n */\nexport function createServiceClient<T extends DescService>(\n serviceDefinition: T,\n transport: GrpcTransport\n): any {\n const connectTransport = transport.getConnectTransport()\n\n return createClient(\n serviceDefinition,\n connectTransport\n )\n}\n\n/**\n * Re-export commonly used Connect types and utilities\n */\nexport {\n createClient,\n} from '@connectrpc/connect'\n\nexport {\n createConnectTransport,\n} from '@connectrpc/connect-web'\n\nexport type { Transport as ConnectTransport } from '@connectrpc/connect'\nexport type { DescService } from '@bufbuild/protobuf'\n"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,169 @@
|
|
|
1
|
+
import { parseHttpError, RefleetError, NetworkError } from '../errors.js';
|
|
2
|
+
|
|
3
|
+
var __defProp = Object.defineProperty;
|
|
4
|
+
var __defNormalProp = (obj, key, value) => key in obj ? __defProp(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
|
|
5
|
+
var __publicField = (obj, key, value) => __defNormalProp(obj, typeof key !== "symbol" ? key + "" : key, value);
|
|
6
|
+
function messageToPlain(message) {
|
|
7
|
+
return message;
|
|
8
|
+
}
|
|
9
|
+
const METHOD_PATHS = {
|
|
10
|
+
// AuthService
|
|
11
|
+
"AuthService.Token": "/v1/token",
|
|
12
|
+
"AuthService.SignUp": "/v1/signUp",
|
|
13
|
+
// TeamsService
|
|
14
|
+
"TeamsService.CreateTeam": "/v1/teams",
|
|
15
|
+
"TeamsService.GetTeam": "/v1/teams/{team_id}",
|
|
16
|
+
"TeamsService.ListTeams": "/v1/teams"
|
|
17
|
+
};
|
|
18
|
+
class HttpTransport {
|
|
19
|
+
constructor(options) {
|
|
20
|
+
__publicField(this, "authToken");
|
|
21
|
+
__publicField(this, "options");
|
|
22
|
+
__publicField(this, "refreshingToken", null);
|
|
23
|
+
this.options = options;
|
|
24
|
+
}
|
|
25
|
+
/**
|
|
26
|
+
* Make an HTTP request
|
|
27
|
+
*/
|
|
28
|
+
async request(serviceMethod, request) {
|
|
29
|
+
const [serviceName, methodName] = serviceMethod.split(".");
|
|
30
|
+
const methodKey = `${serviceName}.${methodName}`;
|
|
31
|
+
const pathTemplate = METHOD_PATHS[methodKey] || `/v1/${serviceName.toLowerCase()}/${methodName}`;
|
|
32
|
+
const path = this.interpolatePath(pathTemplate, request);
|
|
33
|
+
const body = messageToPlain(request);
|
|
34
|
+
const httpMethod = this.getHttpMethod(serviceName, methodName);
|
|
35
|
+
const url = new URL(path, this.options.baseURL);
|
|
36
|
+
if (httpMethod === "GET") {
|
|
37
|
+
Object.entries(body).forEach(([key, value]) => {
|
|
38
|
+
if (value !== void 0 && value !== null) {
|
|
39
|
+
url.searchParams.set(key, String(value));
|
|
40
|
+
}
|
|
41
|
+
});
|
|
42
|
+
}
|
|
43
|
+
const headers = {
|
|
44
|
+
"Content-Type": "application/json",
|
|
45
|
+
...this.options.headers
|
|
46
|
+
};
|
|
47
|
+
if (this.authToken) {
|
|
48
|
+
headers["Authorization"] = `Bearer ${this.authToken}`;
|
|
49
|
+
}
|
|
50
|
+
try {
|
|
51
|
+
const response = await this.fetchWithTimeout(
|
|
52
|
+
url.toString(),
|
|
53
|
+
{
|
|
54
|
+
method: httpMethod,
|
|
55
|
+
headers,
|
|
56
|
+
body: httpMethod !== "GET" ? JSON.stringify(body) : void 0
|
|
57
|
+
},
|
|
58
|
+
this.options.timeout
|
|
59
|
+
);
|
|
60
|
+
if (response.status === 401 && this.options.refreshAuthToken) {
|
|
61
|
+
const newToken = await this.refreshToken();
|
|
62
|
+
if (newToken) {
|
|
63
|
+
headers["Authorization"] = `Bearer ${newToken}`;
|
|
64
|
+
const retryResponse = await this.fetchWithTimeout(
|
|
65
|
+
url.toString(),
|
|
66
|
+
{
|
|
67
|
+
method: httpMethod,
|
|
68
|
+
headers,
|
|
69
|
+
body: httpMethod !== "GET" ? JSON.stringify(body) : void 0
|
|
70
|
+
},
|
|
71
|
+
this.options.timeout
|
|
72
|
+
);
|
|
73
|
+
if (retryResponse.ok) {
|
|
74
|
+
return await this.parseResponse(retryResponse);
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
if (!response.ok) {
|
|
79
|
+
const errorBody = await response.json().catch(() => null);
|
|
80
|
+
throw parseHttpError(response.status, errorBody);
|
|
81
|
+
}
|
|
82
|
+
return await this.parseResponse(response);
|
|
83
|
+
} catch (error) {
|
|
84
|
+
if (error instanceof RefleetError) {
|
|
85
|
+
throw error;
|
|
86
|
+
}
|
|
87
|
+
throw new NetworkError(
|
|
88
|
+
`Network error: ${error instanceof Error ? error.message : "Unknown error"}`
|
|
89
|
+
);
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
/**
|
|
93
|
+
* Parse response and convert to message
|
|
94
|
+
*/
|
|
95
|
+
async parseResponse(response) {
|
|
96
|
+
const json = await response.json();
|
|
97
|
+
return json;
|
|
98
|
+
}
|
|
99
|
+
/**
|
|
100
|
+
* Interpolate path parameters from request
|
|
101
|
+
*/
|
|
102
|
+
interpolatePath(template, request) {
|
|
103
|
+
const plain = messageToPlain(request);
|
|
104
|
+
return template.replace(/\{(\w+)\}/g, (_, key) => {
|
|
105
|
+
const camelKey = key.replace(/_([a-z])/g, (_2, letter) => letter.toUpperCase());
|
|
106
|
+
return String(plain[camelKey] || plain[key] || "");
|
|
107
|
+
});
|
|
108
|
+
}
|
|
109
|
+
/**
|
|
110
|
+
* Get HTTP method for service method
|
|
111
|
+
*/
|
|
112
|
+
getHttpMethod(serviceName, methodName) {
|
|
113
|
+
if (methodName.startsWith("List") || methodName.startsWith("Get")) {
|
|
114
|
+
return "GET";
|
|
115
|
+
}
|
|
116
|
+
return "POST";
|
|
117
|
+
}
|
|
118
|
+
/**
|
|
119
|
+
* Fetch with timeout
|
|
120
|
+
*/
|
|
121
|
+
async fetchWithTimeout(url, options, timeout) {
|
|
122
|
+
const controller = new AbortController();
|
|
123
|
+
const timeoutId = timeout ? setTimeout(() => controller.abort(), timeout) : void 0;
|
|
124
|
+
try {
|
|
125
|
+
const response = await fetch(url, {
|
|
126
|
+
...options,
|
|
127
|
+
signal: controller.signal
|
|
128
|
+
});
|
|
129
|
+
return response;
|
|
130
|
+
} catch (error) {
|
|
131
|
+
if (error instanceof Error && error.name === "AbortError") {
|
|
132
|
+
throw new NetworkError("Request timeout");
|
|
133
|
+
}
|
|
134
|
+
throw error;
|
|
135
|
+
} finally {
|
|
136
|
+
if (timeoutId) {
|
|
137
|
+
clearTimeout(timeoutId);
|
|
138
|
+
}
|
|
139
|
+
}
|
|
140
|
+
}
|
|
141
|
+
/**
|
|
142
|
+
* Refresh auth token
|
|
143
|
+
*/
|
|
144
|
+
async refreshToken() {
|
|
145
|
+
if (this.refreshingToken) {
|
|
146
|
+
return this.refreshingToken;
|
|
147
|
+
}
|
|
148
|
+
if (this.options.refreshAuthToken) {
|
|
149
|
+
this.refreshingToken = this.options.refreshAuthToken();
|
|
150
|
+
try {
|
|
151
|
+
const newToken = await this.refreshingToken;
|
|
152
|
+
this.authToken = newToken;
|
|
153
|
+
return newToken;
|
|
154
|
+
} finally {
|
|
155
|
+
this.refreshingToken = null;
|
|
156
|
+
}
|
|
157
|
+
}
|
|
158
|
+
return void 0;
|
|
159
|
+
}
|
|
160
|
+
setAuthToken(token) {
|
|
161
|
+
this.authToken = token;
|
|
162
|
+
}
|
|
163
|
+
clearAuthToken() {
|
|
164
|
+
this.authToken = void 0;
|
|
165
|
+
}
|
|
166
|
+
}
|
|
167
|
+
|
|
168
|
+
export { HttpTransport };
|
|
169
|
+
//# sourceMappingURL=http.js.map
|