@meshtrade/api-web 1.30.2 → 1.32.0
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/dist/meshtrade/compliance/client/v1/client_pb.d.ts +17 -9
- package/dist/meshtrade/compliance/client/v1/client_pb.js +1 -1
- package/dist/meshtrade/compliance/client/v1/service_web_meshts.d.ts +62 -7
- package/dist/meshtrade/compliance/client/v1/service_web_meshts.js +118 -28
- package/dist/meshtrade/config/index.d.ts +160 -0
- package/dist/meshtrade/config/index.js +210 -0
- package/dist/meshtrade/iam/api_user/v1/api_user_pb.d.ts +12 -4
- package/dist/meshtrade/iam/api_user/v1/api_user_pb.js +1 -1
- package/dist/meshtrade/iam/api_user/v1/service_web_meshts.d.ts +62 -7
- package/dist/meshtrade/iam/api_user/v1/service_web_meshts.js +167 -35
- package/dist/meshtrade/iam/group/v1/group_pb.d.ts +8 -0
- package/dist/meshtrade/iam/group/v1/group_pb.js +1 -1
- package/dist/meshtrade/iam/group/v1/service_web_meshts.d.ts +62 -7
- package/dist/meshtrade/iam/group/v1/service_web_meshts.js +134 -30
- package/dist/meshtrade/iam/user/v1/service_web_meshts.d.ts +62 -7
- package/dist/meshtrade/iam/user/v1/service_web_meshts.js +159 -34
- package/dist/meshtrade/iam/user/v1/user_pb.d.ts +10 -2
- package/dist/meshtrade/iam/user/v1/user_pb.js +1 -1
- package/dist/meshtrade/{common/connectInterceptors.d.ts → interceptors/index.d.ts} +23 -17
- package/dist/meshtrade/{common/connectInterceptors.js → interceptors/index.js} +61 -24
- package/dist/meshtrade/ledger/transaction/v1/service_web_meshts.d.ts +62 -7
- package/dist/meshtrade/ledger/transaction/v1/service_web_meshts.js +110 -27
- package/dist/meshtrade/market_data/price/v1/service_web_meshts.d.ts +62 -7
- package/dist/meshtrade/market_data/price/v1/service_web_meshts.js +102 -26
- package/dist/meshtrade/reporting/account_report/v1/service_web_meshts.d.ts +62 -7
- package/dist/meshtrade/reporting/account_report/v1/service_web_meshts.js +110 -27
- package/dist/meshtrade/studio/instrument/v1/instrument_pb.d.ts +8 -0
- package/dist/meshtrade/studio/instrument/v1/instrument_pb.js +1 -1
- package/dist/meshtrade/trading/limit_order/v1/limit_order_pb.d.ts +16 -8
- package/dist/meshtrade/trading/limit_order/v1/limit_order_pb.js +1 -1
- package/dist/meshtrade/trading/limit_order/v1/service_pb.js +1 -1
- package/dist/meshtrade/trading/limit_order/v1/service_web_meshts.d.ts +62 -7
- package/dist/meshtrade/trading/limit_order/v1/service_web_meshts.js +151 -33
- package/dist/meshtrade/trading/market_order/v1/service_web_meshts.d.ts +62 -7
- package/dist/meshtrade/trading/market_order/v1/service_web_meshts.js +102 -26
- package/dist/meshtrade/wallet/account/v1/account_pb.d.ts +8 -0
- package/dist/meshtrade/wallet/account/v1/account_pb.js +1 -1
- package/dist/meshtrade/wallet/account/v1/service_web_meshts.d.ts +62 -7
- package/dist/meshtrade/wallet/account/v1/service_web_meshts.js +167 -35
- package/package.json +19 -2
- package/dist/meshtrade/common/config.d.ts +0 -7
- package/dist/meshtrade/common/config.js +0 -9
- package/dist/meshtrade/common/validation.d.ts +0 -62
- package/dist/meshtrade/common/validation.js +0 -77
|
@@ -0,0 +1,210 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Configuration options for Meshtrade API clients using functional options pattern.
|
|
4
|
+
*
|
|
5
|
+
* Supports flexible authentication modes with optional group context:
|
|
6
|
+
*
|
|
7
|
+
* 1. **No Authentication** (public APIs):
|
|
8
|
+
* ```typescript
|
|
9
|
+
* const client = new ServiceNode(
|
|
10
|
+
* WithServerUrl("http://localhost:10000")
|
|
11
|
+
* );
|
|
12
|
+
* ```
|
|
13
|
+
*
|
|
14
|
+
* 2. **API Key Authentication** (backend services):
|
|
15
|
+
* ```typescript
|
|
16
|
+
* const client = new ServiceNode(
|
|
17
|
+
* WithAPIKey("your-api-key"),
|
|
18
|
+
* WithGroup("groups/01ARZ3NDEKTSV4YWVF8F5BH32"),
|
|
19
|
+
* WithServerUrl("https://api.example.com")
|
|
20
|
+
* );
|
|
21
|
+
* ```
|
|
22
|
+
*
|
|
23
|
+
* 3. **JWT Token Authentication** (Next.js backend with user session):
|
|
24
|
+
* ```typescript
|
|
25
|
+
* const client = new ServiceNode(
|
|
26
|
+
* WithJWTAccessToken("eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9..."),
|
|
27
|
+
* WithServerUrl("https://api.example.com")
|
|
28
|
+
* );
|
|
29
|
+
* ```
|
|
30
|
+
*
|
|
31
|
+
* 4. **JWT with Group Context** (user session with specific group):
|
|
32
|
+
* ```typescript
|
|
33
|
+
* const client = new ServiceNode(
|
|
34
|
+
* WithJWTAccessToken("eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9..."),
|
|
35
|
+
* WithGroup("groups/01ARZ3NDEKTSV4YWVF8F5BH32"),
|
|
36
|
+
* WithServerUrl("https://api.example.com")
|
|
37
|
+
* );
|
|
38
|
+
* ```
|
|
39
|
+
*/
|
|
40
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
41
|
+
exports.ClientConfig = void 0;
|
|
42
|
+
exports.WithAPIKey = WithAPIKey;
|
|
43
|
+
exports.WithJWTAccessToken = WithJWTAccessToken;
|
|
44
|
+
exports.WithGroup = WithGroup;
|
|
45
|
+
exports.WithServerUrl = WithServerUrl;
|
|
46
|
+
exports.buildConfigFromOptions = buildConfigFromOptions;
|
|
47
|
+
/**
|
|
48
|
+
* Internal configuration class used to build client configuration.
|
|
49
|
+
*/
|
|
50
|
+
class ClientConfig {
|
|
51
|
+
constructor() {
|
|
52
|
+
/** API server URL (default: production) */
|
|
53
|
+
this.apiServerURL = "http://localhost:10000";
|
|
54
|
+
}
|
|
55
|
+
/**
|
|
56
|
+
* Validates the configuration.
|
|
57
|
+
* @throws {Error} If both API key and JWT token are provided (mutually exclusive)
|
|
58
|
+
*/
|
|
59
|
+
validate() {
|
|
60
|
+
if (this.apiKey && this.jwtToken) {
|
|
61
|
+
throw new Error("API key and JWT token authentication are mutually exclusive. " +
|
|
62
|
+
"Please use WithAPIKey() OR WithJWTAccessToken(), not both.");
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
exports.ClientConfig = ClientConfig;
|
|
67
|
+
/**
|
|
68
|
+
* Configures the client with an API key for service-to-service authentication.
|
|
69
|
+
*
|
|
70
|
+
* **Mutually Exclusive**: Cannot be used with WithJWTAccessToken().
|
|
71
|
+
* **Optional**: Can be combined with WithGroup() for group-specific operations.
|
|
72
|
+
*
|
|
73
|
+
* @param apiKey - The API key for authentication
|
|
74
|
+
* @returns A client option function
|
|
75
|
+
*
|
|
76
|
+
* @example
|
|
77
|
+
* ```typescript
|
|
78
|
+
* const client = new ServiceNode(
|
|
79
|
+
* WithAPIKey("your-api-key"),
|
|
80
|
+
* WithGroup("groups/01ARZ3NDEKTSV4YWVF8F5BH32")
|
|
81
|
+
* );
|
|
82
|
+
* ```
|
|
83
|
+
*/
|
|
84
|
+
function WithAPIKey(apiKey) {
|
|
85
|
+
return (config) => {
|
|
86
|
+
if (!apiKey || apiKey.trim() === "") {
|
|
87
|
+
throw new Error("API key cannot be empty");
|
|
88
|
+
}
|
|
89
|
+
if (config.jwtToken) {
|
|
90
|
+
throw new Error("Cannot use both WithAPIKey() and WithJWTAccessToken(). " +
|
|
91
|
+
"Please choose one authentication method.");
|
|
92
|
+
}
|
|
93
|
+
config.apiKey = apiKey;
|
|
94
|
+
};
|
|
95
|
+
}
|
|
96
|
+
/**
|
|
97
|
+
* Configures the client with a JWT access token for user session authentication.
|
|
98
|
+
*
|
|
99
|
+
* **Mutually Exclusive**: Cannot be used with WithAPIKey().
|
|
100
|
+
* **Optional**: Can be combined with WithGroup() for group-specific operations.
|
|
101
|
+
*
|
|
102
|
+
* The JWT is injected as a cookie header (Cookie: AccessToken=<jwt>)
|
|
103
|
+
* so the server can extract it from the request.
|
|
104
|
+
*
|
|
105
|
+
* @param token - The JWT access token from the user's session
|
|
106
|
+
* @returns A client option function
|
|
107
|
+
*
|
|
108
|
+
* @example
|
|
109
|
+
* ```typescript
|
|
110
|
+
* const client = new ServiceNode(
|
|
111
|
+
* WithJWTAccessToken("eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9..."),
|
|
112
|
+
* WithGroup("groups/01ARZ3NDEKTSV4YWVF8F5BH32")
|
|
113
|
+
* );
|
|
114
|
+
* ```
|
|
115
|
+
*/
|
|
116
|
+
function WithJWTAccessToken(token) {
|
|
117
|
+
return (config) => {
|
|
118
|
+
if (!token || token.trim() === "") {
|
|
119
|
+
throw new Error("JWT token cannot be empty");
|
|
120
|
+
}
|
|
121
|
+
if (config.apiKey) {
|
|
122
|
+
throw new Error("Cannot use both WithJWTAccessToken() and WithAPIKey(). " +
|
|
123
|
+
"Please choose one authentication method.");
|
|
124
|
+
}
|
|
125
|
+
config.jwtToken = token;
|
|
126
|
+
};
|
|
127
|
+
}
|
|
128
|
+
/**
|
|
129
|
+
* Configures the client with a group context for operations.
|
|
130
|
+
*
|
|
131
|
+
* **Optional**: Can be used with WithAPIKey() or WithJWTAccessToken().
|
|
132
|
+
* When used alone without authentication, adds group header to requests.
|
|
133
|
+
*
|
|
134
|
+
* @param group - The group resource name in format "groups/{ulid}"
|
|
135
|
+
* @returns A client option function
|
|
136
|
+
*
|
|
137
|
+
* @example
|
|
138
|
+
* ```typescript
|
|
139
|
+
* // With API Key
|
|
140
|
+
* const client = new ServiceNode(
|
|
141
|
+
* WithAPIKey("your-api-key"),
|
|
142
|
+
* WithGroup("groups/01ARZ3NDEKTSV4YWVF8F5BH32")
|
|
143
|
+
* );
|
|
144
|
+
*
|
|
145
|
+
* // With JWT
|
|
146
|
+
* const client = new ServiceNode(
|
|
147
|
+
* WithJWTAccessToken("eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9..."),
|
|
148
|
+
* WithGroup("groups/01ARZ3NDEKTSV4YWVF8F5BH32")
|
|
149
|
+
* );
|
|
150
|
+
* ```
|
|
151
|
+
*/
|
|
152
|
+
function WithGroup(group) {
|
|
153
|
+
return (config) => {
|
|
154
|
+
if (!group || group.trim() === "") {
|
|
155
|
+
throw new Error("Group cannot be empty");
|
|
156
|
+
}
|
|
157
|
+
config.group = group;
|
|
158
|
+
};
|
|
159
|
+
}
|
|
160
|
+
/**
|
|
161
|
+
* Configures the client with a custom server URL.
|
|
162
|
+
*
|
|
163
|
+
* **Optional**: If not provided, defaults to localhost:10000.
|
|
164
|
+
*
|
|
165
|
+
* @param url - The API server URL
|
|
166
|
+
* @returns A client option function
|
|
167
|
+
*
|
|
168
|
+
* @example
|
|
169
|
+
* ```typescript
|
|
170
|
+
* const client = new ServiceNode(
|
|
171
|
+
* WithServerUrl("http://localhost:10000"),
|
|
172
|
+
* WithAPIKey("your-api-key"),
|
|
173
|
+
* WithGroup("groups/01ARZ3NDEKTSV4YWVF8F5BH32")
|
|
174
|
+
* );
|
|
175
|
+
* ```
|
|
176
|
+
*/
|
|
177
|
+
function WithServerUrl(url) {
|
|
178
|
+
return (config) => {
|
|
179
|
+
if (!url || url.trim() === "") {
|
|
180
|
+
throw new Error("Server URL cannot be empty");
|
|
181
|
+
}
|
|
182
|
+
config.apiServerURL = url;
|
|
183
|
+
};
|
|
184
|
+
}
|
|
185
|
+
/**
|
|
186
|
+
* Builds client configuration from an array of option functions.
|
|
187
|
+
*
|
|
188
|
+
* @param opts - Variable number of option functions
|
|
189
|
+
* @returns A validated ClientConfig instance
|
|
190
|
+
* @throws {Error} If configuration is invalid (e.g., both API key and JWT provided)
|
|
191
|
+
*
|
|
192
|
+
* @example
|
|
193
|
+
* ```typescript
|
|
194
|
+
* const config = buildConfigFromOptions(
|
|
195
|
+
* WithAPIKey("your-api-key"),
|
|
196
|
+
* WithGroup("groups/01ARZ3NDEKTSV4YWVF8F5BH32"),
|
|
197
|
+
* WithServerUrl("https://api.example.com")
|
|
198
|
+
* );
|
|
199
|
+
* ```
|
|
200
|
+
*/
|
|
201
|
+
function buildConfigFromOptions(...opts) {
|
|
202
|
+
const config = new ClientConfig();
|
|
203
|
+
// Apply each option
|
|
204
|
+
for (const opt of opts) {
|
|
205
|
+
opt(config);
|
|
206
|
+
}
|
|
207
|
+
// Validate the final configuration
|
|
208
|
+
config.validate();
|
|
209
|
+
return config;
|
|
210
|
+
}
|
|
@@ -34,12 +34,20 @@ export type APIUser = Message<"meshtrade.iam.api_user.v1.APIUser"> & {
|
|
|
34
34
|
* @generated from field: string owner = 2;
|
|
35
35
|
*/
|
|
36
36
|
owner: string;
|
|
37
|
+
/**
|
|
38
|
+
*
|
|
39
|
+
* Ownership hiearchy of groups that have access to this resource in the format groups/{group_id}.
|
|
40
|
+
* System set on creation.
|
|
41
|
+
*
|
|
42
|
+
* @generated from field: repeated string owners = 3;
|
|
43
|
+
*/
|
|
44
|
+
owners: string[];
|
|
37
45
|
/**
|
|
38
46
|
*
|
|
39
47
|
* A non-unique, user-provided name for the API user, used for display purposes.
|
|
40
48
|
* Required on creation.
|
|
41
49
|
*
|
|
42
|
-
* @generated from field: string display_name =
|
|
50
|
+
* @generated from field: string display_name = 4;
|
|
43
51
|
*/
|
|
44
52
|
displayName: string;
|
|
45
53
|
/**
|
|
@@ -47,7 +55,7 @@ export type APIUser = Message<"meshtrade.iam.api_user.v1.APIUser"> & {
|
|
|
47
55
|
* The current state of the API user (active or inactive).
|
|
48
56
|
* System set on creation to default value of inactive.
|
|
49
57
|
*
|
|
50
|
-
* @generated from field: meshtrade.iam.api_user.v1.APIUserState state =
|
|
58
|
+
* @generated from field: meshtrade.iam.api_user.v1.APIUserState state = 5;
|
|
51
59
|
*/
|
|
52
60
|
state: APIUserState;
|
|
53
61
|
/**
|
|
@@ -56,7 +64,7 @@ export type APIUser = Message<"meshtrade.iam.api_user.v1.APIUser"> & {
|
|
|
56
64
|
* prepended by the name of the group in which they have been assigned that role.
|
|
57
65
|
* e.g. groups/{ULIDv2}/roles/{role}, where role is a value of the meshtrade.iam.role.v1.Role enum.
|
|
58
66
|
*
|
|
59
|
-
* @generated from field: repeated string roles =
|
|
67
|
+
* @generated from field: repeated string roles = 6;
|
|
60
68
|
*/
|
|
61
69
|
roles: string[];
|
|
62
70
|
/**
|
|
@@ -65,7 +73,7 @@ export type APIUser = Message<"meshtrade.iam.api_user.v1.APIUser"> & {
|
|
|
65
73
|
* This field is only populated on the entity the first time it is returned after creation - it is NOT stored.
|
|
66
74
|
* Populated once by system on creation.
|
|
67
75
|
*
|
|
68
|
-
* @generated from field: string api_key =
|
|
76
|
+
* @generated from field: string api_key = 7;
|
|
69
77
|
*/
|
|
70
78
|
apiKey: string;
|
|
71
79
|
};
|
|
@@ -9,7 +9,7 @@ const validate_pb_1 = require("../../../../buf/validate/validate_pb");
|
|
|
9
9
|
/**
|
|
10
10
|
* Describes the file meshtrade/iam/api_user/v1/api_user.proto.
|
|
11
11
|
*/
|
|
12
|
-
exports.file_meshtrade_iam_api_user_v1_api_user = (0, codegenv2_1.fileDesc)("
|
|
12
|
+
exports.file_meshtrade_iam_api_user_v1_api_user = (0, codegenv2_1.fileDesc)("CihtZXNodHJhZGUvaWFtL2FwaV91c2VyL3YxL2FwaV91c2VyLnByb3RvEhltZXNodHJhZGUuaWFtLmFwaV91c2VyLnYxIsAGCgdBUElVc2VyErwBCgRuYW1lGAEgASgJQq0BukipAboBpQEKFG5hbWUuZm9ybWF0Lm9wdGlvbmFsEjZuYW1lIG11c3QgYmUgZW1wdHkgb3IgaW4gdGhlIGZvcm1hdCBhcGlfdXNlcnMve1VMSUR2Mn0aVXNpemUodGhpcykgPT0gMCB8fCB0aGlzLm1hdGNoZXMoJ15hcGlfdXNlcnMvWzAxMjM0NTY3ODlBQkNERUZHSEpLTU5QUVJTVFZXWFlaXXsyNn0kJykSSwoFb3duZXIYAiABKAlCPLpIOcgBAXI0Mi9eZ3JvdXBzL1swMTIzNDU2Nzg5QUJDREVGR0hKS01OUFFSU1RWV1hZWl17MjZ9JJgBIRJOCgZvd25lcnMYAyADKAlCPrpIO5IBOCI2cjQyL15ncm91cHMvWzAxMjM0NTY3ODlBQkNERUZHSEpLTU5QUVJTVFZXWFlaXXsyNn0kmAEhEqcBCgxkaXNwbGF5X25hbWUYBCABKAlCkAG6SIwBugF/ChVkaXNwbGF5X25hbWUucmVxdWlyZWQSQWRpc3BsYXkgbmFtZSBpcyByZXF1aXJlZCBhbmQgbXVzdCBiZSBiZXR3ZWVuIDEgYW5kIDI1NSBjaGFyYWN0ZXJzGiNzaXplKHRoaXMpID4gMCAmJiBzaXplKHRoaXMpIDw9IDI1NcgBAXIFEAEY/wEStwEKBXN0YXRlGAUgASgOMicubWVzaHRyYWRlLmlhbS5hcGlfdXNlci52MS5BUElVc2VyU3RhdGVCf7pIfLoBdAoLc3RhdGUudmFsaWQSL3N0YXRlIG11c3QgYmUgYSB2YWxpZCBBUElVc2VyU3RhdGUgaWYgc3BlY2lmaWVkGjRpbnQodGhpcykgPT0gMCB8fCAoaW50KHRoaXMpID49IDEgJiYgaW50KHRoaXMpIDw9IDIpggECEAESZAoFcm9sZXMYBiADKAlCVbpIUpIBTyJNcksQLxgwMkVeZ3JvdXBzL1swMTIzNDU2Nzg5QUJDREVGR0hKS01OUFFSU1RWV1hZWl17MjZ9L3JvbGVzL1sxLTldWzAtOV17Niw3fSQSDwoHYXBpX2tleRgHIAEoCSpmCgxBUElVc2VyU3RhdGUSHgoaQVBJX1VTRVJfU1RBVEVfVU5TUEVDSUZJRUQQABIZChVBUElfVVNFUl9TVEFURV9BQ1RJVkUQARIbChdBUElfVVNFUl9TVEFURV9JTkFDVElWRRACKqYBCg1BUElVc2VyQWN0aW9uEh8KG0FQSV9VU0VSX0FDVElPTl9VTlNQRUNJRklFRBAAEhwKGEFQSV9VU0VSX0FDVElPTl9BQ1RJVkFURRABEh4KGkFQSV9VU0VSX0FDVElPTl9ERUFDVElWQVRFEAISGgoWQVBJX1VTRVJfQUNUSU9OX0NSRUFURRADEhoKFkFQSV9VU0VSX0FDVElPTl9VUERBVEUQBEJuCiBjby5tZXNodHJhZGUuYXBpLmlhbS5hcGlfdXNlci52MUIRQXBpVXNlck91dGVyQ2xhc3NaN2dpdGh1Yi5jb20vbWVzaHRyYWRlL2FwaS9nby9pYW0vYXBpX3VzZXIvdjE7YXBpX3VzZXJfdjFiBnByb3RvMw", [validate_pb_1.file_buf_validate_validate]);
|
|
13
13
|
/**
|
|
14
14
|
* Describes the message meshtrade.iam.api_user.v1.APIUser.
|
|
15
15
|
* Use `create(APIUserSchema)` to create a new message.
|
|
@@ -1,30 +1,85 @@
|
|
|
1
|
-
import { Interceptor } from "@connectrpc/connect";
|
|
2
1
|
import { ActivateAPIUserRequest, AssignRolesToAPIUserRequest, CreateAPIUserRequest, DeactivateAPIUserRequest, GetAPIUserByKeyHashRequest, GetAPIUserRequest, ListAPIUsersRequest, ListAPIUsersResponse, RevokeRolesFromAPIUserRequest, SearchAPIUsersRequest, SearchAPIUsersResponse } from "./service_pb";
|
|
3
2
|
import { APIUser } from "./api_user_pb";
|
|
4
|
-
import {
|
|
3
|
+
import { ClientOption } from "../../../config";
|
|
5
4
|
/**
|
|
6
5
|
* Web client for interacting with the meshtrade.iam.api_user.v1 apiuser v1 API resource service.
|
|
7
|
-
* Uses Connect-ES with gRPC-Web transport for browser-
|
|
6
|
+
* Uses Connect-ES with gRPC-Web transport for browser-based communication.
|
|
7
|
+
*
|
|
8
|
+
* Supports flexible authentication modes using functional options pattern:
|
|
9
|
+
*
|
|
10
|
+
* 1. **No Authentication** (public APIs):
|
|
11
|
+
* ```typescript
|
|
12
|
+
* const client = new APIUserServiceWeb(
|
|
13
|
+
* WithServerUrl("http://localhost:10000")
|
|
14
|
+
* );
|
|
15
|
+
* ```
|
|
16
|
+
*
|
|
17
|
+
* 2. **API Key Authentication** (backend services):
|
|
18
|
+
* ```typescript
|
|
19
|
+
* const client = new APIUserServiceWeb(
|
|
20
|
+
* WithAPIKey("your-api-key"),
|
|
21
|
+
* WithGroup("groups/01ARZ3NDEKTSV4YWVF8F5BH32"),
|
|
22
|
+
* WithServerUrl("https://api.example.com")
|
|
23
|
+
* );
|
|
24
|
+
* ```
|
|
25
|
+
*
|
|
26
|
+
* 3. **JWT Token Authentication** (Next.js frontend with user session):
|
|
27
|
+
* ```typescript
|
|
28
|
+
* const client = new APIUserServiceWeb(
|
|
29
|
+
* WithJWTAccessToken("eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9..."),
|
|
30
|
+
* WithServerUrl("https://api.example.com")
|
|
31
|
+
* );
|
|
32
|
+
* ```
|
|
33
|
+
*
|
|
34
|
+
* 4. **JWT with Group Context** (user session with specific group):
|
|
35
|
+
* ```typescript
|
|
36
|
+
* const client = new APIUserServiceWeb(
|
|
37
|
+
* WithJWTAccessToken("eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9..."),
|
|
38
|
+
* WithGroup("groups/01ARZ3NDEKTSV4YWVF8F5BH32"),
|
|
39
|
+
* WithServerUrl("https://api.example.com")
|
|
40
|
+
* );
|
|
41
|
+
* ```
|
|
42
|
+
*
|
|
43
|
+
* Available options:
|
|
44
|
+
* - `WithAPIKey(key)` - API key authentication (mutually exclusive with JWT)
|
|
45
|
+
* - `WithJWTAccessToken(token)` - JWT authentication (mutually exclusive with API key)
|
|
46
|
+
* - `WithGroup(group)` - Group context (optional, works with both auth modes)
|
|
47
|
+
* - `WithServerUrl(url)` - Custom server URL (optional, defaults to production)
|
|
8
48
|
*/
|
|
9
49
|
export declare class APIUserServiceWeb {
|
|
10
50
|
private _client;
|
|
11
51
|
private readonly _config;
|
|
12
52
|
private readonly _interceptors;
|
|
53
|
+
private readonly _validator;
|
|
13
54
|
/**
|
|
14
55
|
* Constructs an instance of APIUserServiceWeb.
|
|
15
|
-
*
|
|
16
|
-
*
|
|
56
|
+
*
|
|
57
|
+
* Uses functional options pattern for flexible configuration:
|
|
58
|
+
* - `WithAPIKey(key)` - API key authentication
|
|
59
|
+
* - `WithJWTAccessToken(token)` - JWT authentication
|
|
60
|
+
* - `WithGroup(group)` - Group context (optional)
|
|
61
|
+
* - `WithServerUrl(url)` - Custom server URL (optional)
|
|
62
|
+
*
|
|
63
|
+
* @param {...ClientOption} opts - Variable number of configuration options
|
|
17
64
|
*/
|
|
18
|
-
constructor(
|
|
65
|
+
constructor(...opts: ClientOption[]);
|
|
19
66
|
/**
|
|
20
67
|
* Returns a new client instance configured to send the specified group
|
|
21
68
|
* resource name in the request headers for subsequent API calls.
|
|
22
69
|
*
|
|
70
|
+
* This method creates a new client with the same authentication configuration
|
|
71
|
+
* but with the group context updated to the specified value.
|
|
72
|
+
*
|
|
73
|
+
* **Compatibility**: Works with all authentication modes:
|
|
74
|
+
* - **API key auth**: Creates new client with API key + new group
|
|
75
|
+
* - **JWT auth**: Creates new client with JWT + new group
|
|
76
|
+
* - **No auth**: Creates new client with standalone group interceptor
|
|
77
|
+
*
|
|
23
78
|
* @param {string} group - The operating group context to inject into the request
|
|
24
79
|
* in the format `groups/{ulid}` where {ulid} is a 26-character ULID.
|
|
25
80
|
* Example: 'groups/01ARZ3NDEKTSV4YWVF8F5BH32'
|
|
26
81
|
* @returns {APIUserServiceWeb} A new, configured instance of the client.
|
|
27
|
-
* @throws {Error} If the group format is invalid
|
|
82
|
+
* @throws {Error} If the group format is invalid
|
|
28
83
|
*/
|
|
29
84
|
withGroup(group: string): APIUserServiceWeb;
|
|
30
85
|
/**
|
|
@@ -7,28 +7,87 @@ exports.APIUserServiceWeb = void 0;
|
|
|
7
7
|
const connect_1 = require("@connectrpc/connect");
|
|
8
8
|
const connect_web_1 = require("@connectrpc/connect-web");
|
|
9
9
|
const service_pb_1 = require("./service_pb");
|
|
10
|
-
const
|
|
11
|
-
const
|
|
12
|
-
const
|
|
10
|
+
const service_pb_2 = require("./service_pb");
|
|
11
|
+
const config_1 = require("../../../config");
|
|
12
|
+
const protovalidate_1 = require("@bufbuild/protovalidate");
|
|
13
|
+
const interceptors_1 = require("../../../interceptors");
|
|
13
14
|
/**
|
|
14
15
|
* Web client for interacting with the meshtrade.iam.api_user.v1 apiuser v1 API resource service.
|
|
15
|
-
* Uses Connect-ES with gRPC-Web transport for browser-
|
|
16
|
+
* Uses Connect-ES with gRPC-Web transport for browser-based communication.
|
|
17
|
+
*
|
|
18
|
+
* Supports flexible authentication modes using functional options pattern:
|
|
19
|
+
*
|
|
20
|
+
* 1. **No Authentication** (public APIs):
|
|
21
|
+
* ```typescript
|
|
22
|
+
* const client = new APIUserServiceWeb(
|
|
23
|
+
* WithServerUrl("http://localhost:10000")
|
|
24
|
+
* );
|
|
25
|
+
* ```
|
|
26
|
+
*
|
|
27
|
+
* 2. **API Key Authentication** (backend services):
|
|
28
|
+
* ```typescript
|
|
29
|
+
* const client = new APIUserServiceWeb(
|
|
30
|
+
* WithAPIKey("your-api-key"),
|
|
31
|
+
* WithGroup("groups/01ARZ3NDEKTSV4YWVF8F5BH32"),
|
|
32
|
+
* WithServerUrl("https://api.example.com")
|
|
33
|
+
* );
|
|
34
|
+
* ```
|
|
35
|
+
*
|
|
36
|
+
* 3. **JWT Token Authentication** (Next.js frontend with user session):
|
|
37
|
+
* ```typescript
|
|
38
|
+
* const client = new APIUserServiceWeb(
|
|
39
|
+
* WithJWTAccessToken("eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9..."),
|
|
40
|
+
* WithServerUrl("https://api.example.com")
|
|
41
|
+
* );
|
|
42
|
+
* ```
|
|
43
|
+
*
|
|
44
|
+
* 4. **JWT with Group Context** (user session with specific group):
|
|
45
|
+
* ```typescript
|
|
46
|
+
* const client = new APIUserServiceWeb(
|
|
47
|
+
* WithJWTAccessToken("eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9..."),
|
|
48
|
+
* WithGroup("groups/01ARZ3NDEKTSV4YWVF8F5BH32"),
|
|
49
|
+
* WithServerUrl("https://api.example.com")
|
|
50
|
+
* );
|
|
51
|
+
* ```
|
|
52
|
+
*
|
|
53
|
+
* Available options:
|
|
54
|
+
* - `WithAPIKey(key)` - API key authentication (mutually exclusive with JWT)
|
|
55
|
+
* - `WithJWTAccessToken(token)` - JWT authentication (mutually exclusive with API key)
|
|
56
|
+
* - `WithGroup(group)` - Group context (optional, works with both auth modes)
|
|
57
|
+
* - `WithServerUrl(url)` - Custom server URL (optional, defaults to production)
|
|
16
58
|
*/
|
|
17
59
|
class APIUserServiceWeb {
|
|
18
60
|
/**
|
|
19
61
|
* Constructs an instance of APIUserServiceWeb.
|
|
20
|
-
*
|
|
21
|
-
*
|
|
62
|
+
*
|
|
63
|
+
* Uses functional options pattern for flexible configuration:
|
|
64
|
+
* - `WithAPIKey(key)` - API key authentication
|
|
65
|
+
* - `WithJWTAccessToken(token)` - JWT authentication
|
|
66
|
+
* - `WithGroup(group)` - Group context (optional)
|
|
67
|
+
* - `WithServerUrl(url)` - Custom server URL (optional)
|
|
68
|
+
*
|
|
69
|
+
* @param {...ClientOption} opts - Variable number of configuration options
|
|
22
70
|
*/
|
|
23
|
-
constructor(
|
|
24
|
-
|
|
25
|
-
this.
|
|
26
|
-
//
|
|
71
|
+
constructor(...opts) {
|
|
72
|
+
// Build configuration from options
|
|
73
|
+
this._config = (0, config_1.buildConfigFromOptions)(...opts);
|
|
74
|
+
// Initialize validator for request validation
|
|
75
|
+
this._validator = (0, protovalidate_1.createValidator)();
|
|
76
|
+
this._interceptors = [];
|
|
77
|
+
this._interceptors.push((0, interceptors_1.createLoggingInterceptor)());
|
|
78
|
+
if (this._config.apiKey) {
|
|
79
|
+
this._interceptors.push((0, interceptors_1.createApiKeyInterceptor)(this._config.apiKey));
|
|
80
|
+
}
|
|
81
|
+
if (this._config.jwtToken) {
|
|
82
|
+
this._interceptors.push((0, interceptors_1.createJwtInterceptor)(this._config.jwtToken));
|
|
83
|
+
}
|
|
84
|
+
if (this._config.group) {
|
|
85
|
+
this._interceptors.push((0, interceptors_1.createGroupInterceptor)(this._config.group));
|
|
86
|
+
}
|
|
87
|
+
// Create the gRPC-Web transport for browser with interceptors
|
|
27
88
|
const transport = (0, connect_web_1.createGrpcWebTransport)({
|
|
28
89
|
baseUrl: this._config.apiServerURL,
|
|
29
90
|
interceptors: this._interceptors,
|
|
30
|
-
// Enable credentials (cookies) for cross-origin requests
|
|
31
|
-
fetch: (input, init) => globalThis.fetch(input, { ...init, credentials: 'include' }),
|
|
32
91
|
});
|
|
33
92
|
// Construct the Connect-ES client
|
|
34
93
|
this._client = (0, connect_1.createClient)(service_pb_1.APIUserService, transport);
|
|
@@ -37,26 +96,36 @@ class APIUserServiceWeb {
|
|
|
37
96
|
* Returns a new client instance configured to send the specified group
|
|
38
97
|
* resource name in the request headers for subsequent API calls.
|
|
39
98
|
*
|
|
99
|
+
* This method creates a new client with the same authentication configuration
|
|
100
|
+
* but with the group context updated to the specified value.
|
|
101
|
+
*
|
|
102
|
+
* **Compatibility**: Works with all authentication modes:
|
|
103
|
+
* - **API key auth**: Creates new client with API key + new group
|
|
104
|
+
* - **JWT auth**: Creates new client with JWT + new group
|
|
105
|
+
* - **No auth**: Creates new client with standalone group interceptor
|
|
106
|
+
*
|
|
40
107
|
* @param {string} group - The operating group context to inject into the request
|
|
41
108
|
* in the format `groups/{ulid}` where {ulid} is a 26-character ULID.
|
|
42
109
|
* Example: 'groups/01ARZ3NDEKTSV4YWVF8F5BH32'
|
|
43
110
|
* @returns {APIUserServiceWeb} A new, configured instance of the client.
|
|
44
|
-
* @throws {Error} If the group format is invalid
|
|
111
|
+
* @throws {Error} If the group format is invalid
|
|
45
112
|
*/
|
|
46
113
|
withGroup(group) {
|
|
47
|
-
//
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
114
|
+
// Build new options array with existing auth and updated group
|
|
115
|
+
const newOpts = [];
|
|
116
|
+
// Add server URL
|
|
117
|
+
newOpts.push((0, config_1.WithServerUrl)(this._config.apiServerURL));
|
|
118
|
+
// Add authentication (preserve existing mode)
|
|
119
|
+
if (this._config.apiKey) {
|
|
120
|
+
newOpts.push((0, config_1.WithAPIKey)(this._config.apiKey));
|
|
121
|
+
}
|
|
122
|
+
else if (this._config.jwtToken) {
|
|
123
|
+
newOpts.push((0, config_1.WithJWTAccessToken)(this._config.jwtToken));
|
|
124
|
+
}
|
|
125
|
+
// Add the new group
|
|
126
|
+
newOpts.push((0, config_1.WithGroup)(group));
|
|
127
|
+
// Return a new client instance with updated configuration
|
|
128
|
+
return new APIUserServiceWeb(...newOpts);
|
|
60
129
|
}
|
|
61
130
|
/**
|
|
62
131
|
* Retrieves an apiuser.
|
|
@@ -65,7 +134,14 @@ class APIUserServiceWeb {
|
|
|
65
134
|
*/
|
|
66
135
|
getAPIUser(request) {
|
|
67
136
|
// Validate request
|
|
68
|
-
(
|
|
137
|
+
const result = this._validator.validate(service_pb_2.GetAPIUserRequestSchema, request);
|
|
138
|
+
if (result.kind === "invalid") {
|
|
139
|
+
const violations = result.violations.map(v => `${v.field.toString()}: ${v.message}`).join("; ");
|
|
140
|
+
throw new Error(`Validation failed: ${violations}`);
|
|
141
|
+
}
|
|
142
|
+
else if (result.kind === "error") {
|
|
143
|
+
throw result.error;
|
|
144
|
+
}
|
|
69
145
|
return this._client.getAPIUser(request);
|
|
70
146
|
}
|
|
71
147
|
/**
|
|
@@ -75,7 +151,14 @@ class APIUserServiceWeb {
|
|
|
75
151
|
*/
|
|
76
152
|
createAPIUser(request) {
|
|
77
153
|
// Validate request
|
|
78
|
-
(
|
|
154
|
+
const result = this._validator.validate(service_pb_2.CreateAPIUserRequestSchema, request);
|
|
155
|
+
if (result.kind === "invalid") {
|
|
156
|
+
const violations = result.violations.map(v => `${v.field.toString()}: ${v.message}`).join("; ");
|
|
157
|
+
throw new Error(`Validation failed: ${violations}`);
|
|
158
|
+
}
|
|
159
|
+
else if (result.kind === "error") {
|
|
160
|
+
throw result.error;
|
|
161
|
+
}
|
|
79
162
|
return this._client.createAPIUser(request);
|
|
80
163
|
}
|
|
81
164
|
/**
|
|
@@ -85,7 +168,14 @@ class APIUserServiceWeb {
|
|
|
85
168
|
*/
|
|
86
169
|
assignRolesToAPIUser(request) {
|
|
87
170
|
// Validate request
|
|
88
|
-
(
|
|
171
|
+
const result = this._validator.validate(service_pb_2.AssignRolesToAPIUserRequestSchema, request);
|
|
172
|
+
if (result.kind === "invalid") {
|
|
173
|
+
const violations = result.violations.map(v => `${v.field.toString()}: ${v.message}`).join("; ");
|
|
174
|
+
throw new Error(`Validation failed: ${violations}`);
|
|
175
|
+
}
|
|
176
|
+
else if (result.kind === "error") {
|
|
177
|
+
throw result.error;
|
|
178
|
+
}
|
|
89
179
|
return this._client.assignRolesToAPIUser(request);
|
|
90
180
|
}
|
|
91
181
|
/**
|
|
@@ -95,7 +185,14 @@ class APIUserServiceWeb {
|
|
|
95
185
|
*/
|
|
96
186
|
revokeRolesFromAPIUser(request) {
|
|
97
187
|
// Validate request
|
|
98
|
-
(
|
|
188
|
+
const result = this._validator.validate(service_pb_2.RevokeRolesFromAPIUserRequestSchema, request);
|
|
189
|
+
if (result.kind === "invalid") {
|
|
190
|
+
const violations = result.violations.map(v => `${v.field.toString()}: ${v.message}`).join("; ");
|
|
191
|
+
throw new Error(`Validation failed: ${violations}`);
|
|
192
|
+
}
|
|
193
|
+
else if (result.kind === "error") {
|
|
194
|
+
throw result.error;
|
|
195
|
+
}
|
|
99
196
|
return this._client.revokeRolesFromAPIUser(request);
|
|
100
197
|
}
|
|
101
198
|
/**
|
|
@@ -105,7 +202,14 @@ class APIUserServiceWeb {
|
|
|
105
202
|
*/
|
|
106
203
|
listAPIUsers(request) {
|
|
107
204
|
// Validate request
|
|
108
|
-
(
|
|
205
|
+
const result = this._validator.validate(service_pb_2.ListAPIUsersRequestSchema, request);
|
|
206
|
+
if (result.kind === "invalid") {
|
|
207
|
+
const violations = result.violations.map(v => `${v.field.toString()}: ${v.message}`).join("; ");
|
|
208
|
+
throw new Error(`Validation failed: ${violations}`);
|
|
209
|
+
}
|
|
210
|
+
else if (result.kind === "error") {
|
|
211
|
+
throw result.error;
|
|
212
|
+
}
|
|
109
213
|
return this._client.listAPIUsers(request);
|
|
110
214
|
}
|
|
111
215
|
/**
|
|
@@ -115,7 +219,14 @@ class APIUserServiceWeb {
|
|
|
115
219
|
*/
|
|
116
220
|
searchAPIUsers(request) {
|
|
117
221
|
// Validate request
|
|
118
|
-
(
|
|
222
|
+
const result = this._validator.validate(service_pb_2.SearchAPIUsersRequestSchema, request);
|
|
223
|
+
if (result.kind === "invalid") {
|
|
224
|
+
const violations = result.violations.map(v => `${v.field.toString()}: ${v.message}`).join("; ");
|
|
225
|
+
throw new Error(`Validation failed: ${violations}`);
|
|
226
|
+
}
|
|
227
|
+
else if (result.kind === "error") {
|
|
228
|
+
throw result.error;
|
|
229
|
+
}
|
|
119
230
|
return this._client.searchAPIUsers(request);
|
|
120
231
|
}
|
|
121
232
|
/**
|
|
@@ -125,7 +236,14 @@ class APIUserServiceWeb {
|
|
|
125
236
|
*/
|
|
126
237
|
activateAPIUser(request) {
|
|
127
238
|
// Validate request
|
|
128
|
-
(
|
|
239
|
+
const result = this._validator.validate(service_pb_2.ActivateAPIUserRequestSchema, request);
|
|
240
|
+
if (result.kind === "invalid") {
|
|
241
|
+
const violations = result.violations.map(v => `${v.field.toString()}: ${v.message}`).join("; ");
|
|
242
|
+
throw new Error(`Validation failed: ${violations}`);
|
|
243
|
+
}
|
|
244
|
+
else if (result.kind === "error") {
|
|
245
|
+
throw result.error;
|
|
246
|
+
}
|
|
129
247
|
return this._client.activateAPIUser(request);
|
|
130
248
|
}
|
|
131
249
|
/**
|
|
@@ -135,7 +253,14 @@ class APIUserServiceWeb {
|
|
|
135
253
|
*/
|
|
136
254
|
deactivateAPIUser(request) {
|
|
137
255
|
// Validate request
|
|
138
|
-
(
|
|
256
|
+
const result = this._validator.validate(service_pb_2.DeactivateAPIUserRequestSchema, request);
|
|
257
|
+
if (result.kind === "invalid") {
|
|
258
|
+
const violations = result.violations.map(v => `${v.field.toString()}: ${v.message}`).join("; ");
|
|
259
|
+
throw new Error(`Validation failed: ${violations}`);
|
|
260
|
+
}
|
|
261
|
+
else if (result.kind === "error") {
|
|
262
|
+
throw result.error;
|
|
263
|
+
}
|
|
139
264
|
return this._client.deactivateAPIUser(request);
|
|
140
265
|
}
|
|
141
266
|
/**
|
|
@@ -145,7 +270,14 @@ class APIUserServiceWeb {
|
|
|
145
270
|
*/
|
|
146
271
|
getAPIUserByKeyHash(request) {
|
|
147
272
|
// Validate request
|
|
148
|
-
(
|
|
273
|
+
const result = this._validator.validate(service_pb_2.GetAPIUserByKeyHashRequestSchema, request);
|
|
274
|
+
if (result.kind === "invalid") {
|
|
275
|
+
const violations = result.violations.map(v => `${v.field.toString()}: ${v.message}`).join("; ");
|
|
276
|
+
throw new Error(`Validation failed: ${violations}`);
|
|
277
|
+
}
|
|
278
|
+
else if (result.kind === "error") {
|
|
279
|
+
throw result.error;
|
|
280
|
+
}
|
|
149
281
|
return this._client.getAPIUserByKeyHash(request);
|
|
150
282
|
}
|
|
151
283
|
}
|
|
@@ -35,6 +35,14 @@ export type Group = Message<"meshtrade.iam.group.v1.Group"> & {
|
|
|
35
35
|
* @generated from field: string owner = 2;
|
|
36
36
|
*/
|
|
37
37
|
owner: string;
|
|
38
|
+
/**
|
|
39
|
+
*
|
|
40
|
+
* Ownership hiearchy of groups that have access to this resource in the format groups/{group_id}.
|
|
41
|
+
* System set on creation.
|
|
42
|
+
*
|
|
43
|
+
* @generated from field: repeated string owners = 3;
|
|
44
|
+
*/
|
|
45
|
+
owners: string[];
|
|
38
46
|
/**
|
|
39
47
|
*
|
|
40
48
|
* Human-readable name for organizational identification and display.
|