jazz-react-native 0.8.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/LICENSE.txt ADDED
@@ -0,0 +1,19 @@
1
+ Copyright 2024, Garden Computing, Inc.
2
+
3
+ Permission is hereby granted, free of charge, to any person obtaining a copy
4
+ of this software and associated documentation files (the "Software"), to deal
5
+ in the Software without restriction, including without limitation the rights
6
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
7
+ copies of the Software, and to permit persons to whom the Software is
8
+ furnished to do so, subject to the following conditions:
9
+
10
+ The above copyright notice and this permission notice shall be included in all
11
+ copies or substantial portions of the Software.
12
+
13
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
14
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
15
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
16
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
17
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
18
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
19
+ SOFTWARE.
package/README.md ADDED
@@ -0,0 +1,10 @@
1
+ # `jazz-browser`
2
+
3
+ These are browser bindings for Jazz (see [jazz.tools](https://jazz.tools)), a framework for distributed state.
4
+
5
+ Use this only if you want to write Jazz apps using plain JavaScript,
6
+ or to build your framework bindings for Jazz.
7
+
8
+ ## Higher-level framework bindings:
9
+
10
+ - `jazz-react` - React bindings for Jazz
@@ -0,0 +1,28 @@
1
+ import { AgentSecret } from "cojson";
2
+ import { Account, AuthMethod, AuthResult, ID } from "jazz-tools";
3
+ /** @category Auth Providers */
4
+ export declare namespace RNDemoAuth {
5
+ interface Driver {
6
+ onReady: (next: {
7
+ signUp: (username: string) => Promise<void>;
8
+ getExistingUsers: () => Promise<string[]>;
9
+ logInAs: (existingUser: string) => Promise<void>;
10
+ }) => void;
11
+ onSignedIn: (next: {
12
+ logOut: () => void;
13
+ }) => void;
14
+ onError: (error: string | Error) => void;
15
+ }
16
+ }
17
+ export declare class RNDemoAuth implements AuthMethod {
18
+ private driver;
19
+ private storage;
20
+ private constructor();
21
+ static init(driver: RNDemoAuth.Driver, seedAccounts?: {
22
+ [name: string]: {
23
+ accountID: ID<Account>;
24
+ accountSecret: AgentSecret;
25
+ };
26
+ }): Promise<RNDemoAuth>;
27
+ start(): Promise<AuthResult>;
28
+ }
@@ -0,0 +1,132 @@
1
+ import NativeStorageContext from "../native-storage.js";
2
+ const localStorageKey = "demo-auth-logged-in-secret";
3
+ export class RNDemoAuth {
4
+ driver;
5
+ storage;
6
+ constructor(driver, storage) {
7
+ this.driver = driver;
8
+ this.storage = storage;
9
+ }
10
+ static async init(driver, seedAccounts) {
11
+ const storage = NativeStorageContext.getInstance().getStorage();
12
+ for (const [name, credentials] of Object.entries(seedAccounts || {})) {
13
+ const storageData = JSON.stringify(credentials);
14
+ if (!(await storage.get("demo-auth-existing-users"))?.split(",")?.includes(name)) {
15
+ const existingUsers = await storage.get("demo-auth-existing-users");
16
+ if (existingUsers) {
17
+ await storage.set("demo-auth-existing-users", existingUsers + "," + name);
18
+ }
19
+ else {
20
+ await storage.set("demo-auth-existing-users", name);
21
+ }
22
+ }
23
+ await storage.set("demo-auth-existing-users-" + name, storageData);
24
+ }
25
+ return new RNDemoAuth(driver, storage);
26
+ }
27
+ async start() {
28
+ try {
29
+ if (await this.storage.get(localStorageKey)) {
30
+ const localStorageData = JSON.parse((await this.storage.get(localStorageKey)) ?? "{}");
31
+ const accountID = localStorageData.accountID;
32
+ const secret = localStorageData.accountSecret;
33
+ return {
34
+ type: "existing",
35
+ credentials: { accountID, secret },
36
+ onSuccess: () => {
37
+ this.driver.onSignedIn({ logOut });
38
+ },
39
+ onError: (error) => {
40
+ this.driver.onError(error);
41
+ },
42
+ logOut: async () => {
43
+ void (await this.storage.delete(localStorageKey));
44
+ },
45
+ };
46
+ }
47
+ else {
48
+ return new Promise((resolve) => {
49
+ this.driver.onReady({
50
+ // @ts-expect-error asd
51
+ signUp: (username) => {
52
+ resolve({
53
+ type: "new",
54
+ creationProps: { name: username },
55
+ saveCredentials: async (credentials) => {
56
+ const storageData = JSON.stringify({
57
+ accountID: credentials.accountID,
58
+ accountSecret: credentials.secret,
59
+ });
60
+ // Retrieve the list of existing users
61
+ const existingUsers = await this.storage.get("demo-auth-existing-users");
62
+ const existingUsernames = existingUsers
63
+ ? existingUsers.split(",")
64
+ : [];
65
+ // Determine if the username already exists and generate a unique username
66
+ let uniqueUsername = username;
67
+ let counter = 1;
68
+ while (existingUsernames.includes(uniqueUsername)) {
69
+ counter++;
70
+ uniqueUsername = `${username}-${counter}`;
71
+ }
72
+ // Save credentials using the unique username
73
+ await this.storage.set(localStorageKey, storageData);
74
+ await this.storage.set("demo-auth-existing-users-" +
75
+ uniqueUsername, storageData);
76
+ // Update the list of existing users
77
+ const updatedUsers = existingUsers
78
+ ? `${existingUsers},${uniqueUsername}`
79
+ : uniqueUsername;
80
+ await this.storage.set("demo-auth-existing-users", updatedUsers);
81
+ },
82
+ onSuccess: () => {
83
+ this.driver.onSignedIn({ logOut });
84
+ },
85
+ onError: (error) => {
86
+ // @ts-expect-error asd
87
+ console.error("onError", error.cause);
88
+ this.driver.onError(error);
89
+ },
90
+ logOut: async () => {
91
+ void (await this.storage.delete(localStorageKey));
92
+ },
93
+ });
94
+ },
95
+ getExistingUsers: async () => {
96
+ return ((await this.storage.get("demo-auth-existing-users"))?.split(",") ?? []);
97
+ },
98
+ logInAs: async (existingUser) => {
99
+ const storageData = JSON.parse((await this.storage.get("demo-auth-existing-users-" + existingUser)) ?? "{}");
100
+ await this.storage.set(localStorageKey, JSON.stringify(storageData));
101
+ resolve({
102
+ type: "existing",
103
+ credentials: {
104
+ accountID: storageData.accountID,
105
+ secret: storageData.accountSecret,
106
+ },
107
+ onSuccess: () => {
108
+ this.driver.onSignedIn({ logOut });
109
+ },
110
+ onError: (error) => {
111
+ this.driver.onError(error);
112
+ },
113
+ logOut: async () => {
114
+ void (await this.storage.delete(localStorageKey));
115
+ },
116
+ });
117
+ },
118
+ });
119
+ });
120
+ }
121
+ }
122
+ catch (error) {
123
+ console.error("error", error);
124
+ throw error;
125
+ }
126
+ }
127
+ }
128
+ async function logOut() {
129
+ const storage = NativeStorageContext.getInstance().getStorage();
130
+ void (await storage.delete(localStorageKey));
131
+ }
132
+ //# sourceMappingURL=DemoAuthMethod.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"DemoAuthMethod.js","sourceRoot":"","sources":["../../src/auth/DemoAuthMethod.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,33 @@
1
+ import React from "react";
2
+ import { AgentSecret } from "cojson";
3
+ import { Account, ID } from "jazz-tools";
4
+ import { RNDemoAuth } from "./DemoAuthMethod.js";
5
+ type DemoAuthState = ({
6
+ state: "uninitialized";
7
+ } | {
8
+ state: "loading";
9
+ } | {
10
+ state: "ready";
11
+ existingUsers: string[];
12
+ signUp: (username: string) => void;
13
+ logInAs: (existingUser: string) => void;
14
+ } | {
15
+ state: "signedIn";
16
+ logOut: () => void;
17
+ }) & {
18
+ errors: string[];
19
+ };
20
+ /** @category Auth Providers */
21
+ export declare function useDemoAuth({ seedAccounts, }?: {
22
+ seedAccounts?: {
23
+ [name: string]: {
24
+ accountID: ID<Account>;
25
+ accountSecret: AgentSecret;
26
+ };
27
+ };
28
+ }): readonly [RNDemoAuth | null, DemoAuthState];
29
+ export declare const DemoAuthBasicUI: ({ appName, state, }: {
30
+ appName: string;
31
+ state: DemoAuthState;
32
+ }) => React.JSX.Element;
33
+ export {};
@@ -0,0 +1,203 @@
1
+ import React, { useMemo, useState, useEffect } from "react";
2
+ import { View, Text, TouchableOpacity, TextInput, StyleSheet, } from "react-native";
3
+ import { RNDemoAuth } from "./DemoAuthMethod.js";
4
+ /** @category Auth Providers */
5
+ export function useDemoAuth({ seedAccounts, } = {}) {
6
+ const [state, setState] = useState({
7
+ state: "loading",
8
+ errors: [],
9
+ });
10
+ const [authMethod, setAuthMethod] = useState(null);
11
+ const authMethodPromise = useMemo(() => {
12
+ return RNDemoAuth.init({
13
+ onReady: async ({ signUp, getExistingUsers, logInAs }) => {
14
+ const existingUsers = await getExistingUsers();
15
+ setState({
16
+ state: "ready",
17
+ signUp,
18
+ existingUsers,
19
+ logInAs,
20
+ errors: [],
21
+ });
22
+ },
23
+ onSignedIn: ({ logOut }) => {
24
+ setState({ state: "signedIn", logOut, errors: [] });
25
+ },
26
+ onError: (error) => {
27
+ setState((current) => ({
28
+ ...current,
29
+ errors: [...current.errors, error.toString()],
30
+ }));
31
+ },
32
+ }, seedAccounts);
33
+ }, [seedAccounts]);
34
+ useEffect(() => {
35
+ async function init() {
36
+ const auth = await authMethodPromise;
37
+ setAuthMethod(auth);
38
+ }
39
+ if (authMethod)
40
+ return;
41
+ void init();
42
+ }, [seedAccounts]);
43
+ return [authMethod, state];
44
+ }
45
+ export const DemoAuthBasicUI = ({ appName, state, }) => {
46
+ const darkMode = false;
47
+ const [username, setUsername] = useState("");
48
+ const [errorMessage, setErrorMessage] = useState(null);
49
+ const handleSignUp = () => {
50
+ if (state.state !== "ready")
51
+ return;
52
+ if (username.trim() === "") {
53
+ setErrorMessage("Display name is required");
54
+ }
55
+ else {
56
+ setErrorMessage(null);
57
+ state.signUp(username);
58
+ }
59
+ };
60
+ return (<View style={[
61
+ styles.container,
62
+ darkMode ? styles.darkBackground : styles.lightBackground,
63
+ ]}>
64
+ {state.state === "loading" ? (<Text style={styles.loadingText}>Loading...</Text>) : state.state === "ready" ? (<View style={styles.formContainer}>
65
+ <Text style={[
66
+ styles.headerText,
67
+ darkMode ? styles.darkText : styles.lightText,
68
+ ]}>
69
+ {appName}
70
+ </Text>
71
+
72
+ {state.errors.map((error) => (<Text key={error} style={styles.errorText}>
73
+ {error}
74
+ </Text>))}
75
+
76
+ {errorMessage && (<Text style={styles.errorText}>{errorMessage}</Text>)}
77
+
78
+ <TextInput placeholder="Display name" value={username} onChangeText={setUsername} placeholderTextColor={darkMode ? "#fff" : "#000"} style={[
79
+ styles.textInput,
80
+ darkMode ? styles.darkInput : styles.lightInput,
81
+ ]}/>
82
+
83
+ <TouchableOpacity onPress={handleSignUp} style={[
84
+ styles.button,
85
+ darkMode ? styles.darkButton : styles.lightButton,
86
+ ]}>
87
+ <Text style={darkMode
88
+ ? styles.darkButtonText
89
+ : styles.lightButtonText}>
90
+ Sign Up as new account
91
+ </Text>
92
+ </TouchableOpacity>
93
+
94
+ <View style={styles.existingUsersContainer}>
95
+ {state.existingUsers.map((user) => (<TouchableOpacity key={user} onPress={() => state.logInAs(user)} style={[
96
+ styles.existingUserButton,
97
+ darkMode
98
+ ? styles.darkUserButton
99
+ : styles.lightUserButton,
100
+ ]}>
101
+ <Text style={darkMode
102
+ ? styles.darkText
103
+ : styles.lightText}>
104
+ Log In as "{user}"
105
+ </Text>
106
+ </TouchableOpacity>))}
107
+ </View>
108
+ </View>) : null}
109
+ </View>);
110
+ };
111
+ const styles = StyleSheet.create({
112
+ container: {
113
+ flex: 1,
114
+ justifyContent: "center",
115
+ alignItems: "center",
116
+ padding: 20,
117
+ },
118
+ formContainer: {
119
+ width: "80%",
120
+ alignItems: "center",
121
+ justifyContent: "center",
122
+ },
123
+ headerText: {
124
+ fontSize: 24,
125
+ marginBottom: 20,
126
+ },
127
+ errorText: {
128
+ color: "red",
129
+ marginVertical: 5,
130
+ textAlign: "center",
131
+ },
132
+ textInput: {
133
+ borderWidth: 1,
134
+ padding: 10,
135
+ marginVertical: 10,
136
+ width: "100%",
137
+ borderRadius: 6,
138
+ },
139
+ darkInput: {
140
+ borderColor: "#444",
141
+ backgroundColor: "#000",
142
+ color: "#fff",
143
+ },
144
+ lightInput: {
145
+ borderColor: "#ddd",
146
+ backgroundColor: "#fff",
147
+ color: "#000",
148
+ },
149
+ button: {
150
+ paddingVertical: 15,
151
+ paddingHorizontal: 10,
152
+ borderRadius: 6,
153
+ width: "100%",
154
+ marginVertical: 10,
155
+ },
156
+ darkButton: {
157
+ backgroundColor: "#444",
158
+ },
159
+ lightButton: {
160
+ backgroundColor: "#ddd",
161
+ },
162
+ darkButtonText: {
163
+ color: "#fff",
164
+ textAlign: "center",
165
+ },
166
+ lightButtonText: {
167
+ color: "#000",
168
+ textAlign: "center",
169
+ },
170
+ existingUsersContainer: {
171
+ width: "100%",
172
+ marginTop: 20,
173
+ },
174
+ existingUserButton: {
175
+ paddingVertical: 15,
176
+ paddingHorizontal: 10,
177
+ borderRadius: 6,
178
+ marginVertical: 5,
179
+ },
180
+ darkUserButton: {
181
+ backgroundColor: "#222",
182
+ },
183
+ lightUserButton: {
184
+ backgroundColor: "#eee",
185
+ },
186
+ loadingText: {
187
+ fontSize: 18,
188
+ color: "#888",
189
+ },
190
+ darkText: {
191
+ color: "#fff",
192
+ },
193
+ lightText: {
194
+ color: "#000",
195
+ },
196
+ darkBackground: {
197
+ backgroundColor: "#000",
198
+ },
199
+ lightBackground: {
200
+ backgroundColor: "#fff",
201
+ },
202
+ });
203
+ //# sourceMappingURL=DemoAuthUI.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"DemoAuthUI.js","sourceRoot":"","sources":["../../src/auth/DemoAuthUI.tsx"],"names":[],"mappings":"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"}
@@ -0,0 +1 @@
1
+ export * from "./DemoAuthUI.js";
@@ -0,0 +1,2 @@
1
+ export * from "./DemoAuthUI.js";
2
+ //# sourceMappingURL=auth.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"auth.js","sourceRoot":"","sources":["../../src/auth/auth.ts"],"names":[],"mappings":"AAAA,cAAc,iBAAiB,CAAC"}
@@ -0,0 +1,50 @@
1
+ import { CoValue, ID, AgentID, SessionID, InviteSecret, Account, CoValueClass, CryptoProvider, AuthMethod, AnonymousJazzAgent } from "jazz-tools";
2
+ import { RawAccountID } from "cojson";
3
+ export { RNDemoAuth } from "./auth/DemoAuthMethod.js";
4
+ /** @category Context Creation */
5
+ export type BrowserContext<Acc extends Account> = {
6
+ me: Acc;
7
+ logOut: () => void;
8
+ done: () => void;
9
+ };
10
+ export type BrowserGuestContext = {
11
+ guest: AnonymousJazzAgent;
12
+ logOut: () => void;
13
+ done: () => void;
14
+ };
15
+ export type BrowserContextOptions<Acc extends Account> = {
16
+ auth: AuthMethod;
17
+ AccountSchema: CoValueClass<Acc> & {
18
+ fromNode: (typeof Account)["fromNode"];
19
+ };
20
+ } & BaseBrowserContextOptions;
21
+ export type BaseBrowserContextOptions = {
22
+ peer: `wss://${string}` | `ws://${string}`;
23
+ reconnectionTimeout?: number;
24
+ storage?: "indexedDB" | "singleTabOPFS";
25
+ crypto?: CryptoProvider;
26
+ };
27
+ /** @category Context Creation */
28
+ export declare function createJazzRNContext<Acc extends Account>(options: BrowserContextOptions<Acc>): Promise<BrowserContext<Acc>>;
29
+ export declare function createJazzRNContext(options: BaseBrowserContextOptions): Promise<BrowserGuestContext>;
30
+ export declare function createJazzRNContext<Acc extends Account>(options: BrowserContextOptions<Acc> | BaseBrowserContextOptions): Promise<BrowserContext<Acc> | BrowserGuestContext>;
31
+ /** @category Auth Providers */
32
+ export type SessionProvider = (accountID: ID<Account> | AgentID) => Promise<SessionID>;
33
+ export declare function provideLockSession(accountID: ID<Account> | AgentID, crypto: CryptoProvider): Promise<{
34
+ sessionID: `${RawAccountID}_session_z${string}` | `sealer_z${string}/signer_z${string}_session_z${string}`;
35
+ sessionDone: () => void;
36
+ }>;
37
+ /** @category Invite Links */
38
+ export declare function createInviteLink<C extends CoValue>(value: C, role: "reader" | "writer" | "admin", { baseURL, valueHint }?: {
39
+ baseURL?: string;
40
+ valueHint?: string;
41
+ }): string;
42
+ /** @category Invite Links */
43
+ export declare function parseInviteLink<C extends CoValue>(inviteURL: string): {
44
+ valueID: ID<C>;
45
+ valueHint?: string;
46
+ inviteSecret: InviteSecret;
47
+ } | undefined;
48
+ export * from "./provider.js";
49
+ export * from "./auth/auth.js";
50
+ export * from "./native-storage.js";
package/dist/index.js ADDED
@@ -0,0 +1,153 @@
1
+ /* eslint-disable @typescript-eslint/no-explicit-any */
2
+ /* eslint-disable @typescript-eslint/no-unused-vars */
3
+ import { cojsonInternals, createJazzContext, } from "jazz-tools";
4
+ import { PureJSCrypto } from "jazz-tools/native";
5
+ import { createWebSocketPeer } from "cojson-transport-ws";
6
+ import NetInfo from "@react-native-community/netinfo";
7
+ import * as Linking from "expo-linking";
8
+ export { RNDemoAuth } from "./auth/DemoAuthMethod.js";
9
+ import { NativeStorageContext } from "./native-storage.js";
10
+ export async function createJazzRNContext(options) {
11
+ const firstWsPeer = createWebSocketPeer({
12
+ websocket: new WebSocket(options.peer),
13
+ id: options.peer + "@" + new Date().toISOString(),
14
+ role: "server",
15
+ expectPings: true,
16
+ });
17
+ let shouldTryToReconnect = true;
18
+ let currentReconnectionTimeout = options.reconnectionTimeout || 500;
19
+ const unsubscribeNetworkChange = NetInfo.addEventListener((state) => {
20
+ if (state.isConnected) {
21
+ currentReconnectionTimeout = options.reconnectionTimeout || 500;
22
+ }
23
+ });
24
+ const context = "auth" in options
25
+ ? await createJazzContext({
26
+ AccountSchema: options.AccountSchema,
27
+ auth: options.auth,
28
+ crypto: await PureJSCrypto.create(),
29
+ peersToLoadFrom: [firstWsPeer],
30
+ sessionProvider: provideLockSession,
31
+ })
32
+ : await createJazzContext({
33
+ crypto: await PureJSCrypto.create(),
34
+ peersToLoadFrom: [firstWsPeer],
35
+ });
36
+ const node = "account" in context
37
+ ? context.account._raw.core.node
38
+ : context.agent.node;
39
+ async function websocketReconnectLoop() {
40
+ while (shouldTryToReconnect) {
41
+ if (Object.keys(node.syncManager.peers).some((peerId) => peerId.includes(options.peer))) {
42
+ // TODO: this might drain battery, use listeners instead
43
+ await new Promise((resolve) => setTimeout(resolve, 100));
44
+ }
45
+ else {
46
+ console.log("Websocket disconnected, trying to reconnect in " +
47
+ currentReconnectionTimeout +
48
+ "ms");
49
+ currentReconnectionTimeout = Math.min(currentReconnectionTimeout * 2, 30000);
50
+ await new Promise((resolve) => {
51
+ setTimeout(resolve, currentReconnectionTimeout);
52
+ const _unsubscribeNetworkChange = NetInfo.addEventListener((state) => {
53
+ if (state.isConnected) {
54
+ resolve();
55
+ _unsubscribeNetworkChange();
56
+ }
57
+ });
58
+ });
59
+ node.syncManager.addPeer(createWebSocketPeer({
60
+ websocket: new WebSocket(options.peer),
61
+ id: options.peer + "@" + new Date().toISOString(),
62
+ role: "server",
63
+ }));
64
+ }
65
+ }
66
+ }
67
+ void websocketReconnectLoop();
68
+ return "account" in context
69
+ ? {
70
+ me: context.account,
71
+ done: () => {
72
+ shouldTryToReconnect = false;
73
+ unsubscribeNetworkChange?.();
74
+ context.done();
75
+ },
76
+ logOut: () => {
77
+ context.logOut();
78
+ },
79
+ }
80
+ : {
81
+ guest: context.agent,
82
+ done: () => {
83
+ shouldTryToReconnect = false;
84
+ unsubscribeNetworkChange?.();
85
+ context.done();
86
+ },
87
+ logOut: () => {
88
+ context.logOut();
89
+ },
90
+ };
91
+ }
92
+ export async function provideLockSession(accountID, crypto) {
93
+ const sessionDone = () => { };
94
+ const storage = NativeStorageContext.getInstance().getStorage();
95
+ const sessionID = (await storage.get(accountID)) ||
96
+ crypto.newRandomSessionID(accountID);
97
+ await storage.set(accountID, sessionID);
98
+ return Promise.resolve({
99
+ sessionID,
100
+ sessionDone,
101
+ });
102
+ }
103
+ const window = {
104
+ location: {
105
+ href: "#",
106
+ },
107
+ history: {
108
+ replaceState: (a, b, c) => { },
109
+ },
110
+ };
111
+ /** @category Invite Links */
112
+ export function createInviteLink(value, role, { baseURL, valueHint } = {}) {
113
+ const coValueCore = value._raw.core;
114
+ let currentCoValue = coValueCore;
115
+ while (currentCoValue.header.ruleset.type === "ownedByGroup") {
116
+ currentCoValue = currentCoValue.getGroup().core;
117
+ }
118
+ if (currentCoValue.header.ruleset.type !== "group") {
119
+ throw new Error("Can't create invite link for object without group");
120
+ }
121
+ const group = cojsonInternals.expectGroup(currentCoValue.getCurrentContent());
122
+ const inviteSecret = group.createInvite(role);
123
+ return `${baseURL}/invite/${valueHint ? valueHint + "/" : ""}${value.id}/${inviteSecret}`;
124
+ }
125
+ /** @category Invite Links */
126
+ export function parseInviteLink(inviteURL) {
127
+ const url = Linking.parse(inviteURL);
128
+ const parts = url.path?.split("/");
129
+ if (!parts || parts[0] !== "invite") {
130
+ return undefined;
131
+ }
132
+ let valueHint;
133
+ let valueID;
134
+ let inviteSecret;
135
+ if (parts.length === 4) {
136
+ valueHint = parts[1];
137
+ valueID = parts[2];
138
+ inviteSecret = parts[3];
139
+ }
140
+ else if (parts.length === 3) {
141
+ valueID = parts[1];
142
+ inviteSecret = parts[2];
143
+ }
144
+ if (!valueID || !inviteSecret) {
145
+ return undefined;
146
+ }
147
+ return { valueID, inviteSecret, valueHint };
148
+ }
149
+ /////////
150
+ export * from "./provider.js";
151
+ export * from "./auth/auth.js";
152
+ export * from "./native-storage.js";
153
+ //# sourceMappingURL=index.js.map