@dxos/halo 0.0.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/API_AUDIT.md +396 -0
- package/CONSUMER_MIGRATION.md +343 -0
- package/LICENSE +105 -0
- package/MIGRATION.md +254 -0
- package/MIGRATION_PLAN.md +217 -0
- package/README.md +25 -0
- package/SPEC.mdl +137 -0
- package/dist/lib/neutral/index.mjs +186 -0
- package/dist/lib/neutral/index.mjs.map +7 -0
- package/dist/lib/neutral/meta.json +1 -0
- package/dist/types/src/Identity.d.ts +166 -0
- package/dist/types/src/Identity.d.ts.map +1 -0
- package/dist/types/src/Invitation.d.ts +87 -0
- package/dist/types/src/Invitation.d.ts.map +1 -0
- package/dist/types/src/Space.d.ts +158 -0
- package/dist/types/src/Space.d.ts.map +1 -0
- package/dist/types/src/errors.d.ts +228 -0
- package/dist/types/src/errors.d.ts.map +1 -0
- package/dist/types/src/index.d.ts +5 -0
- package/dist/types/src/index.d.ts.map +1 -0
- package/dist/types/tsconfig.tsbuildinfo +1 -0
- package/docs/halo.drawio.svg +119 -0
- package/moon.yml +11 -0
- package/package.json +31 -0
- package/src/Identity.ts +195 -0
- package/src/Invitation.ts +95 -0
- package/src/Space.ts +192 -0
- package/src/errors.ts +41 -0
- package/src/index.ts +9 -0
- package/tsconfig.json +19 -0
|
@@ -0,0 +1,87 @@
|
|
|
1
|
+
import * as Effect from 'effect/Effect';
|
|
2
|
+
import * as Stream from 'effect/Stream';
|
|
3
|
+
import { type IdentityDid, type SpaceId } from '@dxos/keys';
|
|
4
|
+
import { type InvitationError } from './errors';
|
|
5
|
+
/**
|
|
6
|
+
* Whether an invitation admits a device to an identity or a member to a space.
|
|
7
|
+
*/
|
|
8
|
+
export type Kind = 'device' | 'space';
|
|
9
|
+
/**
|
|
10
|
+
* How a guest proves it may redeem the invitation.
|
|
11
|
+
* Mirrors the legacy `Invitation.AuthMethod` protobuf enum.
|
|
12
|
+
*/
|
|
13
|
+
export type AuthMethod = 'none' | 'shared-secret' | 'known-public-key';
|
|
14
|
+
/**
|
|
15
|
+
* Interactive (online host+guest handshake) vs delegated (offline-redeemable) invitation.
|
|
16
|
+
* Mirrors the legacy `Invitation.Type` protobuf enum.
|
|
17
|
+
*/
|
|
18
|
+
export type Type = 'interactive' | 'delegated' | 'multiuse';
|
|
19
|
+
/**
|
|
20
|
+
* Options for initiating an invitation. Passed to {@link Identity.share} / {@link Space.share}.
|
|
21
|
+
*/
|
|
22
|
+
export type ShareOptions = {
|
|
23
|
+
readonly authMethod?: AuthMethod;
|
|
24
|
+
readonly type?: Type;
|
|
25
|
+
readonly multiUse?: boolean;
|
|
26
|
+
/** Restrict a `known-public-key` invitation to a specific guest (key/DID). */
|
|
27
|
+
readonly target?: string;
|
|
28
|
+
};
|
|
29
|
+
/**
|
|
30
|
+
* Outcome of a completed invitation flow.
|
|
31
|
+
*/
|
|
32
|
+
export type Result = {
|
|
33
|
+
readonly spaceId?: SpaceId;
|
|
34
|
+
readonly identityDid?: IdentityDid;
|
|
35
|
+
};
|
|
36
|
+
/**
|
|
37
|
+
* A lifecycle event emitted by an invitation {@link Flow}. Terminal events are `success`,
|
|
38
|
+
* `cancelled`, and `error`. Replaces polling on the legacy `Invitation.State` enum.
|
|
39
|
+
*/
|
|
40
|
+
export type Event = {
|
|
41
|
+
readonly _tag: 'connecting';
|
|
42
|
+
} | {
|
|
43
|
+
readonly _tag: 'connected';
|
|
44
|
+
} | {
|
|
45
|
+
readonly _tag: 'readyForAuthentication';
|
|
46
|
+
readonly authCode?: string;
|
|
47
|
+
} | {
|
|
48
|
+
readonly _tag: 'authenticating';
|
|
49
|
+
} | {
|
|
50
|
+
readonly _tag: 'success';
|
|
51
|
+
readonly result: Result;
|
|
52
|
+
} | {
|
|
53
|
+
readonly _tag: 'cancelled';
|
|
54
|
+
} | {
|
|
55
|
+
readonly _tag: 'error';
|
|
56
|
+
readonly message: string;
|
|
57
|
+
};
|
|
58
|
+
/**
|
|
59
|
+
* An in-flight invitation, host or guest side. Produced by {@link Identity.share}/`join` and
|
|
60
|
+
* {@link Space.share}/`join`; its lifecycle is then driven through this handle and the
|
|
61
|
+
* {@link Service}.
|
|
62
|
+
*/
|
|
63
|
+
export interface Flow {
|
|
64
|
+
readonly id: string;
|
|
65
|
+
readonly kind: Kind;
|
|
66
|
+
/** Hot stream of lifecycle events; completes after a terminal event. */
|
|
67
|
+
readonly events: Stream.Stream<Event>;
|
|
68
|
+
/** Supply the auth code when the flow reaches `readyForAuthentication`. */
|
|
69
|
+
authenticate(code: string): Effect.Effect<void, InvitationError>;
|
|
70
|
+
/** Abort the flow. */
|
|
71
|
+
cancel(): Effect.Effect<void>;
|
|
72
|
+
/** Encoded, shareable invitation code (host side). */
|
|
73
|
+
readonly code: Effect.Effect<string>;
|
|
74
|
+
}
|
|
75
|
+
/**
|
|
76
|
+
* Supply the auth code to a flow awaiting authentication. Flow verbs operate on a {@link Flow}
|
|
77
|
+
* handle directly and require no service; the active-flow set is queried through
|
|
78
|
+
* {@link Identity} (device invitations) and {@link Space} (space invitations).
|
|
79
|
+
*/
|
|
80
|
+
export declare const authenticate: (flow: Flow, code: string) => Effect.Effect<void, InvitationError>;
|
|
81
|
+
/** Abort a flow. */
|
|
82
|
+
export declare const cancel: (flow: Flow) => Effect.Effect<void>;
|
|
83
|
+
/** Lifecycle event stream of a flow. */
|
|
84
|
+
export declare const events: (flow: Flow) => Stream.Stream<Event>;
|
|
85
|
+
/** Encoded, shareable code for a flow. */
|
|
86
|
+
export declare const code: (flow: Flow) => Effect.Effect<string>;
|
|
87
|
+
//# sourceMappingURL=Invitation.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Invitation.d.ts","sourceRoot":"","sources":["../../../src/Invitation.ts"],"names":[],"mappings":"AAMA,OAAO,KAAK,MAAM,MAAM,eAAe,CAAC;AACxC,OAAO,KAAK,MAAM,MAAM,eAAe,CAAC;AAExC,OAAO,EAAE,KAAK,WAAW,EAAE,KAAK,OAAO,EAAE,MAAM,YAAY,CAAC;AAE5D,OAAO,EAAE,KAAK,eAAe,EAAE,MAAM,UAAU,CAAC;AAEhD;;GAEG;AACH,MAAM,MAAM,IAAI,GAAG,QAAQ,GAAG,OAAO,CAAC;AAEtC;;;GAGG;AACH,MAAM,MAAM,UAAU,GAAG,MAAM,GAAG,eAAe,GAAG,kBAAkB,CAAC;AAEvE;;;GAGG;AACH,MAAM,MAAM,IAAI,GAAG,aAAa,GAAG,WAAW,GAAG,UAAU,CAAC;AAE5D;;GAEG;AACH,MAAM,MAAM,YAAY,GAAG;IACzB,QAAQ,CAAC,UAAU,CAAC,EAAE,UAAU,CAAC;IACjC,QAAQ,CAAC,IAAI,CAAC,EAAE,IAAI,CAAC;IACrB,QAAQ,CAAC,QAAQ,CAAC,EAAE,OAAO,CAAC;IAC5B,8EAA8E;IAC9E,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM,CAAC;CAC1B,CAAC;AAEF;;GAEG;AACH,MAAM,MAAM,MAAM,GAAG;IACnB,QAAQ,CAAC,OAAO,CAAC,EAAE,OAAO,CAAC;IAC3B,QAAQ,CAAC,WAAW,CAAC,EAAE,WAAW,CAAC;CACpC,CAAC;AAEF;;;GAGG;AACH,MAAM,MAAM,KAAK,GACb;IAAE,QAAQ,CAAC,IAAI,EAAE,YAAY,CAAA;CAAE,GAC/B;IAAE,QAAQ,CAAC,IAAI,EAAE,WAAW,CAAA;CAAE,GAC9B;IAAE,QAAQ,CAAC,IAAI,EAAE,wBAAwB,CAAC;IAAC,QAAQ,CAAC,QAAQ,CAAC,EAAE,MAAM,CAAA;CAAE,GACvE;IAAE,QAAQ,CAAC,IAAI,EAAE,gBAAgB,CAAA;CAAE,GACnC;IAAE,QAAQ,CAAC,IAAI,EAAE,SAAS,CAAC;IAAC,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAA;CAAE,GACrD;IAAE,QAAQ,CAAC,IAAI,EAAE,WAAW,CAAA;CAAE,GAC9B;IAAE,QAAQ,CAAC,IAAI,EAAE,OAAO,CAAC;IAAC,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAA;CAAE,CAAC;AAEzD;;;;GAIG;AACH,MAAM,WAAW,IAAI;IACnB,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,IAAI,EAAE,IAAI,CAAC;IACpB,wEAAwE;IACxE,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;IACtC,2EAA2E;IAC3E,YAAY,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,eAAe,CAAC,CAAC;IACjE,sBAAsB;IACtB,MAAM,IAAI,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;IAC9B,sDAAsD;IACtD,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;CACtC;AAED;;;;GAIG;AACH,eAAO,MAAM,YAAY,SAAU,IAAI,QAAQ,MAAM,KAAG,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,eAAe,CAA4B,CAAC;AAExH,oBAAoB;AACpB,eAAO,MAAM,MAAM,SAAU,IAAI,KAAG,MAAM,CAAC,MAAM,CAAC,IAAI,CAAkB,CAAC;AAEzE,wCAAwC;AACxC,eAAO,MAAM,MAAM,SAAU,IAAI,KAAG,MAAM,CAAC,MAAM,CAAC,KAAK,CAAgB,CAAC;AAExE,0CAA0C;AAC1C,eAAO,MAAM,IAAI,SAAU,IAAI,KAAG,MAAM,CAAC,MAAM,CAAC,MAAM,CAAc,CAAC"}
|
|
@@ -0,0 +1,158 @@
|
|
|
1
|
+
import * as Context from 'effect/Context';
|
|
2
|
+
import * as Effect from 'effect/Effect';
|
|
3
|
+
import * as Option from 'effect/Option';
|
|
4
|
+
import * as Schema from 'effect/Schema';
|
|
5
|
+
import * as Stream from 'effect/Stream';
|
|
6
|
+
import { IdentityDid, SpaceId } from '@dxos/keys';
|
|
7
|
+
import { type SpaceError } from './errors';
|
|
8
|
+
import * as Invitation from './Invitation';
|
|
9
|
+
/**
|
|
10
|
+
* Capability level granted to a space member, matching the Keyhive `Access` enum. Ordered; each
|
|
11
|
+
* implies the previous: `pull` < `read` < `edit` < `admin`. Replaces the legacy
|
|
12
|
+
* `SpaceMember.Role` enum.
|
|
13
|
+
*/
|
|
14
|
+
export declare const Access: Schema.Literal<["pull", "read", "edit", "admin"]>;
|
|
15
|
+
export type Access = typeof Access.Type;
|
|
16
|
+
/**
|
|
17
|
+
* Lifecycle state of a space. Replaces the legacy `SpaceState` protobuf enum (subset relevant to
|
|
18
|
+
* consumers).
|
|
19
|
+
*/
|
|
20
|
+
export declare const State: Schema.Literal<["inactive", "closed", "ready"]>;
|
|
21
|
+
export type State = typeof State.Type;
|
|
22
|
+
/**
|
|
23
|
+
* Who may join a space. Replaces the legacy `MembershipPolicy` protobuf enum: `invite` admits
|
|
24
|
+
* members via invitation only; `locked` admits no new members.
|
|
25
|
+
*/
|
|
26
|
+
export declare const MembershipPolicy: Schema.Literal<["invite", "locked"]>;
|
|
27
|
+
export type MembershipPolicy = typeof MembershipPolicy.Type;
|
|
28
|
+
/**
|
|
29
|
+
* Whether a space replicates through EDGE. Replaces the legacy `EdgeReplicationSetting` protobuf
|
|
30
|
+
* enum.
|
|
31
|
+
*/
|
|
32
|
+
export declare const EdgeReplication: Schema.Literal<["disabled", "enabled"]>;
|
|
33
|
+
export type EdgeReplication = typeof EdgeReplication.Type;
|
|
34
|
+
/**
|
|
35
|
+
* A space membership entry. Membership (HALO) only — liveness/presence is a separate concern
|
|
36
|
+
* (see API_AUDIT.md §3.6).
|
|
37
|
+
*/
|
|
38
|
+
export declare const Member: Schema.Struct<{
|
|
39
|
+
/** DID of the member identity, when known. */
|
|
40
|
+
did: Schema.optional<Schema.Schema<IdentityDid, string, never> & {
|
|
41
|
+
byteLength: number;
|
|
42
|
+
encode: (value: Uint8Array<ArrayBufferLike>) => IdentityDid;
|
|
43
|
+
decode: (value: IdentityDid) => Uint8Array<ArrayBufferLike>;
|
|
44
|
+
isValid: (value: unknown) => value is IdentityDid;
|
|
45
|
+
make: (value: string) => IdentityDid;
|
|
46
|
+
random: () => IdentityDid;
|
|
47
|
+
}>;
|
|
48
|
+
/** Hex-encoded identity key of the member, for avatar/presence keying. */
|
|
49
|
+
identityKey: Schema.optional<typeof Schema.String>;
|
|
50
|
+
displayName: Schema.optional<typeof Schema.String>;
|
|
51
|
+
/** Arbitrary profile metadata (e.g. avatar emoji, hue). */
|
|
52
|
+
data: Schema.optional<Schema.Record$<typeof Schema.String, typeof Schema.Any>>;
|
|
53
|
+
role: Schema.Literal<["pull", "read", "edit", "admin"]>;
|
|
54
|
+
/** Whether the member is currently online. */
|
|
55
|
+
online: typeof Schema.Boolean;
|
|
56
|
+
}>;
|
|
57
|
+
export type Member = typeof Member.Type;
|
|
58
|
+
/**
|
|
59
|
+
* Public view of a space. A plain snapshot — database access stays on the ECHO `Database`
|
|
60
|
+
* service keyed by {@link SpaceId}, not on this value.
|
|
61
|
+
*/
|
|
62
|
+
export declare const Info: Schema.Struct<{
|
|
63
|
+
id: Schema.Schema<SpaceId, string, never> & {
|
|
64
|
+
byteLength: number;
|
|
65
|
+
encode: (value: Uint8Array<ArrayBufferLike>) => SpaceId;
|
|
66
|
+
decode: (value: SpaceId) => Uint8Array<ArrayBufferLike>;
|
|
67
|
+
isValid: (value: unknown) => value is SpaceId;
|
|
68
|
+
make: (value: string) => SpaceId;
|
|
69
|
+
random: () => SpaceId;
|
|
70
|
+
};
|
|
71
|
+
name: Schema.optional<typeof Schema.String>;
|
|
72
|
+
state: Schema.Literal<["inactive", "closed", "ready"]>;
|
|
73
|
+
}>;
|
|
74
|
+
export type Info = typeof Info.Type;
|
|
75
|
+
/**
|
|
76
|
+
* A serialized space archive (export/import payload).
|
|
77
|
+
*/
|
|
78
|
+
export type Archive = {
|
|
79
|
+
readonly filename: string;
|
|
80
|
+
readonly contents: Uint8Array;
|
|
81
|
+
};
|
|
82
|
+
export type CreateOptions = {
|
|
83
|
+
readonly name?: string;
|
|
84
|
+
/** Tags applied to the new space. */
|
|
85
|
+
readonly tags?: readonly string[];
|
|
86
|
+
/** Who may join the space (defaults to `invite`). */
|
|
87
|
+
readonly membershipPolicy?: MembershipPolicy;
|
|
88
|
+
};
|
|
89
|
+
declare const Service_base: Context.TagClass<Service, "@dxos/halo/Space", {
|
|
90
|
+
/**
|
|
91
|
+
* All spaces known to the local identity as a stream that emits the current set immediately
|
|
92
|
+
* on subscription. Take the first element for a one-shot read; subscribe for updates.
|
|
93
|
+
*/
|
|
94
|
+
readonly spaces: Stream.Stream<readonly Info[]>;
|
|
95
|
+
/** Resolve a space by id. */
|
|
96
|
+
readonly get: (id: SpaceId) => Effect.Effect<Option.Option<Info>>;
|
|
97
|
+
/** Create a new space. */
|
|
98
|
+
readonly create: (options?: CreateOptions) => Effect.Effect<Info, SpaceError>;
|
|
99
|
+
/** Resolve once the space has reached the `ready` state. */
|
|
100
|
+
readonly waitReady: (id: SpaceId) => Effect.Effect<void, SpaceError>;
|
|
101
|
+
/** Enable or disable EDGE replication for a space. */
|
|
102
|
+
readonly setEdgeReplication: (id: SpaceId, setting: EdgeReplication) => Effect.Effect<void, SpaceError>;
|
|
103
|
+
/** A space's membership; emits the current set immediately, then on join/leave/role/presence. */
|
|
104
|
+
readonly members: (id: SpaceId) => Stream.Stream<readonly Member[]>;
|
|
105
|
+
/** Change a member's access level (Keyhive delegation). */
|
|
106
|
+
readonly updateMemberRole: (id: SpaceId, subject: IdentityDid, role: Access) => Effect.Effect<void, SpaceError>;
|
|
107
|
+
/** Remove a member (Keyhive revocation). */
|
|
108
|
+
readonly removeMember: (id: SpaceId, subject: IdentityDid) => Effect.Effect<void, SpaceError>;
|
|
109
|
+
/** Initiate a space invitation (host side). */
|
|
110
|
+
readonly share: (id: SpaceId, options?: Invitation.ShareOptions) => Effect.Effect<Invitation.Flow, SpaceError>;
|
|
111
|
+
/** Redeem a space-invitation code (guest side). */
|
|
112
|
+
readonly join: (code: string) => Effect.Effect<Invitation.Flow, SpaceError>;
|
|
113
|
+
/** A space's active (host-created) invitation flows; emits the current set immediately. */
|
|
114
|
+
readonly invitations: (id: SpaceId) => Stream.Stream<readonly Invitation.Flow[]>;
|
|
115
|
+
/** Export a space to an archive. */
|
|
116
|
+
readonly export: (id: SpaceId) => Effect.Effect<Archive, SpaceError>;
|
|
117
|
+
/** Import a space from an archive. */
|
|
118
|
+
readonly import: (archive: Archive, options?: {
|
|
119
|
+
tags?: readonly string[];
|
|
120
|
+
}) => Effect.Effect<Info, SpaceError>;
|
|
121
|
+
}>;
|
|
122
|
+
/**
|
|
123
|
+
* Space management and membership, plus space invitations. `share`/`join` construct
|
|
124
|
+
* {@link Invitation.Flow}s driven through the {@link Invitation} flow verbs; `invitations`
|
|
125
|
+
* observes the active (host-created) space-invitation flows.
|
|
126
|
+
*/
|
|
127
|
+
export declare class Service extends Service_base {
|
|
128
|
+
}
|
|
129
|
+
/** All spaces as a current-value stream (requires {@link Service}). */
|
|
130
|
+
export declare const spaces: Stream.Stream<readonly Info[], never, Service>;
|
|
131
|
+
/** Resolve a space by id (requires {@link Service}). */
|
|
132
|
+
export declare const get: (id: SpaceId) => Effect.Effect<Option.Option<Info>, never, Service>;
|
|
133
|
+
/** Create a new space (requires {@link Service}). */
|
|
134
|
+
export declare const create: (options?: CreateOptions) => Effect.Effect<Info, SpaceError, Service>;
|
|
135
|
+
/** Resolve once the space is ready (requires {@link Service}). */
|
|
136
|
+
export declare const waitReady: (id: SpaceId) => Effect.Effect<void, SpaceError, Service>;
|
|
137
|
+
/** Enable or disable EDGE replication for a space (requires {@link Service}). */
|
|
138
|
+
export declare const setEdgeReplication: (id: SpaceId, setting: EdgeReplication) => Effect.Effect<void, SpaceError, Service>;
|
|
139
|
+
/** A space's membership as a current-value stream (requires {@link Service}). */
|
|
140
|
+
export declare const members: (id: SpaceId) => Stream.Stream<readonly Member[], never, Service>;
|
|
141
|
+
/** Change a member's access level (requires {@link Service}). */
|
|
142
|
+
export declare const updateMemberRole: (id: SpaceId, subject: IdentityDid, role: Access) => Effect.Effect<void, SpaceError, Service>;
|
|
143
|
+
/** Remove a member (requires {@link Service}). */
|
|
144
|
+
export declare const removeMember: (id: SpaceId, subject: IdentityDid) => Effect.Effect<void, SpaceError, Service>;
|
|
145
|
+
/** Initiate a space invitation (requires {@link Service}). */
|
|
146
|
+
export declare const share: (id: SpaceId, options?: Invitation.ShareOptions) => Effect.Effect<Invitation.Flow, SpaceError, Service>;
|
|
147
|
+
/** Redeem a space-invitation code (requires {@link Service}). */
|
|
148
|
+
export declare const join: (code: string) => Effect.Effect<Invitation.Flow, SpaceError, Service>;
|
|
149
|
+
/** A space's active invitation flows as a current-value stream (requires {@link Service}). */
|
|
150
|
+
export declare const invitations: (id: SpaceId) => Stream.Stream<readonly Invitation.Flow[], never, Service>;
|
|
151
|
+
/** Export a space to an archive (requires {@link Service}). */
|
|
152
|
+
export declare const exportSpace: (id: SpaceId) => Effect.Effect<Archive, SpaceError, Service>;
|
|
153
|
+
/** Import a space from an archive (requires {@link Service}). */
|
|
154
|
+
export declare const importSpace: (archive: Archive, options?: {
|
|
155
|
+
tags?: readonly string[];
|
|
156
|
+
}) => Effect.Effect<Info, SpaceError, Service>;
|
|
157
|
+
export {};
|
|
158
|
+
//# sourceMappingURL=Space.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Space.d.ts","sourceRoot":"","sources":["../../../src/Space.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,228 @@
|
|
|
1
|
+
import { BaseError } from '@dxos/errors';
|
|
2
|
+
declare const NotAuthorizedError_base: {
|
|
3
|
+
new (options?: import("@dxos/errors").BaseErrorOptions): {
|
|
4
|
+
cause?: unknown;
|
|
5
|
+
stack?: string;
|
|
6
|
+
name: "NotAuthorizedError";
|
|
7
|
+
context: Record<string, unknown>;
|
|
8
|
+
readonly message: string;
|
|
9
|
+
readonly _tag: "NotAuthorizedError";
|
|
10
|
+
};
|
|
11
|
+
isError(error: unknown): error is Error;
|
|
12
|
+
name: "NotAuthorizedError";
|
|
13
|
+
is(error: unknown): error is BaseError;
|
|
14
|
+
wrap(options?: Omit<import("@dxos/errors").BaseErrorOptions, 'cause'> & {
|
|
15
|
+
ifTypeDiffers?: boolean;
|
|
16
|
+
}): (error: unknown) => {
|
|
17
|
+
cause?: unknown;
|
|
18
|
+
stack?: string;
|
|
19
|
+
name: "NotAuthorizedError";
|
|
20
|
+
context: Record<string, unknown>;
|
|
21
|
+
readonly message: string;
|
|
22
|
+
readonly _tag: "NotAuthorizedError";
|
|
23
|
+
};
|
|
24
|
+
extend<Name extends string = string>(name: Name, message?: string): any;
|
|
25
|
+
captureStackTrace(targetObject: object, constructorOpt?: Function): void;
|
|
26
|
+
prepareStackTrace?: ((err: Error, stackTraces: NodeJS.CallSite[]) => any) | undefined;
|
|
27
|
+
stackTraceLimit: number;
|
|
28
|
+
};
|
|
29
|
+
/**
|
|
30
|
+
* The acting principal lacks the capability required for the operation
|
|
31
|
+
* (e.g. delegating access above their own level, or revoking without causal seniority).
|
|
32
|
+
*/
|
|
33
|
+
export declare class NotAuthorizedError extends NotAuthorizedError_base {
|
|
34
|
+
}
|
|
35
|
+
declare const UnknownPrincipalError_base: {
|
|
36
|
+
new (options?: import("@dxos/errors").BaseErrorOptions): {
|
|
37
|
+
cause?: unknown;
|
|
38
|
+
stack?: string;
|
|
39
|
+
name: "UnknownPrincipalError";
|
|
40
|
+
context: Record<string, unknown>;
|
|
41
|
+
readonly message: string;
|
|
42
|
+
readonly _tag: "UnknownPrincipalError";
|
|
43
|
+
};
|
|
44
|
+
isError(error: unknown): error is Error;
|
|
45
|
+
name: "UnknownPrincipalError";
|
|
46
|
+
is(error: unknown): error is BaseError;
|
|
47
|
+
wrap(options?: Omit<import("@dxos/errors").BaseErrorOptions, 'cause'> & {
|
|
48
|
+
ifTypeDiffers?: boolean;
|
|
49
|
+
}): (error: unknown) => {
|
|
50
|
+
cause?: unknown;
|
|
51
|
+
stack?: string;
|
|
52
|
+
name: "UnknownPrincipalError";
|
|
53
|
+
context: Record<string, unknown>;
|
|
54
|
+
readonly message: string;
|
|
55
|
+
readonly _tag: "UnknownPrincipalError";
|
|
56
|
+
};
|
|
57
|
+
extend<Name extends string = string>(name: Name, message?: string): any;
|
|
58
|
+
captureStackTrace(targetObject: object, constructorOpt?: Function): void;
|
|
59
|
+
prepareStackTrace?: ((err: Error, stackTraces: NodeJS.CallSite[]) => any) | undefined;
|
|
60
|
+
stackTraceLimit: number;
|
|
61
|
+
};
|
|
62
|
+
/**
|
|
63
|
+
* The referenced principal (individual or group) is not known to the service.
|
|
64
|
+
*/
|
|
65
|
+
export declare class UnknownPrincipalError extends UnknownPrincipalError_base {
|
|
66
|
+
}
|
|
67
|
+
declare const InvalidSignatureError_base: {
|
|
68
|
+
new (options?: import("@dxos/errors").BaseErrorOptions): {
|
|
69
|
+
cause?: unknown;
|
|
70
|
+
stack?: string;
|
|
71
|
+
name: "InvalidSignatureError";
|
|
72
|
+
context: Record<string, unknown>;
|
|
73
|
+
readonly message: string;
|
|
74
|
+
readonly _tag: "InvalidSignatureError";
|
|
75
|
+
};
|
|
76
|
+
isError(error: unknown): error is Error;
|
|
77
|
+
name: "InvalidSignatureError";
|
|
78
|
+
is(error: unknown): error is BaseError;
|
|
79
|
+
wrap(options?: Omit<import("@dxos/errors").BaseErrorOptions, 'cause'> & {
|
|
80
|
+
ifTypeDiffers?: boolean;
|
|
81
|
+
}): (error: unknown) => {
|
|
82
|
+
cause?: unknown;
|
|
83
|
+
stack?: string;
|
|
84
|
+
name: "InvalidSignatureError";
|
|
85
|
+
context: Record<string, unknown>;
|
|
86
|
+
readonly message: string;
|
|
87
|
+
readonly _tag: "InvalidSignatureError";
|
|
88
|
+
};
|
|
89
|
+
extend<Name extends string = string>(name: Name, message?: string): any;
|
|
90
|
+
captureStackTrace(targetObject: object, constructorOpt?: Function): void;
|
|
91
|
+
prepareStackTrace?: ((err: Error, stackTraces: NodeJS.CallSite[]) => any) | undefined;
|
|
92
|
+
stackTraceLimit: number;
|
|
93
|
+
};
|
|
94
|
+
/**
|
|
95
|
+
* A signed payload failed signature verification or its id does not match its key.
|
|
96
|
+
*/
|
|
97
|
+
export declare class InvalidSignatureError extends InvalidSignatureError_base {
|
|
98
|
+
}
|
|
99
|
+
declare const MissingDependencyError_base: {
|
|
100
|
+
new (options?: import("@dxos/errors").BaseErrorOptions): {
|
|
101
|
+
cause?: unknown;
|
|
102
|
+
stack?: string;
|
|
103
|
+
name: "MissingDependencyError";
|
|
104
|
+
context: Record<string, unknown>;
|
|
105
|
+
readonly message: string;
|
|
106
|
+
readonly _tag: "MissingDependencyError";
|
|
107
|
+
};
|
|
108
|
+
isError(error: unknown): error is Error;
|
|
109
|
+
name: "MissingDependencyError";
|
|
110
|
+
is(error: unknown): error is BaseError;
|
|
111
|
+
wrap(options?: Omit<import("@dxos/errors").BaseErrorOptions, 'cause'> & {
|
|
112
|
+
ifTypeDiffers?: boolean;
|
|
113
|
+
}): (error: unknown) => {
|
|
114
|
+
cause?: unknown;
|
|
115
|
+
stack?: string;
|
|
116
|
+
name: "MissingDependencyError";
|
|
117
|
+
context: Record<string, unknown>;
|
|
118
|
+
readonly message: string;
|
|
119
|
+
readonly _tag: "MissingDependencyError";
|
|
120
|
+
};
|
|
121
|
+
extend<Name extends string = string>(name: Name, message?: string): any;
|
|
122
|
+
captureStackTrace(targetObject: object, constructorOpt?: Function): void;
|
|
123
|
+
prepareStackTrace?: ((err: Error, stackTraces: NodeJS.CallSite[]) => any) | undefined;
|
|
124
|
+
stackTraceLimit: number;
|
|
125
|
+
};
|
|
126
|
+
/**
|
|
127
|
+
* A membership operation references causal predecessors that have not been received.
|
|
128
|
+
*/
|
|
129
|
+
export declare class MissingDependencyError extends MissingDependencyError_base {
|
|
130
|
+
}
|
|
131
|
+
declare const IdentityError_base: {
|
|
132
|
+
new (options?: import("@dxos/errors").BaseErrorOptions): {
|
|
133
|
+
cause?: unknown;
|
|
134
|
+
stack?: string;
|
|
135
|
+
name: "IdentityError";
|
|
136
|
+
context: Record<string, unknown>;
|
|
137
|
+
readonly message: string;
|
|
138
|
+
readonly _tag: "IdentityError";
|
|
139
|
+
};
|
|
140
|
+
isError(error: unknown): error is Error;
|
|
141
|
+
name: "IdentityError";
|
|
142
|
+
is(error: unknown): error is BaseError;
|
|
143
|
+
wrap(options?: Omit<import("@dxos/errors").BaseErrorOptions, 'cause'> & {
|
|
144
|
+
ifTypeDiffers?: boolean;
|
|
145
|
+
}): (error: unknown) => {
|
|
146
|
+
cause?: unknown;
|
|
147
|
+
stack?: string;
|
|
148
|
+
name: "IdentityError";
|
|
149
|
+
context: Record<string, unknown>;
|
|
150
|
+
readonly message: string;
|
|
151
|
+
readonly _tag: "IdentityError";
|
|
152
|
+
};
|
|
153
|
+
extend<Name extends string = string>(name: Name, message?: string): any;
|
|
154
|
+
captureStackTrace(targetObject: object, constructorOpt?: Function): void;
|
|
155
|
+
prepareStackTrace?: ((err: Error, stackTraces: NodeJS.CallSite[]) => any) | undefined;
|
|
156
|
+
stackTraceLimit: number;
|
|
157
|
+
};
|
|
158
|
+
/**
|
|
159
|
+
* An identity/device operation (create, recover, profile/device update, device invitation) failed.
|
|
160
|
+
*/
|
|
161
|
+
export declare class IdentityError extends IdentityError_base {
|
|
162
|
+
}
|
|
163
|
+
declare const SpaceError_base: {
|
|
164
|
+
new (options?: import("@dxos/errors").BaseErrorOptions): {
|
|
165
|
+
cause?: unknown;
|
|
166
|
+
stack?: string;
|
|
167
|
+
name: "SpaceError";
|
|
168
|
+
context: Record<string, unknown>;
|
|
169
|
+
readonly message: string;
|
|
170
|
+
readonly _tag: "SpaceError";
|
|
171
|
+
};
|
|
172
|
+
isError(error: unknown): error is Error;
|
|
173
|
+
name: "SpaceError";
|
|
174
|
+
is(error: unknown): error is BaseError;
|
|
175
|
+
wrap(options?: Omit<import("@dxos/errors").BaseErrorOptions, 'cause'> & {
|
|
176
|
+
ifTypeDiffers?: boolean;
|
|
177
|
+
}): (error: unknown) => {
|
|
178
|
+
cause?: unknown;
|
|
179
|
+
stack?: string;
|
|
180
|
+
name: "SpaceError";
|
|
181
|
+
context: Record<string, unknown>;
|
|
182
|
+
readonly message: string;
|
|
183
|
+
readonly _tag: "SpaceError";
|
|
184
|
+
};
|
|
185
|
+
extend<Name extends string = string>(name: Name, message?: string): any;
|
|
186
|
+
captureStackTrace(targetObject: object, constructorOpt?: Function): void;
|
|
187
|
+
prepareStackTrace?: ((err: Error, stackTraces: NodeJS.CallSite[]) => any) | undefined;
|
|
188
|
+
stackTraceLimit: number;
|
|
189
|
+
};
|
|
190
|
+
/**
|
|
191
|
+
* A space operation (create, query, membership, invitation, export/import) failed.
|
|
192
|
+
*/
|
|
193
|
+
export declare class SpaceError extends SpaceError_base {
|
|
194
|
+
}
|
|
195
|
+
declare const InvitationError_base: {
|
|
196
|
+
new (options?: import("@dxos/errors").BaseErrorOptions): {
|
|
197
|
+
cause?: unknown;
|
|
198
|
+
stack?: string;
|
|
199
|
+
name: "InvitationError";
|
|
200
|
+
context: Record<string, unknown>;
|
|
201
|
+
readonly message: string;
|
|
202
|
+
readonly _tag: "InvitationError";
|
|
203
|
+
};
|
|
204
|
+
isError(error: unknown): error is Error;
|
|
205
|
+
name: "InvitationError";
|
|
206
|
+
is(error: unknown): error is BaseError;
|
|
207
|
+
wrap(options?: Omit<import("@dxos/errors").BaseErrorOptions, 'cause'> & {
|
|
208
|
+
ifTypeDiffers?: boolean;
|
|
209
|
+
}): (error: unknown) => {
|
|
210
|
+
cause?: unknown;
|
|
211
|
+
stack?: string;
|
|
212
|
+
name: "InvitationError";
|
|
213
|
+
context: Record<string, unknown>;
|
|
214
|
+
readonly message: string;
|
|
215
|
+
readonly _tag: "InvitationError";
|
|
216
|
+
};
|
|
217
|
+
extend<Name extends string = string>(name: Name, message?: string): any;
|
|
218
|
+
captureStackTrace(targetObject: object, constructorOpt?: Function): void;
|
|
219
|
+
prepareStackTrace?: ((err: Error, stackTraces: NodeJS.CallSite[]) => any) | undefined;
|
|
220
|
+
stackTraceLimit: number;
|
|
221
|
+
};
|
|
222
|
+
/**
|
|
223
|
+
* An invitation-lifecycle operation (authenticate, cancel) failed.
|
|
224
|
+
*/
|
|
225
|
+
export declare class InvitationError extends InvitationError_base {
|
|
226
|
+
}
|
|
227
|
+
export {};
|
|
228
|
+
//# sourceMappingURL=errors.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"errors.d.ts","sourceRoot":"","sources":["../../../src/errors.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAEzC;;;GAGG;AACH,qBAAa,kBAAmB,SAAQ,uBAAwD;CAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAEnG;;GAEG;AACH,qBAAa,qBAAsB,SAAQ,0BAA8D;CAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAE5G;;GAEG;AACH,qBAAa,qBAAsB,SAAQ,0BAA8D;CAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAE5G;;GAEG;AACH,qBAAa,sBAAuB,SAAQ,2BAAgE;CAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAE/G;;GAEG;AACH,qBAAa,aAAc,SAAQ,kBAA8D;CAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAEpG;;GAEG;AACH,qBAAa,UAAW,SAAQ,eAAwD;CAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAE3F;;GAEG;AACH,qBAAa,eAAgB,SAAQ,oBAAkE;CAAG"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/index.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,QAAQ,MAAM,YAAY,CAAC;AACvC,OAAO,KAAK,UAAU,MAAM,cAAc,CAAC;AAC3C,OAAO,KAAK,KAAK,MAAM,SAAS,CAAC;AAEjC,cAAc,UAAU,CAAC"}
|