@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.
Files changed (55) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +56 -0
  3. package/dist/client.js +195 -0
  4. package/dist/client.js.map +1 -0
  5. package/dist/config.js +7 -0
  6. package/dist/config.js.map +1 -0
  7. package/dist/errors.js +96 -0
  8. package/dist/errors.js.map +1 -0
  9. package/dist/index.js +18 -0
  10. package/dist/index.js.map +1 -0
  11. package/dist/proto/api/shared/error_pb.js +7 -0
  12. package/dist/proto/api/shared/error_pb.js.map +1 -0
  13. package/dist/proto/api/shared/user_pb.js +7 -0
  14. package/dist/proto/api/shared/user_pb.js.map +1 -0
  15. package/dist/proto/api/v1/auth_pb.js +12 -0
  16. package/dist/proto/api/v1/auth_pb.js.map +1 -0
  17. package/dist/proto/api/v1/hello_pb.js +9 -0
  18. package/dist/proto/api/v1/hello_pb.js.map +1 -0
  19. package/dist/proto/api/v1/libraries_pb.js +10 -0
  20. package/dist/proto/api/v1/libraries_pb.js.map +1 -0
  21. package/dist/proto/api/v1/teams_pb.js +10 -0
  22. package/dist/proto/api/v1/teams_pb.js.map +1 -0
  23. package/dist/proto/buf/validate/validate_pb.js +7 -0
  24. package/dist/proto/buf/validate/validate_pb.js.map +1 -0
  25. package/dist/proto/google/api/annotations_pb.js +8 -0
  26. package/dist/proto/google/api/annotations_pb.js.map +1 -0
  27. package/dist/proto/google/api/http_pb.js +6 -0
  28. package/dist/proto/google/api/http_pb.js.map +1 -0
  29. package/dist/services/ai.js +217 -0
  30. package/dist/services/ai.js.map +1 -0
  31. package/dist/services/auth.js +105 -0
  32. package/dist/services/auth.js.map +1 -0
  33. package/dist/services/base.js +27 -0
  34. package/dist/services/base.js.map +1 -0
  35. package/dist/services/collections.js +208 -0
  36. package/dist/services/collections.js.map +1 -0
  37. package/dist/services/files.js +82 -0
  38. package/dist/services/files.js.map +1 -0
  39. package/dist/services/libraries.js +162 -0
  40. package/dist/services/libraries.js.map +1 -0
  41. package/dist/services/runtime-vars.js +84 -0
  42. package/dist/services/runtime-vars.js.map +1 -0
  43. package/dist/services/subscriptions.js +178 -0
  44. package/dist/services/subscriptions.js.map +1 -0
  45. package/dist/services/teams.js +194 -0
  46. package/dist/services/teams.js.map +1 -0
  47. package/dist/services/users.js +65 -0
  48. package/dist/services/users.js.map +1 -0
  49. package/dist/transports/grpc.js +194 -0
  50. package/dist/transports/grpc.js.map +1 -0
  51. package/dist/transports/http.js +169 -0
  52. package/dist/transports/http.js.map +1 -0
  53. package/dist/transports/service-registry.js +49 -0
  54. package/dist/transports/service-registry.js.map +1 -0
  55. 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