@toshicloud/sdk 0.4.0 → 0.5.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/README.md +44 -3
- package/dist/client.d.ts +7 -2
- package/dist/client.js +9 -3
- package/dist/errors.d.ts +47 -0
- package/dist/errors.js +136 -0
- package/dist/gen/toshi/permission_pb.d.ts +39 -0
- package/dist/gen/toshi/permission_pb.js +42 -0
- package/dist/gen/toshi/workspace/v1/artifacts_pb.d.ts +1 -1
- package/dist/gen/toshi/workspace/v1/artifacts_pb.js +3 -2
- package/dist/gen/toshi/workspace/v1/audit_events_pb.js +2 -1
- package/dist/gen/toshi/workspace/v1/channels_pb.js +2 -1
- package/dist/gen/toshi/workspace/v1/discovery_pb.d.ts +676 -0
- package/dist/gen/toshi/workspace/v1/discovery_pb.js +182 -0
- package/dist/gen/toshi/workspace/v1/display_pb.js +2 -1
- package/dist/gen/toshi/workspace/v1/fillers_pb.js +2 -1
- package/dist/gen/toshi/workspace/v1/hostjobs_pb.js +2 -1
- package/dist/gen/toshi/workspace/v1/hosts_pb.js +2 -1
- package/dist/gen/toshi/workspace/v1/products_pb.d.ts +703 -0
- package/dist/gen/toshi/workspace/v1/products_pb.js +106 -0
- package/dist/gen/toshi/workspace/v1/projects_pb.js +2 -1
- package/dist/gen/toshi/workspace/v1/recordings_pb.js +2 -1
- package/dist/gen/toshi/workspace/v1/secrets_pb.js +2 -1
- package/dist/gen/toshi/workspace/v1/storage_providers_pb.js +2 -1
- package/dist/gen/toshi/workspace/v1/tokens_pb.js +2 -1
- package/dist/gen/toshi/workspace/v1/volumes_pb.js +2 -1
- package/dist/gen/toshi/workspace/v1/webhook_pb.js +2 -1
- package/dist/gen/toshi/workspace/v1/workloads_pb.js +2 -1
- package/dist/gen/toshi/workspace/v1/workspace_pb.d.ts +2 -2
- package/dist/gen/toshi/workspace/v1/workspace_pb.js +1 -1
- package/dist/gen/toshi/workspace/v1/workspace_service_pb.js +2 -1
- package/dist/index.d.ts +3 -1
- package/dist/index.js +3 -1
- package/dist/interceptors.d.ts +6 -0
- package/dist/interceptors.js +29 -0
- package/dist/retry.js +4 -0
- package/dist/version.d.ts +1 -1
- package/dist/version.js +1 -1
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -135,8 +135,8 @@ picked up without a new client.
|
|
|
135
135
|
The client has one field per Workspace API service: `project`, `secret`,
|
|
136
136
|
`webhook`, `display`, `channel`, `recording`, `volume`, `artifact`,
|
|
137
137
|
`artifactUpload`, `workspace`, `hostJob`, `host`, `token`, `auditEvent`,
|
|
138
|
-
`filler` and `
|
|
139
|
-
client.
|
|
138
|
+
`filler`, `storageProvider`, `product` and `discovery`, each holding that
|
|
139
|
+
service's generated client.
|
|
140
140
|
`workload` holds `WorkloadService`'s calls, grouped by the type they
|
|
141
141
|
name: `workload.jobs`, `workload.sandboxes` and `workload.services`, one
|
|
142
142
|
method for each call (`create`, `get`, `list`, `update`, `delete`,
|
|
@@ -305,6 +305,46 @@ await run.wait(); // rejects with JobExitError on a non-zero exit
|
|
|
305
305
|
Stopping the loop stops only the output stream: the job keeps running,
|
|
306
306
|
and `workload.jobs.cancel` ends it.
|
|
307
307
|
|
|
308
|
+
## Products that are off
|
|
309
|
+
|
|
310
|
+
A call for a product that is off for the workspace, or that turns on an
|
|
311
|
+
outside product without accepting the access it asks for, rejects with a
|
|
312
|
+
`ProductError`, `wait`, the watches and `execute` included.
|
|
313
|
+
`isProductError(err)` tells it apart. It is still a `ConnectError` with the
|
|
314
|
+
same `code`, and it has the product's ID (`product`), the `reason`
|
|
315
|
+
(`ProductReason.NotInstalled`, `Disabled`, `NotEntitled`, `TurnedOff` or
|
|
316
|
+
`AccessNotAccepted`), the setting that turns the product on (`feature`,
|
|
317
|
+
such as `runners.enabled`), how far a product the deployment disables has
|
|
318
|
+
wound down (`state`) and, for `AccessNotAccepted`, the access to accept
|
|
319
|
+
(`access`).
|
|
320
|
+
|
|
321
|
+
<!-- examples/product-error.ts -->
|
|
322
|
+
|
|
323
|
+
```ts
|
|
324
|
+
|
|
325
|
+
// Turning an outside product on installs it, and the API asks the caller to
|
|
326
|
+
// accept the access it wants first.
|
|
327
|
+
const enable = { id: "acme_ci", enabled: true, acceptedAccess: [] as string[] };
|
|
328
|
+
try {
|
|
329
|
+
try {
|
|
330
|
+
await toshi.product.updateProduct(enable);
|
|
331
|
+
} catch (err) {
|
|
332
|
+
if (!isProductError(err) || err.reason !== ProductReason.AccessNotAccepted) {
|
|
333
|
+
throw err;
|
|
334
|
+
}
|
|
335
|
+
console.log(err.product, err.reason, err.access);
|
|
336
|
+
// Accept exactly the access the product asks for.
|
|
337
|
+
await toshi.product.updateProduct({ ...enable, acceptedAccess: err.access });
|
|
338
|
+
}
|
|
339
|
+
} catch (err) {
|
|
340
|
+
if (!isProductError(err)) {
|
|
341
|
+
throw err;
|
|
342
|
+
}
|
|
343
|
+
// Off for the workspace: say which product and why.
|
|
344
|
+
console.log(err.product, err.reason, err.feature);
|
|
345
|
+
}
|
|
346
|
+
```
|
|
347
|
+
|
|
308
348
|
## Testing with `@toshicloud/sdk/test`
|
|
309
349
|
|
|
310
350
|
`createFake()` serves the whole Workspace API in memory: no server, no port,
|
|
@@ -340,7 +380,8 @@ first, with the procedure, the request and the headers.
|
|
|
340
380
|
[`protoc-gen-es`](https://github.com/bufbuild/protobuf-es) from the protos
|
|
341
381
|
in `proto/toshi/workspace/v1` of the
|
|
342
382
|
[toshi-api](https://github.com/toshicloud/toshi-api) repository, one
|
|
343
|
-
`*_pb.ts` file per proto
|
|
383
|
+
`*_pb.ts` file per proto, and `src/gen/toshi/permission_pb.ts` from
|
|
384
|
+
`proto/toshi/permission.proto`, which they import. The generated code is committed and imports
|
|
344
385
|
only `@bufbuild/protobuf`, so installing the package needs no generator.
|
|
345
386
|
|
|
346
387
|
`pin.env` names the toshi-api commit (or, once one exists, the release
|
package/dist/client.d.ts
CHANGED
|
@@ -3,10 +3,12 @@ import type { Client, Interceptor, Transport } from "@connectrpc/connect";
|
|
|
3
3
|
import { ArtifactService, ArtifactUploadService } from "./gen/toshi/workspace/v1/artifacts_pb.js";
|
|
4
4
|
import { AuditEventService } from "./gen/toshi/workspace/v1/audit_events_pb.js";
|
|
5
5
|
import { ChannelService } from "./gen/toshi/workspace/v1/channels_pb.js";
|
|
6
|
+
import { DiscoveryService } from "./gen/toshi/workspace/v1/discovery_pb.js";
|
|
6
7
|
import { DisplayService } from "./gen/toshi/workspace/v1/display_pb.js";
|
|
7
8
|
import { FillerService } from "./gen/toshi/workspace/v1/fillers_pb.js";
|
|
8
9
|
import { HostJobService } from "./gen/toshi/workspace/v1/hostjobs_pb.js";
|
|
9
10
|
import { HostService } from "./gen/toshi/workspace/v1/hosts_pb.js";
|
|
11
|
+
import { ProductService } from "./gen/toshi/workspace/v1/products_pb.js";
|
|
10
12
|
import { ProjectService } from "./gen/toshi/workspace/v1/projects_pb.js";
|
|
11
13
|
import { RecordingService } from "./gen/toshi/workspace/v1/recordings_pb.js";
|
|
12
14
|
import { SecretService } from "./gen/toshi/workspace/v1/secrets_pb.js";
|
|
@@ -64,6 +66,8 @@ export interface ToshiClient {
|
|
|
64
66
|
readonly auditEvent: Client<typeof AuditEventService>;
|
|
65
67
|
readonly filler: Client<typeof FillerService>;
|
|
66
68
|
readonly storageProvider: Client<typeof StorageProviderService>;
|
|
69
|
+
readonly product: Client<typeof ProductService>;
|
|
70
|
+
readonly discovery: Client<typeof DiscoveryService>;
|
|
67
71
|
run(req: MessageInitShape<typeof CreateJobRequestSchema>, opts?: CallOptions): Promise<JobRun>;
|
|
68
72
|
}
|
|
69
73
|
/** WorkloadService's calls, grouped by the type they name. */
|
|
@@ -181,8 +185,9 @@ export interface JobRun extends AsyncIterable<OutputChunk> {
|
|
|
181
185
|
wait(): Promise<void>;
|
|
182
186
|
}
|
|
183
187
|
/**
|
|
184
|
-
* Creates the client: one normalized retry setting, the scope, key,
|
|
185
|
-
* auth interceptors (
|
|
188
|
+
* Creates the client: one normalized retry setting, the product, scope, key,
|
|
189
|
+
* retry and auth interceptors (product outermost, so a product's refusal
|
|
190
|
+
* reaches the caller as a ProductError; auth innermost, so no interceptor sees
|
|
186
191
|
* the Authorization header), one transport for every client and helper.
|
|
187
192
|
*
|
|
188
193
|
* Since 0.2.0 the workload calls are grouped by the type they name under
|
package/dist/client.js
CHANGED
|
@@ -4,10 +4,12 @@ import { executeCommand } from "./execute.js";
|
|
|
4
4
|
import { ArtifactService, ArtifactUploadService } from "./gen/toshi/workspace/v1/artifacts_pb.js";
|
|
5
5
|
import { AuditEventService } from "./gen/toshi/workspace/v1/audit_events_pb.js";
|
|
6
6
|
import { ChannelService } from "./gen/toshi/workspace/v1/channels_pb.js";
|
|
7
|
+
import { DiscoveryService } from "./gen/toshi/workspace/v1/discovery_pb.js";
|
|
7
8
|
import { DisplayService } from "./gen/toshi/workspace/v1/display_pb.js";
|
|
8
9
|
import { FillerService } from "./gen/toshi/workspace/v1/fillers_pb.js";
|
|
9
10
|
import { HostJobService } from "./gen/toshi/workspace/v1/hostjobs_pb.js";
|
|
10
11
|
import { HostService } from "./gen/toshi/workspace/v1/hosts_pb.js";
|
|
12
|
+
import { ProductService } from "./gen/toshi/workspace/v1/products_pb.js";
|
|
11
13
|
import { ProjectService } from "./gen/toshi/workspace/v1/projects_pb.js";
|
|
12
14
|
import { RecordingService } from "./gen/toshi/workspace/v1/recordings_pb.js";
|
|
13
15
|
import { SecretService } from "./gen/toshi/workspace/v1/secrets_pb.js";
|
|
@@ -20,15 +22,16 @@ import { CancelJobRequestSchema, CreateJobRequestSchema, CreateSandboxRequestSch
|
|
|
20
22
|
import { ExecuteStartSchema, GetOperationRequestSchema, HoldServiceRequestSchema, ListEventsRequestSchema, ListServiceRunsRequestSchema, ReleaseServiceRequestSchema, SetServiceModeRequestSchema, StartServiceRequestSchema, StopServiceRequestSchema, WaitOperationRequestSchema, WakeServiceRequestSchema, WatchEventsRequestSchema, WatchOutputRequestSchema, } from "./gen/toshi/workspace/v1/workspace_pb.js";
|
|
21
23
|
import { openOutputWatch } from "./output.js";
|
|
22
24
|
import { paginate } from "./paginate.js";
|
|
23
|
-
import { authInterceptor, keyInterceptor, retryInterceptor, scopeInterceptor } from "./interceptors.js";
|
|
25
|
+
import { authInterceptor, keyInterceptor, productInterceptor, retryInterceptor, scopeInterceptor, } from "./interceptors.js";
|
|
24
26
|
import { normalizeRetry } from "./retry.js";
|
|
25
27
|
import { withDefaultUnaryTimeout } from "./timeout.js";
|
|
26
28
|
import { openEventWatch, openJobWatch, openSandboxWatch, openServiceWatch } from "./watch.js";
|
|
27
29
|
import { runJob } from "./run.js";
|
|
28
30
|
import { waitJob, waitOperation, waitSandbox, waitService } from "./wait.js";
|
|
29
31
|
/**
|
|
30
|
-
* Creates the client: one normalized retry setting, the scope, key,
|
|
31
|
-
* auth interceptors (
|
|
32
|
+
* Creates the client: one normalized retry setting, the product, scope, key,
|
|
33
|
+
* retry and auth interceptors (product outermost, so a product's refusal
|
|
34
|
+
* reaches the caller as a ProductError; auth innermost, so no interceptor sees
|
|
32
35
|
* the Authorization header), one transport for every client and helper.
|
|
33
36
|
*
|
|
34
37
|
* Since 0.2.0 the workload calls are grouped by the type they name under
|
|
@@ -38,6 +41,7 @@ import { waitJob, waitOperation, waitSandbox, waitService } from "./wait.js";
|
|
|
38
41
|
export function createToshiClient(options) {
|
|
39
42
|
const retry = normalizeRetry(options.retry);
|
|
40
43
|
const interceptors = [
|
|
44
|
+
productInterceptor(),
|
|
41
45
|
scopeInterceptor(options.project ?? "", options.environment ?? ""),
|
|
42
46
|
keyInterceptor(),
|
|
43
47
|
retryInterceptor(retry),
|
|
@@ -111,5 +115,7 @@ export function createToshiClient(options) {
|
|
|
111
115
|
auditEvent: createClient(AuditEventService, transport),
|
|
112
116
|
filler: createClient(FillerService, transport),
|
|
113
117
|
storageProvider: createClient(StorageProviderService, transport),
|
|
118
|
+
product: createClient(ProductService, transport),
|
|
119
|
+
discovery: createClient(DiscoveryService, transport),
|
|
114
120
|
};
|
|
115
121
|
}
|
package/dist/errors.d.ts
CHANGED
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { ConnectError } from "@connectrpc/connect";
|
|
1
2
|
import type { ExecutionExit, OutputEnd } from "./gen/toshi/workspace/v1/workspace_pb.js";
|
|
2
3
|
/** A command that ended non-zero, or was cancelled before it had a status (errors.go:9-26). */
|
|
3
4
|
export declare class ExitError extends Error {
|
|
@@ -26,3 +27,49 @@ export declare class StreamLostError extends Error {
|
|
|
26
27
|
readonly requestKey: string;
|
|
27
28
|
constructor(executionId: string, requestKey: string, cause?: unknown);
|
|
28
29
|
}
|
|
30
|
+
/** Why the API refused a call for a product: the reason of the refusal's ErrorInfo detail. */
|
|
31
|
+
export type ProductReason = "PRODUCT_NOT_INSTALLED" | "PRODUCT_DISABLED" | "PRODUCT_NOT_ENTITLED" | "PRODUCT_TURNED_OFF" | "ACCESS_NOT_ACCEPTED";
|
|
32
|
+
/** The reasons a call is refused for a product. */
|
|
33
|
+
export declare const ProductReason: {
|
|
34
|
+
/** The deployment's build does not include the product; the code is Unimplemented. */
|
|
35
|
+
readonly NotInstalled: "PRODUCT_NOT_INSTALLED";
|
|
36
|
+
/** The deployment turned the product off; the code is FailedPrecondition. */
|
|
37
|
+
readonly Disabled: "PRODUCT_DISABLED";
|
|
38
|
+
/** The workspace's entitlements leave the product out; the code is PermissionDenied. */
|
|
39
|
+
readonly NotEntitled: "PRODUCT_NOT_ENTITLED";
|
|
40
|
+
/**
|
|
41
|
+
* The workspace's settings turn the product off, or an outside product's
|
|
42
|
+
* installation is turned off; the code is FailedPrecondition.
|
|
43
|
+
*/
|
|
44
|
+
readonly TurnedOff: "PRODUCT_TURNED_OFF";
|
|
45
|
+
/**
|
|
46
|
+
* Turning an outside product on installs it, and the call did not accept the
|
|
47
|
+
* access it asks for; the code is FailedPrecondition.
|
|
48
|
+
*/
|
|
49
|
+
readonly AccessNotAccepted: "ACCESS_NOT_ACCEPTED";
|
|
50
|
+
};
|
|
51
|
+
/**
|
|
52
|
+
* The API's refusal of a call for a product: one that is off for the
|
|
53
|
+
* workspace, or an outside product whose access the call did not accept.
|
|
54
|
+
* Every call the client makes throws it in place of the ConnectError, wait,
|
|
55
|
+
* watch and execute included. It is a ConnectError, so `instanceof
|
|
56
|
+
* ConnectError` and `code` read as before; test for it with
|
|
57
|
+
* {@link isProductError}.
|
|
58
|
+
*/
|
|
59
|
+
export declare class ProductError extends ConnectError {
|
|
60
|
+
/** The product's ID, such as `runners`. */
|
|
61
|
+
readonly product: string;
|
|
62
|
+
readonly reason: ProductReason;
|
|
63
|
+
/** The setting that turns the product on, such as `runners.enabled`; empty for ACCESS_NOT_ACCEPTED. */
|
|
64
|
+
readonly feature: string;
|
|
65
|
+
/** How far a product the deployment disables has wound down: `no_new_work`, `draining` or `stopped`; empty otherwise. */
|
|
66
|
+
readonly state: string;
|
|
67
|
+
/** The access an outside product asks for, for ACCESS_NOT_ACCEPTED: accept exactly this list to install it. */
|
|
68
|
+
readonly access: string[];
|
|
69
|
+
constructor(err: ConnectError, reason: ProductReason, metadata: ReadonlyMap<string, string>);
|
|
70
|
+
static [Symbol.hasInstance](v: unknown): boolean;
|
|
71
|
+
}
|
|
72
|
+
/** Reports whether err is a product's refusal. */
|
|
73
|
+
export declare function isProductError(err: unknown): err is ProductError;
|
|
74
|
+
/** err as a ProductError when it is a product's refusal, and err unchanged otherwise. */
|
|
75
|
+
export declare function asProductError(err: unknown): unknown;
|
package/dist/errors.js
CHANGED
|
@@ -1,3 +1,5 @@
|
|
|
1
|
+
import { BinaryReader, WireType } from "@bufbuild/protobuf/wire";
|
|
2
|
+
import { ConnectError } from "@connectrpc/connect";
|
|
1
3
|
/** A command that ended non-zero, or was cancelled before it had a status (errors.go:9-26). */
|
|
2
4
|
export class ExitError extends Error {
|
|
3
5
|
/** The execution the exit belongs to. */
|
|
@@ -75,3 +77,137 @@ function describe(cause) {
|
|
|
75
77
|
}
|
|
76
78
|
return "the stream ended";
|
|
77
79
|
}
|
|
80
|
+
/** The reasons a call is refused for a product. */
|
|
81
|
+
export const ProductReason = {
|
|
82
|
+
/** The deployment's build does not include the product; the code is Unimplemented. */
|
|
83
|
+
NotInstalled: "PRODUCT_NOT_INSTALLED",
|
|
84
|
+
/** The deployment turned the product off; the code is FailedPrecondition. */
|
|
85
|
+
Disabled: "PRODUCT_DISABLED",
|
|
86
|
+
/** The workspace's entitlements leave the product out; the code is PermissionDenied. */
|
|
87
|
+
NotEntitled: "PRODUCT_NOT_ENTITLED",
|
|
88
|
+
/**
|
|
89
|
+
* The workspace's settings turn the product off, or an outside product's
|
|
90
|
+
* installation is turned off; the code is FailedPrecondition.
|
|
91
|
+
*/
|
|
92
|
+
TurnedOff: "PRODUCT_TURNED_OFF",
|
|
93
|
+
/**
|
|
94
|
+
* Turning an outside product on installs it, and the call did not accept the
|
|
95
|
+
* access it asks for; the code is FailedPrecondition.
|
|
96
|
+
*/
|
|
97
|
+
AccessNotAccepted: "ACCESS_NOT_ACCEPTED",
|
|
98
|
+
};
|
|
99
|
+
const productReasons = new Set(Object.values(ProductReason));
|
|
100
|
+
// The ErrorInfo domain of a product's refusal.
|
|
101
|
+
const productErrorDomain = "toshi.run";
|
|
102
|
+
/**
|
|
103
|
+
* The API's refusal of a call for a product: one that is off for the
|
|
104
|
+
* workspace, or an outside product whose access the call did not accept.
|
|
105
|
+
* Every call the client makes throws it in place of the ConnectError, wait,
|
|
106
|
+
* watch and execute included. It is a ConnectError, so `instanceof
|
|
107
|
+
* ConnectError` and `code` read as before; test for it with
|
|
108
|
+
* {@link isProductError}.
|
|
109
|
+
*/
|
|
110
|
+
export class ProductError extends ConnectError {
|
|
111
|
+
/** The product's ID, such as `runners`. */
|
|
112
|
+
product;
|
|
113
|
+
reason;
|
|
114
|
+
/** The setting that turns the product on, such as `runners.enabled`; empty for ACCESS_NOT_ACCEPTED. */
|
|
115
|
+
feature;
|
|
116
|
+
/** How far a product the deployment disables has wound down: `no_new_work`, `draining` or `stopped`; empty otherwise. */
|
|
117
|
+
state;
|
|
118
|
+
/** The access an outside product asks for, for ACCESS_NOT_ACCEPTED: accept exactly this list to install it. */
|
|
119
|
+
access;
|
|
120
|
+
constructor(err, reason, metadata) {
|
|
121
|
+
super(err.rawMessage, err.code, err.metadata, undefined, err);
|
|
122
|
+
// ConnectError's instanceof accepts a subclass only by this name.
|
|
123
|
+
this.name = "ConnectError";
|
|
124
|
+
this.details = err.details;
|
|
125
|
+
this.product = metadata.get("product") ?? "";
|
|
126
|
+
this.reason = reason;
|
|
127
|
+
this.feature = metadata.get("feature") ?? "";
|
|
128
|
+
this.state = metadata.get("state") ?? "";
|
|
129
|
+
const access = metadata.get("access") ?? "";
|
|
130
|
+
this.access = access === "" ? [] : access.split(",");
|
|
131
|
+
}
|
|
132
|
+
// ConnectError's own check would accept any ConnectError.
|
|
133
|
+
static [Symbol.hasInstance](v) {
|
|
134
|
+
return Function.prototype[Symbol.hasInstance].call(ProductError, v);
|
|
135
|
+
}
|
|
136
|
+
}
|
|
137
|
+
/** Reports whether err is a product's refusal. */
|
|
138
|
+
export function isProductError(err) {
|
|
139
|
+
return err instanceof ProductError;
|
|
140
|
+
}
|
|
141
|
+
/** err as a ProductError when it is a product's refusal, and err unchanged otherwise. */
|
|
142
|
+
export function asProductError(err) {
|
|
143
|
+
if (!(err instanceof ConnectError) || err instanceof ProductError) {
|
|
144
|
+
return err;
|
|
145
|
+
}
|
|
146
|
+
for (const detail of err.details) {
|
|
147
|
+
if (!("type" in detail) || detail.type !== "google.rpc.ErrorInfo") {
|
|
148
|
+
continue;
|
|
149
|
+
}
|
|
150
|
+
const info = decodeErrorInfo(detail.value);
|
|
151
|
+
if (info === undefined || info.domain !== productErrorDomain || !productReasons.has(info.reason)) {
|
|
152
|
+
continue;
|
|
153
|
+
}
|
|
154
|
+
return new ProductError(err, info.reason, info.metadata);
|
|
155
|
+
}
|
|
156
|
+
return err;
|
|
157
|
+
}
|
|
158
|
+
/**
|
|
159
|
+
* Reads a google.rpc.ErrorInfo message: reason (1), domain (2) and metadata
|
|
160
|
+
* (3), a map of strings. It reads the wire format itself, so the SDK needs no
|
|
161
|
+
* package for the googleapis types.
|
|
162
|
+
*/
|
|
163
|
+
function decodeErrorInfo(bytes) {
|
|
164
|
+
const info = { reason: "", domain: "", metadata: new Map() };
|
|
165
|
+
try {
|
|
166
|
+
const reader = new BinaryReader(bytes);
|
|
167
|
+
while (reader.pos < reader.len) {
|
|
168
|
+
const [field, wireType] = reader.tag();
|
|
169
|
+
if (wireType !== WireType.LengthDelimited) {
|
|
170
|
+
reader.skip(wireType);
|
|
171
|
+
continue;
|
|
172
|
+
}
|
|
173
|
+
switch (field) {
|
|
174
|
+
case 1:
|
|
175
|
+
info.reason = reader.string();
|
|
176
|
+
break;
|
|
177
|
+
case 2:
|
|
178
|
+
info.domain = reader.string();
|
|
179
|
+
break;
|
|
180
|
+
case 3: {
|
|
181
|
+
const [key, value] = decodeMapEntry(reader.bytes());
|
|
182
|
+
info.metadata.set(key, value);
|
|
183
|
+
break;
|
|
184
|
+
}
|
|
185
|
+
default:
|
|
186
|
+
reader.skip(wireType);
|
|
187
|
+
}
|
|
188
|
+
}
|
|
189
|
+
}
|
|
190
|
+
catch {
|
|
191
|
+
return undefined;
|
|
192
|
+
}
|
|
193
|
+
return info;
|
|
194
|
+
}
|
|
195
|
+
/** Reads one entry of a map<string, string>: key (1), value (2). */
|
|
196
|
+
function decodeMapEntry(bytes) {
|
|
197
|
+
let key = "";
|
|
198
|
+
let value = "";
|
|
199
|
+
const reader = new BinaryReader(bytes);
|
|
200
|
+
while (reader.pos < reader.len) {
|
|
201
|
+
const [field, wireType] = reader.tag();
|
|
202
|
+
if (wireType === WireType.LengthDelimited && field === 1) {
|
|
203
|
+
key = reader.string();
|
|
204
|
+
}
|
|
205
|
+
else if (wireType === WireType.LengthDelimited && field === 2) {
|
|
206
|
+
value = reader.string();
|
|
207
|
+
}
|
|
208
|
+
else {
|
|
209
|
+
reader.skip(wireType);
|
|
210
|
+
}
|
|
211
|
+
}
|
|
212
|
+
return [key, value];
|
|
213
|
+
}
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
import type { GenExtension, GenFile } from "@bufbuild/protobuf/codegenv2";
|
|
2
|
+
import type { MethodOptions } from "@bufbuild/protobuf/wkt";
|
|
3
|
+
/**
|
|
4
|
+
* Describes the file toshi/permission.proto.
|
|
5
|
+
*/
|
|
6
|
+
export declare const file_toshi_permission: GenFile;
|
|
7
|
+
/**
|
|
8
|
+
* permission names what a caller needs to make the call: an area and a
|
|
9
|
+
* level. "<area>.read" sees what the area holds and "<area>.write" changes
|
|
10
|
+
* it, where the area is a product, such as "sandboxes", or a part of the
|
|
11
|
+
* workspace, such as "secrets". A call that needs more than its area's
|
|
12
|
+
* level names a permission of its own, such as "debug.connect" for the key
|
|
13
|
+
* into a host job's debug session.
|
|
14
|
+
*
|
|
15
|
+
* Every Workspace API method carries it, and a method without it fails the
|
|
16
|
+
* build: the control plane's check table and the permissions page are
|
|
17
|
+
* generated from it. A workspace that is suspended keeps the calls whose
|
|
18
|
+
* level is "read".
|
|
19
|
+
*
|
|
20
|
+
* @generated from extension: string permission = 51000;
|
|
21
|
+
*/
|
|
22
|
+
export declare const permission: GenExtension<MethodOptions, string>;
|
|
23
|
+
/**
|
|
24
|
+
* scope names what a call acts in: "workspace", the default when the
|
|
25
|
+
* option is absent, or "project" or "environment" for a call that names a
|
|
26
|
+
* project or an environment of the workspace, or a resource that belongs
|
|
27
|
+
* to one. A token limited to a project, or to one of its environments,
|
|
28
|
+
* makes only the calls whose scope is "project" or "environment".
|
|
29
|
+
*
|
|
30
|
+
* A method whose request has a project or environment field (project,
|
|
31
|
+
* project_id, environment, environment_id) names its scope, and the build
|
|
32
|
+
* checks it against that field: "environment" when the request has an
|
|
33
|
+
* environment field, "project" when it has only a project field, or
|
|
34
|
+
* "workspace" when the field is not where the call acts, such as the
|
|
35
|
+
* project a new token is limited to.
|
|
36
|
+
*
|
|
37
|
+
* @generated from extension: string scope = 51001;
|
|
38
|
+
*/
|
|
39
|
+
export declare const scope: GenExtension<MethodOptions, string>;
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
// @generated by protoc-gen-es v2.16.0 with parameter "target=ts,json_types=true,import_extension=js"
|
|
2
|
+
// @generated from file toshi/permission.proto (package toshi, syntax proto3)
|
|
3
|
+
/* eslint-disable */
|
|
4
|
+
import { extDesc, fileDesc } from "@bufbuild/protobuf/codegenv2";
|
|
5
|
+
import { file_google_protobuf_descriptor } from "@bufbuild/protobuf/wkt";
|
|
6
|
+
/**
|
|
7
|
+
* Describes the file toshi/permission.proto.
|
|
8
|
+
*/
|
|
9
|
+
export const file_toshi_permission = /*@__PURE__*/ fileDesc("ChZ0b3NoaS9wZXJtaXNzaW9uLnByb3RvEgV0b3NoaTpACgpwZXJtaXNzaW9uEh4uZ29vZ2xlLnByb3RvYnVmLk1ldGhvZE9wdGlvbnMYuI4DIAEoCVIKcGVybWlzc2lvbjo2CgVzY29wZRIeLmdvb2dsZS5wcm90b2J1Zi5NZXRob2RPcHRpb25zGLmOAyABKAlSBXNjb3BlQh5aHGdvLnRvc2hpY2xvdWQuaW8vYXBpL3Rvc2hpcGJiBnByb3RvMw", [file_google_protobuf_descriptor]);
|
|
10
|
+
/**
|
|
11
|
+
* permission names what a caller needs to make the call: an area and a
|
|
12
|
+
* level. "<area>.read" sees what the area holds and "<area>.write" changes
|
|
13
|
+
* it, where the area is a product, such as "sandboxes", or a part of the
|
|
14
|
+
* workspace, such as "secrets". A call that needs more than its area's
|
|
15
|
+
* level names a permission of its own, such as "debug.connect" for the key
|
|
16
|
+
* into a host job's debug session.
|
|
17
|
+
*
|
|
18
|
+
* Every Workspace API method carries it, and a method without it fails the
|
|
19
|
+
* build: the control plane's check table and the permissions page are
|
|
20
|
+
* generated from it. A workspace that is suspended keeps the calls whose
|
|
21
|
+
* level is "read".
|
|
22
|
+
*
|
|
23
|
+
* @generated from extension: string permission = 51000;
|
|
24
|
+
*/
|
|
25
|
+
export const permission = /*@__PURE__*/ extDesc(file_toshi_permission, 0);
|
|
26
|
+
/**
|
|
27
|
+
* scope names what a call acts in: "workspace", the default when the
|
|
28
|
+
* option is absent, or "project" or "environment" for a call that names a
|
|
29
|
+
* project or an environment of the workspace, or a resource that belongs
|
|
30
|
+
* to one. A token limited to a project, or to one of its environments,
|
|
31
|
+
* makes only the calls whose scope is "project" or "environment".
|
|
32
|
+
*
|
|
33
|
+
* A method whose request has a project or environment field (project,
|
|
34
|
+
* project_id, environment, environment_id) names its scope, and the build
|
|
35
|
+
* checks it against that field: "environment" when the request has an
|
|
36
|
+
* environment field, "project" when it has only a project field, or
|
|
37
|
+
* "workspace" when the field is not where the call acts, such as the
|
|
38
|
+
* project a new token is limited to.
|
|
39
|
+
*
|
|
40
|
+
* @generated from extension: string scope = 51001;
|
|
41
|
+
*/
|
|
42
|
+
export const scope = /*@__PURE__*/ extDesc(file_toshi_permission, 1);
|
|
@@ -757,7 +757,7 @@ export declare const GetArtifactDownloadURLResponseSchema: GenMessage<GetArtifac
|
|
|
757
757
|
* it reserves an artifact, uploads each part to a presigned URL, and
|
|
758
758
|
* completes the upload. The caller is the workload itself: every call
|
|
759
759
|
* carries a workload identity token for the audience
|
|
760
|
-
* "toshi:artifacts", and the
|
|
760
|
+
* "toshi:artifacts", and the workspace, project, environment, workload and
|
|
761
761
|
* execution of the artifact are the token's claims, never the request's.
|
|
762
762
|
* A token of another audience, a display token, an expired token, or one
|
|
763
763
|
* that names no workload is refused with UNAUTHENTICATED. A workspace that
|
|
@@ -3,11 +3,12 @@
|
|
|
3
3
|
/* eslint-disable */
|
|
4
4
|
import { fileDesc, messageDesc, serviceDesc } from "@bufbuild/protobuf/codegenv2";
|
|
5
5
|
import { file_google_protobuf_timestamp } from "@bufbuild/protobuf/wkt";
|
|
6
|
+
import { file_toshi_permission } from "../../permission_pb.js";
|
|
6
7
|
import { file_toshi_workspace_v1_recordings } from "./recordings_pb.js";
|
|
7
8
|
/**
|
|
8
9
|
* Describes the file toshi/workspace/v1/artifacts.proto.
|
|
9
10
|
*/
|
|
10
|
-
export const file_toshi_workspace_v1_artifacts = /*@__PURE__*/ fileDesc("
|
|
11
|
+
export const file_toshi_workspace_v1_artifacts = /*@__PURE__*/ fileDesc("CiJ0b3NoaS93b3Jrc3BhY2UvdjEvYXJ0aWZhY3RzLnByb3RvEhJ0b3NoaS53b3Jrc3BhY2UudjEi9wIKCEFydGlmYWN0EgoKAmlkGAEgASgJEhIKCnByb2plY3RfaWQYAiABKAkSFgoOZW52aXJvbm1lbnRfaWQYAyABKAkSEwoLd29ya2xvYWRfaWQYBCABKAkSFAoMZXhlY3V0aW9uX2lkGAUgASgJEgwKBGtpbmQYBiABKAkSDAoEbmFtZRgHIAEoCRIUCgxjb250ZW50X3R5cGUYCCABKAkSEgoKcGFydF9jb3VudBgJIAEoAxISCgpwYXJ0X3NpemVzGAogAygDEhIKCmluZGV4X3NpemUYCyABKAMSDQoFc3RhdGUYDCABKAkSEgoKZW5jcnlwdGlvbhgNIAEoCRIuCgpjcmVhdGVkX2F0GA4gASgLMhouZ29vZ2xlLnByb3RvYnVmLlRpbWVzdGFtcBIwCgxjb21wbGV0ZWRfYXQYDyABKAsyGi5nb29nbGUucHJvdG9idWYuVGltZXN0YW1wEhUKDXdvcmtsb2FkX2tpbmQYECABKAkizQEKBlVwbG9hZBIMCgRwYXJ0GAEgASgJEg4KBm1ldGhvZBgCIAEoCRILCgN1cmwYAyABKAkSOAoHaGVhZGVycxgEIAMoCzInLnRvc2hpLndvcmtzcGFjZS52MS5VcGxvYWQuSGVhZGVyc0VudHJ5Ei4KCmV4cGlyZXNfYXQYBSABKAsyGi5nb29nbGUucHJvdG9idWYuVGltZXN0YW1wGi4KDEhlYWRlcnNFbnRyeRILCgNrZXkYASABKAkSDQoFdmFsdWUYAiABKAk6AjgBIqYBChRSZXNlcnZlVXBsb2FkUmVxdWVzdBIMCgRraW5kGAEgASgJEgwKBG5hbWUYAiABKAkSFAoMY29udGVudF90eXBlGAMgASgJEhIKCnBhcnRfc2l6ZXMYBCADKAMSEgoKaW5kZXhfc2l6ZRgFIAEoAxI0CglyZWNvcmRpbmcYBiABKA4yIS50b3NoaS53b3Jrc3BhY2UudjEuUmVjb3JkaW5nS2luZCLKAQoVUmVzZXJ2ZVVwbG9hZFJlc3BvbnNlEhMKC2FydGlmYWN0X2lkGAEgASgJEisKB3VwbG9hZHMYAiADKAsyGi50b3NoaS53b3Jrc3BhY2UudjEuVXBsb2FkEjMKD3VwbG9hZF9kZWFkbGluZRgDIAEoCzIaLmdvb2dsZS5wcm90b2J1Zi5UaW1lc3RhbXASEgoKZW5jcnlwdGlvbhgEIAEoCRIQCghkYXRhX2tleRgFIAEoDBIUCgxndWVzdF91cGxvYWQYBiABKAgiLAoVQ29tcGxldGVVcGxvYWRSZXF1ZXN0EhMKC2FydGlmYWN0X2lkGAEgASgJIkgKFkNvbXBsZXRlVXBsb2FkUmVzcG9uc2USLgoIYXJ0aWZhY3QYASABKAsyHC50b3NoaS53b3Jrc3BhY2UudjEuQXJ0aWZhY3QiogEKFExpc3RBcnRpZmFjdHNSZXF1ZXN0EhIKCnByb2plY3RfaWQYASABKAkSFgoOZW52aXJvbm1lbnRfaWQYAiABKAkSEwoLd29ya2xvYWRfaWQYAyABKAkSFAoMZXhlY3V0aW9uX2lkGAQgASgJEgwKBGtpbmQYBSABKAkSEQoJcGFnZV9zaXplGAYgASgFEhIKCnBhZ2VfdG9rZW4YByABKAkiYQoVTGlzdEFydGlmYWN0c1Jlc3BvbnNlEi8KCWFydGlmYWN0cxgBIAMoCzIcLnRvc2hpLndvcmtzcGFjZS52MS5BcnRpZmFjdBIXCg9uZXh0X3BhZ2VfdG9rZW4YAiABKAkiKQoSR2V0QXJ0aWZhY3RSZXF1ZXN0EhMKC2FydGlmYWN0X2lkGAEgASgJIkUKE0dldEFydGlmYWN0UmVzcG9uc2USLgoIYXJ0aWZhY3QYASABKAsyHC50b3NoaS53b3Jrc3BhY2UudjEuQXJ0aWZhY3QiVwodR2V0QXJ0aWZhY3REb3dubG9hZFVSTFJlcXVlc3QSEwoLYXJ0aWZhY3RfaWQYASABKAkSDAoEcGFydBgCIAEoCRITCgt0dGxfc2Vjb25kcxgDIAEoAyKDAQoeR2V0QXJ0aWZhY3REb3dubG9hZFVSTFJlc3BvbnNlEgsKA3VybBgBIAEoCRIuCgpleHBpcmVzX2F0GAIgASgLMhouZ29vZ2xlLnByb3RvYnVmLlRpbWVzdGFtcBISCgplbmNyeXB0aW9uGAMgASgJEhAKCGRhdGFfa2V5GAQgASgMMpACChVBcnRpZmFjdFVwbG9hZFNlcnZpY2USeQoNUmVzZXJ2ZVVwbG9hZBIoLnRvc2hpLndvcmtzcGFjZS52MS5SZXNlcnZlVXBsb2FkUmVxdWVzdBopLnRvc2hpLndvcmtzcGFjZS52MS5SZXNlcnZlVXBsb2FkUmVzcG9uc2UiE8LzGA9hcnRpZmFjdHMud3JpdGUSfAoOQ29tcGxldGVVcGxvYWQSKS50b3NoaS53b3Jrc3BhY2UudjEuQ29tcGxldGVVcGxvYWRSZXF1ZXN0GioudG9zaGkud29ya3NwYWNlLnYxLkNvbXBsZXRlVXBsb2FkUmVzcG9uc2UiE8LzGA9hcnRpZmFjdHMud3JpdGUyxAMKD0FydGlmYWN0U2VydmljZRKHAQoNTGlzdEFydGlmYWN0cxIoLnRvc2hpLndvcmtzcGFjZS52MS5MaXN0QXJ0aWZhY3RzUmVxdWVzdBopLnRvc2hpLndvcmtzcGFjZS52MS5MaXN0QXJ0aWZhY3RzUmVzcG9uc2UiIcLzGA5hcnRpZmFjdHMucmVhZMrzGAtlbnZpcm9ubWVudBKBAQoLR2V0QXJ0aWZhY3QSJi50b3NoaS53b3Jrc3BhY2UudjEuR2V0QXJ0aWZhY3RSZXF1ZXN0GicudG9zaGkud29ya3NwYWNlLnYxLkdldEFydGlmYWN0UmVzcG9uc2UiIcLzGA5hcnRpZmFjdHMucmVhZMrzGAtlbnZpcm9ubWVudBKiAQoWR2V0QXJ0aWZhY3REb3dubG9hZFVSTBIxLnRvc2hpLndvcmtzcGFjZS52MS5HZXRBcnRpZmFjdERvd25sb2FkVVJMUmVxdWVzdBoyLnRvc2hpLndvcmtzcGFjZS52MS5HZXRBcnRpZmFjdERvd25sb2FkVVJMUmVzcG9uc2UiIcLzGA5hcnRpZmFjdHMucmVhZMrzGAtlbnZpcm9ubWVudEIiWiBnby50b3NoaWNsb3VkLmlvL2FwaS93b3Jrc3BhY2V2MWIGcHJvdG8z", [file_google_protobuf_timestamp, file_toshi_permission, file_toshi_workspace_v1_recordings]);
|
|
11
12
|
/**
|
|
12
13
|
* Describes the message toshi.workspace.v1.Artifact.
|
|
13
14
|
* Use `create(ArtifactSchema)` to create a new message.
|
|
@@ -73,7 +74,7 @@ export const GetArtifactDownloadURLResponseSchema = /*@__PURE__*/ messageDesc(fi
|
|
|
73
74
|
* it reserves an artifact, uploads each part to a presigned URL, and
|
|
74
75
|
* completes the upload. The caller is the workload itself: every call
|
|
75
76
|
* carries a workload identity token for the audience
|
|
76
|
-
* "toshi:artifacts", and the
|
|
77
|
+
* "toshi:artifacts", and the workspace, project, environment, workload and
|
|
77
78
|
* execution of the artifact are the token's claims, never the request's.
|
|
78
79
|
* A token of another audience, a display token, an expired token, or one
|
|
79
80
|
* that names no workload is refused with UNAUTHENTICATED. A workspace that
|
|
@@ -3,10 +3,11 @@
|
|
|
3
3
|
/* eslint-disable */
|
|
4
4
|
import { fileDesc, messageDesc, serviceDesc } from "@bufbuild/protobuf/codegenv2";
|
|
5
5
|
import { file_google_protobuf_timestamp } from "@bufbuild/protobuf/wkt";
|
|
6
|
+
import { file_toshi_permission } from "../../permission_pb.js";
|
|
6
7
|
/**
|
|
7
8
|
* Describes the file toshi/workspace/v1/audit_events.proto.
|
|
8
9
|
*/
|
|
9
|
-
export const file_toshi_workspace_v1_audit_events = /*@__PURE__*/ fileDesc("
|
|
10
|
+
export const file_toshi_workspace_v1_audit_events = /*@__PURE__*/ fileDesc("CiV0b3NoaS93b3Jrc3BhY2UvdjEvYXVkaXRfZXZlbnRzLnByb3RvEhJ0b3NoaS53b3Jrc3BhY2UudjEisAEKCkF1ZGl0RXZlbnQSCgoCaWQYASABKAMSJgoCYXQYAiABKAsyGi5nb29nbGUucHJvdG9idWYuVGltZXN0YW1wEhIKCmFjdG9yX2tpbmQYAyABKAkSEAoIYWN0b3JfaWQYBCABKAkSDgoGYWN0aW9uGAUgASgJEg4KBnRhcmdldBgGIAEoCRIUCgxkZXRhaWxzX2pzb24YByABKAkSEgoKcmVxdWVzdF9pZBgIIAEoCSKqAQoWTGlzdEF1ZGl0RXZlbnRzUmVxdWVzdBIOCgZhY3Rpb24YASABKAkSKQoFc2luY2UYAiABKAsyGi5nb29nbGUucHJvdG9idWYuVGltZXN0YW1wEhEKCXBhZ2Vfc2l6ZRgDIAEoBRINCgVhY3RvchgEIAEoCRIPCgdhY3Rpb25zGAUgAygJEg4KBnRhcmdldBgGIAEoCRISCgpwYWdlX3Rva2VuGAcgASgJImIKF0xpc3RBdWRpdEV2ZW50c1Jlc3BvbnNlEi4KBmV2ZW50cxgBIAMoCzIeLnRvc2hpLndvcmtzcGFjZS52MS5BdWRpdEV2ZW50EhcKD25leHRfcGFnZV90b2tlbhgCIAEoCTKPAQoRQXVkaXRFdmVudFNlcnZpY2USegoPTGlzdEF1ZGl0RXZlbnRzEioudG9zaGkud29ya3NwYWNlLnYxLkxpc3RBdWRpdEV2ZW50c1JlcXVlc3QaKy50b3NoaS53b3Jrc3BhY2UudjEuTGlzdEF1ZGl0RXZlbnRzUmVzcG9uc2UiDsLzGAphdWRpdC5yZWFkQiJaIGdvLnRvc2hpY2xvdWQuaW8vYXBpL3dvcmtzcGFjZXYxYgZwcm90bzM", [file_google_protobuf_timestamp, file_toshi_permission]);
|
|
10
11
|
/**
|
|
11
12
|
* Describes the message toshi.workspace.v1.AuditEvent.
|
|
12
13
|
* Use `create(AuditEventSchema)` to create a new message.
|
|
@@ -3,10 +3,11 @@
|
|
|
3
3
|
/* eslint-disable */
|
|
4
4
|
import { enumDesc, fileDesc, messageDesc, serviceDesc } from "@bufbuild/protobuf/codegenv2";
|
|
5
5
|
import { file_google_protobuf_duration, file_google_protobuf_timestamp } from "@bufbuild/protobuf/wkt";
|
|
6
|
+
import { file_toshi_permission } from "../../permission_pb.js";
|
|
6
7
|
/**
|
|
7
8
|
* Describes the file toshi/workspace/v1/channels.proto.
|
|
8
9
|
*/
|
|
9
|
-
export const file_toshi_workspace_v1_channels = /*@__PURE__*/ fileDesc("CiF0b3NoaS93b3Jrc3BhY2UvdjEvY2hhbm5lbHMucHJvdG8SEnRvc2hpLndvcmtzcGFjZS52MSLJBAoHQ2hhbm5lbBIKCgJpZBgBIAEoCRIOCgZqb2JfaWQYAiABKAkSDAoEbmFtZRgDIAEoCRIvCgVzaGFwZRgEIAEoDjIgLnRvc2hpLndvcmtzcGFjZS52MS5DaGFubmVsU2hhcGUSDAoEcG9ydBgFIAEoBRIPCgdjb21tYW5kGAYgAygJEi8KBXN0YXRlGAcgASgOMiAudG9zaGkud29ya3NwYWNlLnYxLkNoYW5uZWxTdGF0ZRISCgpjcmVhdGVkX2J5GAggASgJEi4KCmNyZWF0ZWRfYXQYCSABKAsyGi5nb29nbGUucHJvdG9idWYuVGltZXN0YW1wEiwKCGVuZGVkX2F0GAogASgLMhouZ29vZ2xlLnByb3RvYnVmLlRpbWVzdGFtcBISCgplbmRfcmVhc29uGAsgASgJEhYKCWV4aXRfY29kZRgMIAEoBUgAiAEBEg0KBW93bmVyGA0gASgJEhQKDG91dHB1dF9zdGFydBgOIAEoAxITCgtvdXRwdXRfbmV4dBgPIAEoAxIUCgxpbnB1dF9jbG9zZWQYECABKAgSFwoPcmVxdWVzdHNfb2xkZXN0GBEgASgDEhcKD3JlcXVlc3RzX25ld2VzdBgSIAEoAxIxCgZwb2xpY3kYEyABKAsyIS50b3NoaS53b3Jrc3BhY2UudjEuQ2hhbm5lbFBvbGljeRIyCgdjbGllbnRzGBQgAygLMiEudG9zaGkud29ya3NwYWNlLnYxLkNoYW5uZWxDbGllbnRCDAoKX2V4aXRfY29kZSLDAgoNQ2hhbm5lbENsaWVudBIKCgJpZBgBIAEoCRIzCgRtb2RlGAIgASgOMiUudG9zaGkud29ya3NwYWNlLnYxLkNoYW5uZWxBdHRhY2hNb2RlEhMKC2F0dGFjaGVkX2J5GAMgASgJEg4KBmRldmljZRgEIAEoCRISCgpjcmVkZW50aWFsGAUgASgJEjIKDmF0dGFjaGVkX3NpbmNlGAYgASgLMhouZ29vZ2xlLnByb3RvYnVmLlRpbWVzdGFtcBIrCgdzZWVuX2F0GAcgASgLMhouZ29vZ2xlLnByb3RvYnVmLlRpbWVzdGFtcBIvCgtkZXRhY2hlZF9hdBgIIAEoCzIaLmdvb2dsZS5wcm90b2J1Zi5UaW1lc3RhbXASFAoMb3V0cHV0X2Fja2VkGAkgASgDEhAKCGF0dGFjaGVkGAogASgIIq8BCg1DaGFubmVsUG9saWN5Eg8KB3ZlcnNpb24YASABKAMSDgoGYXR0YWNoGAIgASgJEhgKC21heF9jbGllbnRzGAMgASgFSACIAQESDQoFaW5wdXQYBCABKAkSDAoEa2VlcBgFIAEoCRI2Cgdtb2R1bGVzGAYgASgLMiUudG9zaGkud29ya3NwYWNlLnYxLkNoYW5uZWxNb2R1bGVMaXN0Qg4KDF9tYXhfY2xpZW50cyJHChFDaGFubmVsTW9kdWxlTGlzdBIyCgdtb2R1bGVzGAEgAygLMiEudG9zaGkud29ya3NwYWNlLnYxLkNoYW5uZWxNb2R1bGUifwoNQ2hhbm5lbE1vZHVsZRIMCgRraW5kGAEgASgJEi8KBW1hdGNoGAIgASgLMiAudG9zaGkud29ya3NwYWNlLnYxLkNoYW5uZWxNYXRjaBIOCgZyYW5nZXMYAyADKAkSDQoFbGV2ZWwYBCABKAkSEAoIYm9keV9jYXAYBSABKAMirQEKDENoYW5uZWxNYXRjaBINCgVob3N0cxgBIAMoCRINCgVwYXRocxgCIAMoCRIPCgdtZXRob2RzGAMgAygJEj4KB2hlYWRlcnMYBCADKAsyLS50b3NoaS53b3Jrc3BhY2UudjEuQ2hhbm5lbE1hdGNoLkhlYWRlcnNFbnRyeRouCgxIZWFkZXJzRW50cnkSCwoDa2V5GAEgASgJEg0KBXZhbHVlGAIgASgJOgI4ASLwBAoOQ2hhbm5lbFJlcXVlc3QSCwoDc2VxGAEgASgDEi4KCmFycml2ZWRfYXQYAiABKAsyGi5nb29nbGUucHJvdG9idWYuVGltZXN0YW1wEgwKBGhvc3QYAyABKAkSDgoGbWV0aG9kGAQgASgJEgwKBHBhdGgYBSABKAkSDgoGc3RhdHVzGAYgASgFEhUKDXJlcXVlc3RfYnl0ZXMYByABKAMSFgoOcmVzcG9uc2VfYnl0ZXMYCCABKAMSKwoIZHVyYXRpb24YCSABKAsyGS5nb29nbGUucHJvdG9idWYuRHVyYXRpb24SOAoGY2FsbGVyGAogASgLMigudG9zaGkud29ya3NwYWNlLnYxLkNoYW5uZWxSZXF1ZXN0Q2FsbGVyEg8KB2FkZHJlc3MYCyABKAkSEgoKcmVmdXNlZF9ieRgMIAEoCRIRCgl3ZWJzb2NrZXQYDSABKAgSDQoFbGV2ZWwYDiABKAkSDQoFcXVlcnkYDyABKAkSEQoJcXVlcnlfY3V0GBAgASgIEjoKD3JlcXVlc3RfaGVhZGVycxgRIAMoCzIhLnRvc2hpLndvcmtzcGFjZS52MS5DaGFubmVsSGVhZGVyEjsKEHJlc3BvbnNlX2hlYWRlcnMYEiADKAsyIS50b3NoaS53b3Jrc3BhY2UudjEuQ2hhbm5lbEhlYWRlchI1CgxyZXF1ZXN0X2JvZHkYEyABKAsyHy50b3NoaS53b3Jrc3BhY2UudjEuQ2hhbm5lbEJvZHkSNgoNcmVzcG9uc2VfYm9keRgUIAEoCzIfLnRvc2hpLndvcmtzcGFjZS52MS5DaGFubmVsQm9keSJIChRDaGFubmVsUmVxdWVzdENhbGxlchIMCgR1c2VyGAEgASgJEg4KBmRldmljZRgCIAEoCRISCgpzaGFyZV9saW5rGAMgASgJIj0KDUNoYW5uZWxIZWFkZXISDAoEbmFtZRgBIAEoCRINCgV2YWx1ZRgCIAEoCRIPCgdyZW1vdmVkGAMgASgIIj4KC0NoYW5uZWxCb2R5EhQKDGNvbnRlbnRfdHlwZRgBIAEoCRIMCgRkYXRhGAIgASgMEgsKA2N1dBgDIAEoCCJ1CgdGb3J3YXJkEg4KBnRhcmdldBgBIAEoCRIKCgJieRgCIAEoCRIOCgZkZXZpY2UYAyABKAkSDwoHY2hhbm5lbBgEIAEoCRItCglvcGVuZWRfYXQYBSABKAsyGi5nb29nbGUucHJvdG9idWYuVGltZXN0YW1wIrEBCgRMaW5rEhEKCWNvbm5lY3RlZBgBIAEoCBIpCgVzaW5jZRgCIAEoCzIaLmdvb2dsZS5wcm90b2J1Zi5UaW1lc3RhbXASEAoIY29ubmVjdHMYAyABKAUSDwoHc3RyZWFtcxgEIAEoBRISCgpsYXN0X2Vycm9yGAUgASgJEg8KB3JlcGxpY2EYBiABKAkSEAoIZm9yd2FyZHMYByABKAUSEQoJam9iX3N0YXRlGAggASgJIoYBChRDcmVhdGVDaGFubmVsUmVxdWVzdBIOCgZqb2JfaWQYASABKAkSDAoEbmFtZRgCIAEoCRIMCgRwb3J0GAMgASgFEg8KB2NvbW1hbmQYBCADKAkSMQoGcG9saWN5GAUgASgLMiEudG9zaGkud29ya3NwYWNlLnYxLkNoYW5uZWxQb2xpY3kiRQoVQ3JlYXRlQ2hhbm5lbFJlc3BvbnNlEiwKB2NoYW5uZWwYASABKAsyGy50b3NoaS53b3Jrc3BhY2UudjEuQ2hhbm5lbCJMChNMaXN0Q2hhbm5lbHNSZXF1ZXN0Eg4KBmpvYl9pZBgBIAEoCRIRCglwYWdlX3NpemUYAiABKAUSEgoKcGFnZV90b2tlbhgDIAEoCSJeChRMaXN0Q2hhbm5lbHNSZXNwb25zZRItCghjaGFubmVscxgBIAMoCzIbLnRvc2hpLndvcmtzcGFjZS52MS5DaGFubmVsEhcKD25leHRfcGFnZV90b2tlbhgCIAEoCSIxChFHZXRDaGFubmVsUmVxdWVzdBIOCgZqb2JfaWQYASABKAkSDAoEbmFtZRgCIAEoCSJCChJHZXRDaGFubmVsUmVzcG9uc2USLAoHY2hhbm5lbBgBIAEoCzIbLnRvc2hpLndvcmtzcGFjZS52MS5DaGFubmVsIjcKF0dldENoYW5uZWxQb2xpY3lSZXF1ZXN0Eg4KBmpvYl9pZBgBIAEoCRIMCgRuYW1lGAIgASgJIk0KGEdldENoYW5uZWxQb2xpY3lSZXNwb25zZRIxCgZwb2xpY3kYASABKAsyIS50b3NoaS53b3Jrc3BhY2UudjEuQ2hhbm5lbFBvbGljeSJqChdTZXRDaGFubmVsUG9saWN5UmVxdWVzdBIOCgZqb2JfaWQYASABKAkSDAoEbmFtZRgCIAEoCRIxCgZwb2xpY3kYAyABKAsyIS50b3NoaS53b3Jrc3BhY2UudjEuQ2hhbm5lbFBvbGljeSJNChhTZXRDaGFubmVsUG9saWN5UmVzcG9uc2USMQoGcG9saWN5GAEgASgLMiEudG9zaGkud29ya3NwYWNlLnYxLkNoYW5uZWxQb2xpY3kijQIKGkxpc3RDaGFubmVsUmVxdWVzdHNSZXF1ZXN0Eg4KBmpvYl9pZBgBIAEoCRIMCgRuYW1lGAIgASgJEhEKCXBhZ2Vfc2l6ZRgDIAEoBRISCgpwYWdlX3Rva2VuGAQgASgJEhEKCWFmdGVyX3NlcRgFIAEoAxIpCgVzaW5jZRgGIAEoCzIaLmdvb2dsZS5wcm90b2J1Zi5UaW1lc3RhbXASKQoFdW50aWwYByABKAsyGi5nb29nbGUucHJvdG9idWYuVGltZXN0YW1wEg4KBnN0YXR1cxgIIAEoCRIMCgRob3N0GAkgASgJEg4KBm1ldGhvZBgKIAEoCRITCgtwYXRoX3ByZWZpeBgLIAEoCSKUAQobTGlzdENoYW5uZWxSZXF1ZXN0c1Jlc3BvbnNlEjQKCHJlcXVlc3RzGAEgAygLMiIudG9zaGkud29ya3NwYWNlLnYxLkNoYW5uZWxSZXF1ZXN0EhcKD25leHRfcGFnZV90b2tlbhgCIAEoCRISCgpvbGRlc3Rfc2VxGAMgASgDEhIKCm5ld2VzdF9zZXEYBCABKAMiRQoYR2V0Q2hhbm5lbFJlcXVlc3RSZXF1ZXN0Eg4KBmpvYl9pZBgBIAEoCRIMCgRuYW1lGAIgASgJEgsKA3NlcRgDIAEoAyJQChlHZXRDaGFubmVsUmVxdWVzdFJlc3BvbnNlEjMKB3JlcXVlc3QYASABKAsyIi50b3NoaS53b3Jrc3BhY2UudjEuQ2hhbm5lbFJlcXVlc3Qi7gEKF0V4cG9ydENoYW5uZWxMb2dSZXF1ZXN0Eg4KBmpvYl9pZBgBIAEoCRIMCgRuYW1lGAIgASgJEisKA2xvZxgDIAEoDjIeLnRvc2hpLndvcmtzcGFjZS52MS5DaGFubmVsTG9nEhEKBGZyb20YBCABKANIAIgBARIPCgJ0bxgFIAEoA0gBiAEBEikKBXNpbmNlGAYgASgLMhouZ29vZ2xlLnByb3RvYnVmLlRpbWVzdGFtcBIpCgV1bnRpbBgHIAEoCzIaLmdvb2dsZS5wcm90b2J1Zi5UaW1lc3RhbXBCBwoFX2Zyb21CBQoDX3RvIm0KGEV4cG9ydENoYW5uZWxMb2dSZXNwb25zZRIMCgRkYXRhGAEgASgMEhEKCWZpbGVfbmFtZRgCIAEoCRIUCgxjb250ZW50X3R5cGUYAyABKAkSDAoEZnJvbRgEIAEoAxIMCgRuZXh0GAUgASgDIoUBCiBDcmVhdGVDaGFubmVsQ29ubmVjdFRva2VuUmVxdWVzdBIOCgZqb2JfaWQYASABKAkSDAoEbmFtZRgCIAEoCRIOCgZkZXZpY2UYAyABKAkSMwoEbW9kZRgEIAEoDjIlLnRvc2hpLndvcmtzcGFjZS52MS5DaGFubmVsQXR0YWNoTW9kZSLDAQohQ3JlYXRlQ2hhbm5lbENvbm5lY3RUb2tlblJlc3BvbnNlEgoKAmlkGAEgASgJEg0KBXRva2VuGAIgASgJEgsKA3VybBgDIAEoCRIuCgpleHBpcmVzX2F0GAQgASgLMhouZ29vZ2xlLnByb3RvYnVmLlRpbWVzdGFtcBIRCgl0cmFuc3BvcnQYBSABKAkSMwoEbW9kZRgGIAEoDjIlLnRvc2hpLndvcmtzcGFjZS52MS5DaGFubmVsQXR0YWNoTW9kZSJMCiBSZXZva2VDaGFubmVsQ29ubmVjdFRva2VuUmVxdWVzdBIOCgZqb2JfaWQYASABKAkSDAoEbmFtZRgCIAEoCRIKCgJpZBgDIAEoCSIjCiFSZXZva2VDaGFubmVsQ29ubmVjdFRva2VuUmVzcG9uc2UiNAoURGVsZXRlQ2hhbm5lbFJlcXVlc3QSDgoGam9iX2lkGAEgASgJEgwKBG5hbWUYAiABKAkiFwoVRGVsZXRlQ2hhbm5lbFJlc3BvbnNlIkwKE0xpc3RGb3J3YXJkc1JlcXVlc3QSDgoGam9iX2lkGAEgASgJEhEKCXBhZ2Vfc2l6ZRgCIAEoBRISCgpwYWdlX3Rva2VuGAMgASgJIl4KFExpc3RGb3J3YXJkc1Jlc3BvbnNlEi0KCGZvcndhcmRzGAEgAygLMhsudG9zaGkud29ya3NwYWNlLnYxLkZvcndhcmQSFwoPbmV4dF9wYWdlX3Rva2VuGAIgASgJIiAKDkdldExpbmtSZXF1ZXN0Eg4KBmpvYl9pZBgBIAEoCSI5Cg9HZXRMaW5rUmVzcG9uc2USJgoEbGluaxgBIAEoCzIYLnRvc2hpLndvcmtzcGFjZS52MS5MaW5rKl8KDENoYW5uZWxTaGFwZRIdChlDSEFOTkVMX1NIQVBFX1VOU1BFQ0lGSUVEEAASFgoSQ0hBTk5FTF9TSEFQRV9IVFRQEAESGAoUQ0hBTk5FTF9TSEFQRV9TVFJFQU0QAiqTAQoMQ2hhbm5lbFN0YXRlEh0KGUNIQU5ORUxfU1RBVEVfVU5TUEVDSUZJRUQQABIWChJDSEFOTkVMX1NUQVRFX09QRU4QARIYChRDSEFOTkVMX1NUQVRFX0VYSVRFRBACEhkKFUNIQU5ORUxfU1RBVEVfQ0xPU0lORxADEhcKE0NIQU5ORUxfU1RBVEVfRU5ERUQQBCp6ChFDaGFubmVsQXR0YWNoTW9kZRIjCh9DSEFOTkVMX0FUVEFDSF9NT0RFX1VOU1BFQ0lGSUVEEAASHQoZQ0hBTk5FTF9BVFRBQ0hfTU9ERV9JTlBVVBABEiEKHUNIQU5ORUxfQVRUQUNIX01PREVfUkVBRF9PTkxZEAIqWwoKQ2hhbm5lbExvZxIbChdDSEFOTkVMX0xPR19VTlNQRUNJRklFRBAAEhYKEkNIQU5ORUxfTE9HX09VVFBVVBABEhgKFENIQU5ORUxfTE9HX1JFUVVFU1RTEAIyogsKDkNoYW5uZWxTZXJ2aWNlEmQKDUNyZWF0ZUNoYW5uZWwSKC50b3NoaS53b3Jrc3BhY2UudjEuQ3JlYXRlQ2hhbm5lbFJlcXVlc3QaKS50b3NoaS53b3Jrc3BhY2UudjEuQ3JlYXRlQ2hhbm5lbFJlc3BvbnNlEmEKDExpc3RDaGFubmVscxInLnRvc2hpLndvcmtzcGFjZS52MS5MaXN0Q2hhbm5lbHNSZXF1ZXN0GigudG9zaGkud29ya3NwYWNlLnYxLkxpc3RDaGFubmVsc1Jlc3BvbnNlElsKCkdldENoYW5uZWwSJS50b3NoaS53b3Jrc3BhY2UudjEuR2V0Q2hhbm5lbFJlcXVlc3QaJi50b3NoaS53b3Jrc3BhY2UudjEuR2V0Q2hhbm5lbFJlc3BvbnNlEm0KEEdldENoYW5uZWxQb2xpY3kSKy50b3NoaS53b3Jrc3BhY2UudjEuR2V0Q2hhbm5lbFBvbGljeVJlcXVlc3QaLC50b3NoaS53b3Jrc3BhY2UudjEuR2V0Q2hhbm5lbFBvbGljeVJlc3BvbnNlEm0KEFNldENoYW5uZWxQb2xpY3kSKy50b3NoaS53b3Jrc3BhY2UudjEuU2V0Q2hhbm5lbFBvbGljeVJlcXVlc3QaLC50b3NoaS53b3Jrc3BhY2UudjEuU2V0Q2hhbm5lbFBvbGljeVJlc3BvbnNlEnYKE0xpc3RDaGFubmVsUmVxdWVzdHMSLi50b3NoaS53b3Jrc3BhY2UudjEuTGlzdENoYW5uZWxSZXF1ZXN0c1JlcXVlc3QaLy50b3NoaS53b3Jrc3BhY2UudjEuTGlzdENoYW5uZWxSZXF1ZXN0c1Jlc3BvbnNlEnAKEUdldENoYW5uZWxSZXF1ZXN0EiwudG9zaGkud29ya3NwYWNlLnYxLkdldENoYW5uZWxSZXF1ZXN0UmVxdWVzdBotLnRvc2hpLndvcmtzcGFjZS52MS5HZXRDaGFubmVsUmVxdWVzdFJlc3BvbnNlEm8KEEV4cG9ydENoYW5uZWxMb2cSKy50b3NoaS53b3Jrc3BhY2UudjEuRXhwb3J0Q2hhbm5lbExvZ1JlcXVlc3QaLC50b3NoaS53b3Jrc3BhY2UudjEuRXhwb3J0Q2hhbm5lbExvZ1Jlc3BvbnNlMAESiAEKGUNyZWF0ZUNoYW5uZWxDb25uZWN0VG9rZW4SNC50b3NoaS53b3Jrc3BhY2UudjEuQ3JlYXRlQ2hhbm5lbENvbm5lY3RUb2tlblJlcXVlc3QaNS50b3NoaS53b3Jrc3BhY2UudjEuQ3JlYXRlQ2hhbm5lbENvbm5lY3RUb2tlblJlc3BvbnNlEogBChlSZXZva2VDaGFubmVsQ29ubmVjdFRva2VuEjQudG9zaGkud29ya3NwYWNlLnYxLlJldm9rZUNoYW5uZWxDb25uZWN0VG9rZW5SZXF1ZXN0GjUudG9zaGkud29ya3NwYWNlLnYxLlJldm9rZUNoYW5uZWxDb25uZWN0VG9rZW5SZXNwb25zZRJkCg1EZWxldGVDaGFubmVsEigudG9zaGkud29ya3NwYWNlLnYxLkRlbGV0ZUNoYW5uZWxSZXF1ZXN0GikudG9zaGkud29ya3NwYWNlLnYxLkRlbGV0ZUNoYW5uZWxSZXNwb25zZRJhCgxMaXN0Rm9yd2FyZHMSJy50b3NoaS53b3Jrc3BhY2UudjEuTGlzdEZvcndhcmRzUmVxdWVzdBooLnRvc2hpLndvcmtzcGFjZS52MS5MaXN0Rm9yd2FyZHNSZXNwb25zZRJSCgdHZXRMaW5rEiIudG9zaGkud29ya3NwYWNlLnYxLkdldExpbmtSZXF1ZXN0GiMudG9zaGkud29ya3NwYWNlLnYxLkdldExpbmtSZXNwb25zZUItWitnaXRodWIuY29tL3Rvc2hpY2xvdWQvdG9zaGktYXBpL3dvcmtzcGFjZXYxYgZwcm90bzM", [file_google_protobuf_duration, file_google_protobuf_timestamp]);
|
|
10
|
+
export const file_toshi_workspace_v1_channels = /*@__PURE__*/ fileDesc("CiF0b3NoaS93b3Jrc3BhY2UvdjEvY2hhbm5lbHMucHJvdG8SEnRvc2hpLndvcmtzcGFjZS52MSLJBAoHQ2hhbm5lbBIKCgJpZBgBIAEoCRIOCgZqb2JfaWQYAiABKAkSDAoEbmFtZRgDIAEoCRIvCgVzaGFwZRgEIAEoDjIgLnRvc2hpLndvcmtzcGFjZS52MS5DaGFubmVsU2hhcGUSDAoEcG9ydBgFIAEoBRIPCgdjb21tYW5kGAYgAygJEi8KBXN0YXRlGAcgASgOMiAudG9zaGkud29ya3NwYWNlLnYxLkNoYW5uZWxTdGF0ZRISCgpjcmVhdGVkX2J5GAggASgJEi4KCmNyZWF0ZWRfYXQYCSABKAsyGi5nb29nbGUucHJvdG9idWYuVGltZXN0YW1wEiwKCGVuZGVkX2F0GAogASgLMhouZ29vZ2xlLnByb3RvYnVmLlRpbWVzdGFtcBISCgplbmRfcmVhc29uGAsgASgJEhYKCWV4aXRfY29kZRgMIAEoBUgAiAEBEg0KBW93bmVyGA0gASgJEhQKDG91dHB1dF9zdGFydBgOIAEoAxITCgtvdXRwdXRfbmV4dBgPIAEoAxIUCgxpbnB1dF9jbG9zZWQYECABKAgSFwoPcmVxdWVzdHNfb2xkZXN0GBEgASgDEhcKD3JlcXVlc3RzX25ld2VzdBgSIAEoAxIxCgZwb2xpY3kYEyABKAsyIS50b3NoaS53b3Jrc3BhY2UudjEuQ2hhbm5lbFBvbGljeRIyCgdjbGllbnRzGBQgAygLMiEudG9zaGkud29ya3NwYWNlLnYxLkNoYW5uZWxDbGllbnRCDAoKX2V4aXRfY29kZSLDAgoNQ2hhbm5lbENsaWVudBIKCgJpZBgBIAEoCRIzCgRtb2RlGAIgASgOMiUudG9zaGkud29ya3NwYWNlLnYxLkNoYW5uZWxBdHRhY2hNb2RlEhMKC2F0dGFjaGVkX2J5GAMgASgJEg4KBmRldmljZRgEIAEoCRISCgpjcmVkZW50aWFsGAUgASgJEjIKDmF0dGFjaGVkX3NpbmNlGAYgASgLMhouZ29vZ2xlLnByb3RvYnVmLlRpbWVzdGFtcBIrCgdzZWVuX2F0GAcgASgLMhouZ29vZ2xlLnByb3RvYnVmLlRpbWVzdGFtcBIvCgtkZXRhY2hlZF9hdBgIIAEoCzIaLmdvb2dsZS5wcm90b2J1Zi5UaW1lc3RhbXASFAoMb3V0cHV0X2Fja2VkGAkgASgDEhAKCGF0dGFjaGVkGAogASgIIq8BCg1DaGFubmVsUG9saWN5Eg8KB3ZlcnNpb24YASABKAMSDgoGYXR0YWNoGAIgASgJEhgKC21heF9jbGllbnRzGAMgASgFSACIAQESDQoFaW5wdXQYBCABKAkSDAoEa2VlcBgFIAEoCRI2Cgdtb2R1bGVzGAYgASgLMiUudG9zaGkud29ya3NwYWNlLnYxLkNoYW5uZWxNb2R1bGVMaXN0Qg4KDF9tYXhfY2xpZW50cyJHChFDaGFubmVsTW9kdWxlTGlzdBIyCgdtb2R1bGVzGAEgAygLMiEudG9zaGkud29ya3NwYWNlLnYxLkNoYW5uZWxNb2R1bGUifwoNQ2hhbm5lbE1vZHVsZRIMCgRraW5kGAEgASgJEi8KBW1hdGNoGAIgASgLMiAudG9zaGkud29ya3NwYWNlLnYxLkNoYW5uZWxNYXRjaBIOCgZyYW5nZXMYAyADKAkSDQoFbGV2ZWwYBCABKAkSEAoIYm9keV9jYXAYBSABKAMirQEKDENoYW5uZWxNYXRjaBINCgVob3N0cxgBIAMoCRINCgVwYXRocxgCIAMoCRIPCgdtZXRob2RzGAMgAygJEj4KB2hlYWRlcnMYBCADKAsyLS50b3NoaS53b3Jrc3BhY2UudjEuQ2hhbm5lbE1hdGNoLkhlYWRlcnNFbnRyeRouCgxIZWFkZXJzRW50cnkSCwoDa2V5GAEgASgJEg0KBXZhbHVlGAIgASgJOgI4ASLwBAoOQ2hhbm5lbFJlcXVlc3QSCwoDc2VxGAEgASgDEi4KCmFycml2ZWRfYXQYAiABKAsyGi5nb29nbGUucHJvdG9idWYuVGltZXN0YW1wEgwKBGhvc3QYAyABKAkSDgoGbWV0aG9kGAQgASgJEgwKBHBhdGgYBSABKAkSDgoGc3RhdHVzGAYgASgFEhUKDXJlcXVlc3RfYnl0ZXMYByABKAMSFgoOcmVzcG9uc2VfYnl0ZXMYCCABKAMSKwoIZHVyYXRpb24YCSABKAsyGS5nb29nbGUucHJvdG9idWYuRHVyYXRpb24SOAoGY2FsbGVyGAogASgLMigudG9zaGkud29ya3NwYWNlLnYxLkNoYW5uZWxSZXF1ZXN0Q2FsbGVyEg8KB2FkZHJlc3MYCyABKAkSEgoKcmVmdXNlZF9ieRgMIAEoCRIRCgl3ZWJzb2NrZXQYDSABKAgSDQoFbGV2ZWwYDiABKAkSDQoFcXVlcnkYDyABKAkSEQoJcXVlcnlfY3V0GBAgASgIEjoKD3JlcXVlc3RfaGVhZGVycxgRIAMoCzIhLnRvc2hpLndvcmtzcGFjZS52MS5DaGFubmVsSGVhZGVyEjsKEHJlc3BvbnNlX2hlYWRlcnMYEiADKAsyIS50b3NoaS53b3Jrc3BhY2UudjEuQ2hhbm5lbEhlYWRlchI1CgxyZXF1ZXN0X2JvZHkYEyABKAsyHy50b3NoaS53b3Jrc3BhY2UudjEuQ2hhbm5lbEJvZHkSNgoNcmVzcG9uc2VfYm9keRgUIAEoCzIfLnRvc2hpLndvcmtzcGFjZS52MS5DaGFubmVsQm9keSJIChRDaGFubmVsUmVxdWVzdENhbGxlchIMCgR1c2VyGAEgASgJEg4KBmRldmljZRgCIAEoCRISCgpzaGFyZV9saW5rGAMgASgJIj0KDUNoYW5uZWxIZWFkZXISDAoEbmFtZRgBIAEoCRINCgV2YWx1ZRgCIAEoCRIPCgdyZW1vdmVkGAMgASgIIj4KC0NoYW5uZWxCb2R5EhQKDGNvbnRlbnRfdHlwZRgBIAEoCRIMCgRkYXRhGAIgASgMEgsKA2N1dBgDIAEoCCJ1CgdGb3J3YXJkEg4KBnRhcmdldBgBIAEoCRIKCgJieRgCIAEoCRIOCgZkZXZpY2UYAyABKAkSDwoHY2hhbm5lbBgEIAEoCRItCglvcGVuZWRfYXQYBSABKAsyGi5nb29nbGUucHJvdG9idWYuVGltZXN0YW1wIrEBCgRMaW5rEhEKCWNvbm5lY3RlZBgBIAEoCBIpCgVzaW5jZRgCIAEoCzIaLmdvb2dsZS5wcm90b2J1Zi5UaW1lc3RhbXASEAoIY29ubmVjdHMYAyABKAUSDwoHc3RyZWFtcxgEIAEoBRISCgpsYXN0X2Vycm9yGAUgASgJEg8KB3JlcGxpY2EYBiABKAkSEAoIZm9yd2FyZHMYByABKAUSEQoJam9iX3N0YXRlGAggASgJIoYBChRDcmVhdGVDaGFubmVsUmVxdWVzdBIOCgZqb2JfaWQYASABKAkSDAoEbmFtZRgCIAEoCRIMCgRwb3J0GAMgASgFEg8KB2NvbW1hbmQYBCADKAkSMQoGcG9saWN5GAUgASgLMiEudG9zaGkud29ya3NwYWNlLnYxLkNoYW5uZWxQb2xpY3kiRQoVQ3JlYXRlQ2hhbm5lbFJlc3BvbnNlEiwKB2NoYW5uZWwYASABKAsyGy50b3NoaS53b3Jrc3BhY2UudjEuQ2hhbm5lbCJMChNMaXN0Q2hhbm5lbHNSZXF1ZXN0Eg4KBmpvYl9pZBgBIAEoCRIRCglwYWdlX3NpemUYAiABKAUSEgoKcGFnZV90b2tlbhgDIAEoCSJeChRMaXN0Q2hhbm5lbHNSZXNwb25zZRItCghjaGFubmVscxgBIAMoCzIbLnRvc2hpLndvcmtzcGFjZS52MS5DaGFubmVsEhcKD25leHRfcGFnZV90b2tlbhgCIAEoCSIxChFHZXRDaGFubmVsUmVxdWVzdBIOCgZqb2JfaWQYASABKAkSDAoEbmFtZRgCIAEoCSJCChJHZXRDaGFubmVsUmVzcG9uc2USLAoHY2hhbm5lbBgBIAEoCzIbLnRvc2hpLndvcmtzcGFjZS52MS5DaGFubmVsIjcKF0dldENoYW5uZWxQb2xpY3lSZXF1ZXN0Eg4KBmpvYl9pZBgBIAEoCRIMCgRuYW1lGAIgASgJIk0KGEdldENoYW5uZWxQb2xpY3lSZXNwb25zZRIxCgZwb2xpY3kYASABKAsyIS50b3NoaS53b3Jrc3BhY2UudjEuQ2hhbm5lbFBvbGljeSJqChdTZXRDaGFubmVsUG9saWN5UmVxdWVzdBIOCgZqb2JfaWQYASABKAkSDAoEbmFtZRgCIAEoCRIxCgZwb2xpY3kYAyABKAsyIS50b3NoaS53b3Jrc3BhY2UudjEuQ2hhbm5lbFBvbGljeSJNChhTZXRDaGFubmVsUG9saWN5UmVzcG9uc2USMQoGcG9saWN5GAEgASgLMiEudG9zaGkud29ya3NwYWNlLnYxLkNoYW5uZWxQb2xpY3kijQIKGkxpc3RDaGFubmVsUmVxdWVzdHNSZXF1ZXN0Eg4KBmpvYl9pZBgBIAEoCRIMCgRuYW1lGAIgASgJEhEKCXBhZ2Vfc2l6ZRgDIAEoBRISCgpwYWdlX3Rva2VuGAQgASgJEhEKCWFmdGVyX3NlcRgFIAEoAxIpCgVzaW5jZRgGIAEoCzIaLmdvb2dsZS5wcm90b2J1Zi5UaW1lc3RhbXASKQoFdW50aWwYByABKAsyGi5nb29nbGUucHJvdG9idWYuVGltZXN0YW1wEg4KBnN0YXR1cxgIIAEoCRIMCgRob3N0GAkgASgJEg4KBm1ldGhvZBgKIAEoCRITCgtwYXRoX3ByZWZpeBgLIAEoCSKUAQobTGlzdENoYW5uZWxSZXF1ZXN0c1Jlc3BvbnNlEjQKCHJlcXVlc3RzGAEgAygLMiIudG9zaGkud29ya3NwYWNlLnYxLkNoYW5uZWxSZXF1ZXN0EhcKD25leHRfcGFnZV90b2tlbhgCIAEoCRISCgpvbGRlc3Rfc2VxGAMgASgDEhIKCm5ld2VzdF9zZXEYBCABKAMiRQoYR2V0Q2hhbm5lbFJlcXVlc3RSZXF1ZXN0Eg4KBmpvYl9pZBgBIAEoCRIMCgRuYW1lGAIgASgJEgsKA3NlcRgDIAEoAyJQChlHZXRDaGFubmVsUmVxdWVzdFJlc3BvbnNlEjMKB3JlcXVlc3QYASABKAsyIi50b3NoaS53b3Jrc3BhY2UudjEuQ2hhbm5lbFJlcXVlc3Qi7gEKF0V4cG9ydENoYW5uZWxMb2dSZXF1ZXN0Eg4KBmpvYl9pZBgBIAEoCRIMCgRuYW1lGAIgASgJEisKA2xvZxgDIAEoDjIeLnRvc2hpLndvcmtzcGFjZS52MS5DaGFubmVsTG9nEhEKBGZyb20YBCABKANIAIgBARIPCgJ0bxgFIAEoA0gBiAEBEikKBXNpbmNlGAYgASgLMhouZ29vZ2xlLnByb3RvYnVmLlRpbWVzdGFtcBIpCgV1bnRpbBgHIAEoCzIaLmdvb2dsZS5wcm90b2J1Zi5UaW1lc3RhbXBCBwoFX2Zyb21CBQoDX3RvIm0KGEV4cG9ydENoYW5uZWxMb2dSZXNwb25zZRIMCgRkYXRhGAEgASgMEhEKCWZpbGVfbmFtZRgCIAEoCRIUCgxjb250ZW50X3R5cGUYAyABKAkSDAoEZnJvbRgEIAEoAxIMCgRuZXh0GAUgASgDIoUBCiBDcmVhdGVDaGFubmVsQ29ubmVjdFRva2VuUmVxdWVzdBIOCgZqb2JfaWQYASABKAkSDAoEbmFtZRgCIAEoCRIOCgZkZXZpY2UYAyABKAkSMwoEbW9kZRgEIAEoDjIlLnRvc2hpLndvcmtzcGFjZS52MS5DaGFubmVsQXR0YWNoTW9kZSLDAQohQ3JlYXRlQ2hhbm5lbENvbm5lY3RUb2tlblJlc3BvbnNlEgoKAmlkGAEgASgJEg0KBXRva2VuGAIgASgJEgsKA3VybBgDIAEoCRIuCgpleHBpcmVzX2F0GAQgASgLMhouZ29vZ2xlLnByb3RvYnVmLlRpbWVzdGFtcBIRCgl0cmFuc3BvcnQYBSABKAkSMwoEbW9kZRgGIAEoDjIlLnRvc2hpLndvcmtzcGFjZS52MS5DaGFubmVsQXR0YWNoTW9kZSJMCiBSZXZva2VDaGFubmVsQ29ubmVjdFRva2VuUmVxdWVzdBIOCgZqb2JfaWQYASABKAkSDAoEbmFtZRgCIAEoCRIKCgJpZBgDIAEoCSIjCiFSZXZva2VDaGFubmVsQ29ubmVjdFRva2VuUmVzcG9uc2UiNAoURGVsZXRlQ2hhbm5lbFJlcXVlc3QSDgoGam9iX2lkGAEgASgJEgwKBG5hbWUYAiABKAkiFwoVRGVsZXRlQ2hhbm5lbFJlc3BvbnNlIkwKE0xpc3RGb3J3YXJkc1JlcXVlc3QSDgoGam9iX2lkGAEgASgJEhEKCXBhZ2Vfc2l6ZRgCIAEoBRISCgpwYWdlX3Rva2VuGAMgASgJIl4KFExpc3RGb3J3YXJkc1Jlc3BvbnNlEi0KCGZvcndhcmRzGAEgAygLMhsudG9zaGkud29ya3NwYWNlLnYxLkZvcndhcmQSFwoPbmV4dF9wYWdlX3Rva2VuGAIgASgJIiAKDkdldExpbmtSZXF1ZXN0Eg4KBmpvYl9pZBgBIAEoCSI5Cg9HZXRMaW5rUmVzcG9uc2USJgoEbGluaxgBIAEoCzIYLnRvc2hpLndvcmtzcGFjZS52MS5MaW5rKl8KDENoYW5uZWxTaGFwZRIdChlDSEFOTkVMX1NIQVBFX1VOU1BFQ0lGSUVEEAASFgoSQ0hBTk5FTF9TSEFQRV9IVFRQEAESGAoUQ0hBTk5FTF9TSEFQRV9TVFJFQU0QAiqTAQoMQ2hhbm5lbFN0YXRlEh0KGUNIQU5ORUxfU1RBVEVfVU5TUEVDSUZJRUQQABIWChJDSEFOTkVMX1NUQVRFX09QRU4QARIYChRDSEFOTkVMX1NUQVRFX0VYSVRFRBACEhkKFUNIQU5ORUxfU1RBVEVfQ0xPU0lORxADEhcKE0NIQU5ORUxfU1RBVEVfRU5ERUQQBCp6ChFDaGFubmVsQXR0YWNoTW9kZRIjCh9DSEFOTkVMX0FUVEFDSF9NT0RFX1VOU1BFQ0lGSUVEEAASHQoZQ0hBTk5FTF9BVFRBQ0hfTU9ERV9JTlBVVBABEiEKHUNIQU5ORUxfQVRUQUNIX01PREVfUkVBRF9PTkxZEAIqWwoKQ2hhbm5lbExvZxIbChdDSEFOTkVMX0xPR19VTlNQRUNJRklFRBAAEhYKEkNIQU5ORUxfTE9HX09VVFBVVBABEhgKFENIQU5ORUxfTE9HX1JFUVVFU1RTEAIyow0KDkNoYW5uZWxTZXJ2aWNlEngKDUNyZWF0ZUNoYW5uZWwSKC50b3NoaS53b3Jrc3BhY2UudjEuQ3JlYXRlQ2hhbm5lbFJlcXVlc3QaKS50b3NoaS53b3Jrc3BhY2UudjEuQ3JlYXRlQ2hhbm5lbFJlc3BvbnNlIhLC8xgOY2hhbm5lbHMud3JpdGUSdAoMTGlzdENoYW5uZWxzEicudG9zaGkud29ya3NwYWNlLnYxLkxpc3RDaGFubmVsc1JlcXVlc3QaKC50b3NoaS53b3Jrc3BhY2UudjEuTGlzdENoYW5uZWxzUmVzcG9uc2UiEcLzGA1jaGFubmVscy5yZWFkEm4KCkdldENoYW5uZWwSJS50b3NoaS53b3Jrc3BhY2UudjEuR2V0Q2hhbm5lbFJlcXVlc3QaJi50b3NoaS53b3Jrc3BhY2UudjEuR2V0Q2hhbm5lbFJlc3BvbnNlIhHC8xgNY2hhbm5lbHMucmVhZBKAAQoQR2V0Q2hhbm5lbFBvbGljeRIrLnRvc2hpLndvcmtzcGFjZS52MS5HZXRDaGFubmVsUG9saWN5UmVxdWVzdBosLnRvc2hpLndvcmtzcGFjZS52MS5HZXRDaGFubmVsUG9saWN5UmVzcG9uc2UiEcLzGA1jaGFubmVscy5yZWFkEoEBChBTZXRDaGFubmVsUG9saWN5EisudG9zaGkud29ya3NwYWNlLnYxLlNldENoYW5uZWxQb2xpY3lSZXF1ZXN0GiwudG9zaGkud29ya3NwYWNlLnYxLlNldENoYW5uZWxQb2xpY3lSZXNwb25zZSISwvMYDmNoYW5uZWxzLndyaXRlEokBChNMaXN0Q2hhbm5lbFJlcXVlc3RzEi4udG9zaGkud29ya3NwYWNlLnYxLkxpc3RDaGFubmVsUmVxdWVzdHNSZXF1ZXN0Gi8udG9zaGkud29ya3NwYWNlLnYxLkxpc3RDaGFubmVsUmVxdWVzdHNSZXNwb25zZSIRwvMYDWNoYW5uZWxzLnJlYWQSgwEKEUdldENoYW5uZWxSZXF1ZXN0EiwudG9zaGkud29ya3NwYWNlLnYxLkdldENoYW5uZWxSZXF1ZXN0UmVxdWVzdBotLnRvc2hpLndvcmtzcGFjZS52MS5HZXRDaGFubmVsUmVxdWVzdFJlc3BvbnNlIhHC8xgNY2hhbm5lbHMucmVhZBKCAQoQRXhwb3J0Q2hhbm5lbExvZxIrLnRvc2hpLndvcmtzcGFjZS52MS5FeHBvcnRDaGFubmVsTG9nUmVxdWVzdBosLnRvc2hpLndvcmtzcGFjZS52MS5FeHBvcnRDaGFubmVsTG9nUmVzcG9uc2UiEcLzGA1jaGFubmVscy5yZWFkMAESnAEKGUNyZWF0ZUNoYW5uZWxDb25uZWN0VG9rZW4SNC50b3NoaS53b3Jrc3BhY2UudjEuQ3JlYXRlQ2hhbm5lbENvbm5lY3RUb2tlblJlcXVlc3QaNS50b3NoaS53b3Jrc3BhY2UudjEuQ3JlYXRlQ2hhbm5lbENvbm5lY3RUb2tlblJlc3BvbnNlIhLC8xgOY2hhbm5lbHMud3JpdGUSnAEKGVJldm9rZUNoYW5uZWxDb25uZWN0VG9rZW4SNC50b3NoaS53b3Jrc3BhY2UudjEuUmV2b2tlQ2hhbm5lbENvbm5lY3RUb2tlblJlcXVlc3QaNS50b3NoaS53b3Jrc3BhY2UudjEuUmV2b2tlQ2hhbm5lbENvbm5lY3RUb2tlblJlc3BvbnNlIhLC8xgOY2hhbm5lbHMud3JpdGUSeAoNRGVsZXRlQ2hhbm5lbBIoLnRvc2hpLndvcmtzcGFjZS52MS5EZWxldGVDaGFubmVsUmVxdWVzdBopLnRvc2hpLndvcmtzcGFjZS52MS5EZWxldGVDaGFubmVsUmVzcG9uc2UiEsLzGA5jaGFubmVscy53cml0ZRJ0CgxMaXN0Rm9yd2FyZHMSJy50b3NoaS53b3Jrc3BhY2UudjEuTGlzdEZvcndhcmRzUmVxdWVzdBooLnRvc2hpLndvcmtzcGFjZS52MS5MaXN0Rm9yd2FyZHNSZXNwb25zZSIRwvMYDWNoYW5uZWxzLnJlYWQSZQoHR2V0TGluaxIiLnRvc2hpLndvcmtzcGFjZS52MS5HZXRMaW5rUmVxdWVzdBojLnRvc2hpLndvcmtzcGFjZS52MS5HZXRMaW5rUmVzcG9uc2UiEcLzGA1jaGFubmVscy5yZWFkQiJaIGdvLnRvc2hpY2xvdWQuaW8vYXBpL3dvcmtzcGFjZXYxYgZwcm90bzM", [file_google_protobuf_duration, file_google_protobuf_timestamp, file_toshi_permission]);
|
|
10
11
|
/**
|
|
11
12
|
* Describes the message toshi.workspace.v1.Channel.
|
|
12
13
|
* Use `create(ChannelSchema)` to create a new message.
|