jazz-react-native 0.8.51 → 0.9.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/.turbo/turbo-build.log +1 -1
- package/CHANGELOG.md +19 -0
- package/README.md +1 -1
- package/dist/auth/DemoAuthMethod.d.ts +1 -0
- package/dist/auth/DemoAuthMethod.js +17 -4
- package/dist/auth/DemoAuthMethod.js.map +1 -1
- package/dist/auth/DemoAuthUI.js +11 -6
- package/dist/auth/DemoAuthUI.js.map +1 -1
- package/dist/hooks.d.ts +10056 -0
- package/dist/hooks.js +36 -0
- package/dist/hooks.js.map +1 -0
- package/dist/index.d.ts +2 -49
- package/dist/index.js +2 -128
- package/dist/index.js.map +1 -1
- package/dist/platform.d.ts +51 -0
- package/dist/platform.js +100 -0
- package/dist/platform.js.map +1 -0
- package/dist/provider.d.ts +13 -45
- package/dist/provider.js +52 -122
- package/dist/provider.js.map +1 -1
- package/dist/storage/kv-store-context.d.ts +1 -0
- package/dist/storage/kv-store-context.js +3 -0
- package/dist/storage/kv-store-context.js.map +1 -1
- package/dist/testing.d.ts +1 -0
- package/dist/testing.js +2 -0
- package/dist/testing.js.map +1 -0
- package/dist/tests/DemoAuthMethod.test.js +28 -7
- package/dist/tests/DemoAuthMethod.test.js.map +1 -1
- package/package.json +10 -5
- package/src/auth/DemoAuthMethod.ts +24 -4
- package/src/auth/DemoAuthUI.tsx +13 -6
- package/src/hooks.tsx +60 -0
- package/src/index.ts +3 -240
- package/src/platform.ts +205 -0
- package/src/provider.tsx +77 -282
- package/src/storage/kv-store-context.ts +4 -0
- package/src/testing.tsx +1 -0
- package/src/tests/DemoAuthMethod.test.ts +34 -7
package/dist/provider.js.map
CHANGED
@@ -1 +1 @@
|
|
1
|
-
{"version":3,"file":"provider.js","sourceRoot":"","sources":["../src/provider.tsx"],"names":[],"mappings":"AAAA,OAAO,
|
1
|
+
{"version":3,"file":"provider.js","sourceRoot":"","sources":["../src/provider.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAmB,MAAM,iBAAiB,CAAC;AAC/D,OAAO,EAAE,OAAO,EAA4B,MAAM,YAAY,CAAC;AAC/D,OAAO,EAAE,QAAQ,EAAE,MAAM,OAAO,CAAC;AACjC,OAAO,EAAE,SAAS,EAAE,MAAM,EAAE,MAAM,OAAO,CAAC;AAC1C,OAAO,EAEL,mBAAmB,GACpB,MAAM,eAAe,CAAC;AAevB,gCAAgC;AAChC,MAAM,UAAU,YAAY,CAA0C,EACpE,QAAQ,EACR,IAAI,EACJ,IAAI,EACJ,aAAa,GAAG,OAAuC,EACvD,cAAc,GACS;IACvB,MAAM,CAAC,GAAG,EAAE,MAAM,CAAC,GAAG,QAAQ,EAAoC,CAAC;IAEnE,MAAM,CAAC,YAAY,EAAE,eAAe,CAAC,GAAG,QAAQ,CAAC,CAAC,CAAC,CAAC;IAEpD,MAAM,cAAc,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC;IACrC,cAAc,CAAC,OAAO,GAAG,KAAK,CAAC;IAE/B,SAAS,CAAC,GAAG,EAAE;QACb,iFAAiF;QACjF,IAAI,OAAO,CAAC,GAAG,CAAC,QAAQ,KAAK,aAAa,EAAE,CAAC;YAC3C,IAAI,cAAc,CAAC,OAAO,EAAE,CAAC;gBAC3B,OAAO;YACT,CAAC;YACD,cAAc,CAAC,OAAO,GAAG,IAAI,CAAC;YAE9B,2EAA2E;YAC3E,0EAA0E;YAC1E,EAAE;YACF,qDAAqD;YACrD,MAAM,eAAe,GAAG,GAAG,CAAC;YAE5B,IAAI,eAAe,EAAE,CAAC;gBACpB,eAAe,CAAC,IAAI,EAAE,CAAC;YACzB,CAAC;QACH,CAAC;QAED,KAAK,UAAU,aAAa;YAC1B,MAAM,cAAc,GAAG,MAAM,mBAAmB,CAC9C,IAAI,KAAK,OAAO;gBACd,CAAC,CAAC;oBACE,IAAI;oBACJ,cAAc;iBACf;gBACH,CAAC,CAAC;oBACE,aAAa;oBACb,IAAI,EAAE,IAAI;oBACV,IAAI;oBACJ,cAAc;iBACf,CACN,CAAC;YAEF,MAAM,MAAM,GAAG,GAAG,EAAE;gBAClB,cAAc,CAAC,MAAM,EAAE,CAAC;gBACxB,MAAM,CAAC,SAAS,CAAC,CAAC;gBAClB,eAAe,CAAC,YAAY,GAAG,CAAC,CAAC,CAAC;gBAElC,IAAI,OAAO,CAAC,GAAG,CAAC,QAAQ,KAAK,aAAa,EAAE,CAAC;oBAC3C,yDAAyD;oBACzD,uCAAuC;oBACvC,cAAc,CAAC,IAAI,EAAE,CAAC;gBACxB,CAAC;YACH,CAAC,CAAC;YAEF,MAAM,CAAC;gBACL,GAAG,cAAc;gBACjB,aAAa;gBACb,MAAM;aACP,CAAC,CAAC;YAEH,OAAO,cAAc,CAAC;QACxB,CAAC;QAED,MAAM,OAAO,GAAG,aAAa,EAAE,CAAC;QAEhC,2EAA2E;QAC3E,0EAA0E;QAC1E,IAAI,OAAO,CAAC,GAAG,CAAC,QAAQ,KAAK,aAAa,EAAE,CAAC;YAC3C,OAAO;QACT,CAAC;QAED,OAAO,GAAG,EAAE;YACV,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,OAAO,CAAC,IAAI,EAAE,CAAC,CAAC;QACjD,CAAC,CAAC;IACJ,CAAC,EAAE,CAAC,aAAa,EAAE,IAAI,EAAE,IAAI,EAAE,YAAY,CAAC,CAAC,CAAC;IAE9C,OAAO,CACL,CAAC,WAAW,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,IAAI,QAAQ,CAAC,EAAE,WAAW,CAAC,QAAQ,CAAC,CAC3E,CAAC;AACJ,CAAC"}
|
@@ -1 +1 @@
|
|
1
|
-
{"version":3,"file":"kv-store-context.js","sourceRoot":"","sources":["../../src/storage/kv-store-context.ts"],"names":[],"mappings":"AAOA,MAAM,OAAO,cAAc;IACjB,MAAM,CAAC,QAAQ,CAAiB;IAChC,eAAe,GAAmB,IAAI,CAAC;IAE/C,gBAAuB,CAAC;IAEjB,MAAM,CAAC,WAAW;QACvB,IAAI,CAAC,cAAc,CAAC,QAAQ,EAAE,CAAC;YAC7B,cAAc,CAAC,QAAQ,GAAG,IAAI,cAAc,EAAE,CAAC;QACjD,CAAC;QACD,OAAO,cAAc,CAAC,QAAQ,CAAC;IACjC,CAAC;IAEM,UAAU,CAAC,KAAc;QAC9B,IAAI,CAAC,IAAI,CAAC,eAAe,EAAE,CAAC;YAC1B,IAAI,CAAC,eAAe,GAAG,KAAK,CAAC;QAC/B,CAAC;IACH,CAAC;IAEM,UAAU;QACf,IAAI,CAAC,IAAI,CAAC,eAAe,EAAE,CAAC;YAC1B,MAAM,IAAI,KAAK,CAAC,sCAAsC,CAAC,CAAC;QAC1D,CAAC;QACD,OAAO,IAAI,CAAC,eAAe,CAAC;IAC9B,CAAC;CACF;AAED,eAAe,cAAc,CAAC"}
|
1
|
+
{"version":3,"file":"kv-store-context.js","sourceRoot":"","sources":["../../src/storage/kv-store-context.ts"],"names":[],"mappings":"AAOA,MAAM,OAAO,cAAc;IACjB,MAAM,CAAC,QAAQ,CAAiB;IAChC,eAAe,GAAmB,IAAI,CAAC;IAE/C,gBAAuB,CAAC;IAEjB,MAAM,CAAC,WAAW;QACvB,IAAI,CAAC,cAAc,CAAC,QAAQ,EAAE,CAAC;YAC7B,cAAc,CAAC,QAAQ,GAAG,IAAI,cAAc,EAAE,CAAC;QACjD,CAAC;QACD,OAAO,cAAc,CAAC,QAAQ,CAAC;IACjC,CAAC;IAEM,aAAa;QAClB,OAAO,IAAI,CAAC,eAAe,KAAK,IAAI,CAAC;IACvC,CAAC;IAEM,UAAU,CAAC,KAAc;QAC9B,IAAI,CAAC,IAAI,CAAC,eAAe,EAAE,CAAC;YAC1B,IAAI,CAAC,eAAe,GAAG,KAAK,CAAC;QAC/B,CAAC;IACH,CAAC;IAEM,UAAU;QACf,IAAI,CAAC,IAAI,CAAC,eAAe,EAAE,CAAC;YAC1B,MAAM,IAAI,KAAK,CAAC,sCAAsC,CAAC,CAAC;QAC1D,CAAC;QACD,OAAO,IAAI,CAAC,eAAe,CAAC;IAC9B,CAAC;CACF;AAED,eAAe,cAAc,CAAC"}
|
@@ -0,0 +1 @@
|
|
1
|
+
export * from "jazz-react-core/testing";
|
package/dist/testing.js
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
{"version":3,"file":"testing.js","sourceRoot":"","sources":["../src/testing.tsx"],"names":[],"mappings":"AAAA,cAAc,yBAAyB,CAAC"}
|
@@ -1,15 +1,25 @@
|
|
1
1
|
import { beforeEach, describe, expect, it, vi } from "vitest";
|
2
|
-
import { RNDemoAuth } from "../auth/DemoAuthMethod";
|
2
|
+
import { RNDemoAuth, encodeUsername } from "../auth/DemoAuthMethod";
|
3
3
|
import { KvStoreContext } from "../storage/kv-store-context";
|
4
4
|
// Initialize mock storage
|
5
5
|
const mockStorage = {};
|
6
|
+
function validateKey(key) {
|
7
|
+
if (key.includes("+") || key.includes("/") || key.includes("=")) {
|
8
|
+
throw new Error("Invalid key");
|
9
|
+
}
|
10
|
+
}
|
6
11
|
// Mock KvStore implementation
|
7
12
|
const mockKvStore = {
|
8
|
-
get: vi.fn(async (key) =>
|
13
|
+
get: vi.fn(async (key) => {
|
14
|
+
validateKey(key);
|
15
|
+
return mockStorage[key] || null;
|
16
|
+
}),
|
9
17
|
set: vi.fn(async (key, value) => {
|
18
|
+
validateKey(key);
|
10
19
|
mockStorage[key] = value;
|
11
20
|
}),
|
12
21
|
delete: vi.fn(async (key) => {
|
22
|
+
validateKey(key);
|
13
23
|
delete mockStorage[key];
|
14
24
|
}),
|
15
25
|
clearAll: vi.fn(async () => {
|
@@ -45,7 +55,7 @@ describe("RNDemoAuth", () => {
|
|
45
55
|
};
|
46
56
|
await RNDemoAuth.init(mockDriver, seedAccounts);
|
47
57
|
expect(mockKvStore.set).toHaveBeenCalledWith("demo-auth-existing-users", "testUser");
|
48
|
-
expect(mockKvStore.set).toHaveBeenCalledWith("demo-auth-existing-users-" +
|
58
|
+
expect(mockKvStore.set).toHaveBeenCalledWith("demo-auth-existing-users-" + encodeUsername("testUser"), expect.any(String));
|
49
59
|
});
|
50
60
|
});
|
51
61
|
describe("authentication", () => {
|
@@ -60,6 +70,17 @@ describe("RNDemoAuth", () => {
|
|
60
70
|
expect(result.type).toBe("new");
|
61
71
|
expect(result.saveCredentials).toBeDefined();
|
62
72
|
});
|
73
|
+
it("should convert unsupported chars from base64 to a valid key", async () => {
|
74
|
+
const { mockDriver } = setup();
|
75
|
+
mockDriver.onReady = vi.fn(({ signUp }) => {
|
76
|
+
signUp(atob("+/=="));
|
77
|
+
});
|
78
|
+
const auth = await RNDemoAuth.init(mockDriver);
|
79
|
+
const result = await auth.start();
|
80
|
+
expect(mockDriver.onReady).toHaveBeenCalled();
|
81
|
+
expect(result.type).toBe("new");
|
82
|
+
expect(result.saveCredentials).toBeDefined();
|
83
|
+
});
|
63
84
|
it("should handle existing user login", async () => {
|
64
85
|
const { mockStorage, mockDriver } = setup();
|
65
86
|
// Set up existing user in storage
|
@@ -105,7 +126,7 @@ describe("RNDemoAuth", () => {
|
|
105
126
|
accountID: "test-account-id",
|
106
127
|
secret: "test-secret",
|
107
128
|
});
|
108
|
-
expect(mockKvStore.set).toHaveBeenCalledWith("demo-auth-existing-users-" +
|
129
|
+
expect(mockKvStore.set).toHaveBeenCalledWith("demo-auth-existing-users-" + encodeUsername("testUser"), expect.any(String));
|
109
130
|
expect(mockKvStore.set).toHaveBeenCalledWith("demo-auth-existing-users", "testUser");
|
110
131
|
expect(mockKvStore.set).toHaveBeenCalledWith("demo-auth-logged-in-secret", expect.any(String));
|
111
132
|
});
|
@@ -115,7 +136,7 @@ describe("RNDemoAuth", () => {
|
|
115
136
|
accountID: "test-account-id",
|
116
137
|
accountSecret: "test-secret",
|
117
138
|
};
|
118
|
-
mockStorage["demo-auth-existing-users-" +
|
139
|
+
mockStorage["demo-auth-existing-users-" + encodeUsername("testUser")] =
|
119
140
|
JSON.stringify(credentials);
|
120
141
|
mockDriver.onReady = vi.fn(({ logInAs }) => {
|
121
142
|
return logInAs("testUser");
|
@@ -146,7 +167,7 @@ describe("RNDemoAuth", () => {
|
|
146
167
|
accountID: "test-account-id",
|
147
168
|
secret: "test-secret",
|
148
169
|
});
|
149
|
-
expect(mockKvStore.set).toHaveBeenCalledWith("demo-auth-existing-users-" +
|
170
|
+
expect(mockKvStore.set).toHaveBeenCalledWith("demo-auth-existing-users-" + encodeUsername("testUser-2"), expect.any(String));
|
150
171
|
expect(mockKvStore.set).toHaveBeenCalledWith("demo-auth-existing-users", "testUser,testUser-2");
|
151
172
|
});
|
152
173
|
it("should retrieve existing users", async () => {
|
@@ -177,7 +198,7 @@ describe("RNDemoAuth", () => {
|
|
177
198
|
mockStorage["demo-auth-existing-users"] = "testUser";
|
178
199
|
mockStorage["demo-auth-existing-users-testUser"] = value;
|
179
200
|
await RNDemoAuth.init(mockDriver);
|
180
|
-
expect(mockKvStore.set).toHaveBeenCalledWith("demo-auth-existing-users-" +
|
201
|
+
expect(mockKvStore.set).toHaveBeenCalledWith("demo-auth-existing-users-" + encodeUsername("testUser"), value);
|
181
202
|
expect(mockKvStore.set).toHaveBeenCalledWith("demo-auth-storage-version", "2");
|
182
203
|
expect(mockKvStore.delete).toHaveBeenCalledWith("demo-auth-existing-users-testUser");
|
183
204
|
});
|
@@ -1 +1 @@
|
|
1
|
-
{"version":3,"file":"DemoAuthMethod.test.js","sourceRoot":"","sources":["../../src/tests/DemoAuthMethod.test.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,UAAU,EAAE,QAAQ,EAAE,MAAM,EAAE,EAAE,EAAE,EAAE,EAAE,MAAM,QAAQ,CAAC;AAC9D,OAAO,EAAE,UAAU,EAAE,MAAM,wBAAwB,CAAC;
|
1
|
+
{"version":3,"file":"DemoAuthMethod.test.js","sourceRoot":"","sources":["../../src/tests/DemoAuthMethod.test.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,UAAU,EAAE,QAAQ,EAAE,MAAM,EAAE,EAAE,EAAE,EAAE,EAAE,MAAM,QAAQ,CAAC;AAC9D,OAAO,EAAE,UAAU,EAAE,cAAc,EAAE,MAAM,wBAAwB,CAAC;AACpE,OAAO,EAAW,cAAc,EAAE,MAAM,6BAA6B,CAAC;AAEtE,0BAA0B;AAC1B,MAAM,WAAW,GAA8B,EAAE,CAAC;AAElD,SAAS,WAAW,CAAC,GAAW;IAC9B,IAAI,GAAG,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,GAAG,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,GAAG,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAC;QAChE,MAAM,IAAI,KAAK,CAAC,aAAa,CAAC,CAAC;IACjC,CAAC;AACH,CAAC;AAED,8BAA8B;AAC9B,MAAM,WAAW,GAAY;IAC3B,GAAG,EAAE,EAAE,CAAC,EAAE,CAAC,KAAK,EAAE,GAAW,EAAE,EAAE;QAC/B,WAAW,CAAC,GAAG,CAAC,CAAC;QACjB,OAAO,WAAW,CAAC,GAAG,CAAC,IAAI,IAAI,CAAC;IAClC,CAAC,CAAC;IACF,GAAG,EAAE,EAAE,CAAC,EAAE,CAAC,KAAK,EAAE,GAAW,EAAE,KAAa,EAAE,EAAE;QAC9C,WAAW,CAAC,GAAG,CAAC,CAAC;QAEjB,WAAW,CAAC,GAAG,CAAC,GAAG,KAAK,CAAC;IAC3B,CAAC,CAAC;IACF,MAAM,EAAE,EAAE,CAAC,EAAE,CAAC,KAAK,EAAE,GAAW,EAAE,EAAE;QAClC,WAAW,CAAC,GAAG,CAAC,CAAC;QACjB,OAAO,WAAW,CAAC,GAAG,CAAC,CAAC;IAC1B,CAAC,CAAC;IACF,QAAQ,EAAE,EAAE,CAAC,EAAE,CAAC,KAAK,IAAI,EAAE;QACzB,MAAM,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC,OAAO,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,OAAO,WAAW,CAAC,GAAG,CAAC,CAAC,CAAC;IACrE,CAAC,CAAC;CACH,CAAC;AAEF,cAAc,CAAC,WAAW,EAAE,CAAC,UAAU,CAAC,WAAW,CAAC,CAAC;AAErD,UAAU,CAAC,GAAG,EAAE;IACd,WAAW,CAAC,QAAQ,EAAE,CAAC;IACvB,EAAE,CAAC,aAAa,EAAE,CAAC;AACrB,CAAC,CAAC,CAAC;AAEH,SAAS,KAAK;IACZ,MAAM,UAAU,GAAsB;QACpC,OAAO,EAAE,EAAE,CAAC,EAAE,EAAE;QAChB,UAAU,EAAE,EAAE,CAAC,EAAE,EAAE;QACnB,OAAO,EAAE,EAAE,CAAC,EAAE,EAAE;KACjB,CAAC;IAEF,OAAO;QACL,WAAW;QACX,WAAW;QACX,UAAU;KACX,CAAC;AACJ,CAAC;AAED,QAAQ,CAAC,YAAY,EAAE,GAAG,EAAE;IAC1B,QAAQ,CAAC,gBAAgB,EAAE,GAAG,EAAE;QAC9B,EAAE,CAAC,sCAAsC,EAAE,KAAK,IAAI,EAAE;YACpD,MAAM,EAAE,WAAW,EAAE,UAAU,EAAE,GAAG,KAAK,EAAE,CAAC;YAE5C,MAAM,YAAY,GAAG;gBACnB,QAAQ,EAAE;oBACR,SAAS,EAAE,iBAAgC;oBAC3C,aAAa,EAAE,aAA4B;iBAC5C;aACF,CAAC;YAEF,MAAM,UAAU,CAAC,IAAI,CAAC,UAAU,EAAE,YAAY,CAAC,CAAC;YAEhD,MAAM,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC,oBAAoB,CAC1C,0BAA0B,EAC1B,UAAU,CACX,CAAC;YACF,MAAM,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC,oBAAoB,CAC1C,2BAA2B,GAAG,cAAc,CAAC,UAAU,CAAC,EACxD,MAAM,CAAC,GAAG,CAAC,MAAM,CAAC,CACnB,CAAC;QACJ,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,QAAQ,CAAC,gBAAgB,EAAE,GAAG,EAAE;QAC9B,EAAE,CAAC,+BAA+B,EAAE,KAAK,IAAI,EAAE;YAC7C,MAAM,EAAE,UAAU,EAAE,GAAG,KAAK,EAAE,CAAC;YAE/B,UAAU,CAAC,OAAO,GAAG,EAAE,CAAC,EAAE,CAAC,CAAC,EAAE,MAAM,EAAE,EAAE,EAAE;gBACxC,MAAM,CAAC,UAAU,CAAC,CAAC;YACrB,CAAC,CAAC,CAAC;YAEH,MAAM,IAAI,GAAG,MAAM,UAAU,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;YAC/C,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,KAAK,EAAE,CAAC;YAElC,MAAM,CAAC,UAAU,CAAC,OAAO,CAAC,CAAC,gBAAgB,EAAE,CAAC;YAC9C,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;YAChC,MAAM,CAAC,MAAM,CAAC,eAAe,CAAC,CAAC,WAAW,EAAE,CAAC;QAC/C,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,6DAA6D,EAAE,KAAK,IAAI,EAAE;YAC3E,MAAM,EAAE,UAAU,EAAE,GAAG,KAAK,EAAE,CAAC;YAE/B,UAAU,CAAC,OAAO,GAAG,EAAE,CAAC,EAAE,CAAC,CAAC,EAAE,MAAM,EAAE,EAAE,EAAE;gBACxC,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC;YACvB,CAAC,CAAC,CAAC;YAEH,MAAM,IAAI,GAAG,MAAM,UAAU,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;YAC/C,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,KAAK,EAAE,CAAC;YAElC,MAAM,CAAC,UAAU,CAAC,OAAO,CAAC,CAAC,gBAAgB,EAAE,CAAC;YAC9C,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;YAChC,MAAM,CAAC,MAAM,CAAC,eAAe,CAAC,CAAC,WAAW,EAAE,CAAC;QAC/C,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,mCAAmC,EAAE,KAAK,IAAI,EAAE;YACjD,MAAM,EAAE,WAAW,EAAE,UAAU,EAAE,GAAG,KAAK,EAAE,CAAC;YAE5C,kCAAkC;YAClC,MAAM,YAAY,GAAG;gBACnB,SAAS,EAAE,iBAAgC;gBAC3C,aAAa,EAAE,aAA4B;aAC5C,CAAC;YAEF,WAAW,CAAC,4BAA4B,CAAC,GAAG,IAAI,CAAC,SAAS,CAAC,YAAY,CAAC,CAAC;YAEzE,MAAM,IAAI,GAAG,MAAM,UAAU,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;YAC/C,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,KAAK,EAAE,CAAC;YAElC,IAAI,MAAM,CAAC,IAAI,KAAK,UAAU,EAAE,CAAC;gBAC/B,MAAM,IAAI,KAAK,CAAC,+BAA+B,CAAC,CAAC;YACnD,CAAC;YAED,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;YACrC,MAAM,CAAC,MAAM,CAAC,WAAW,CAAC,CAAC,OAAO,CAAC;gBACjC,SAAS,EAAE,YAAY,CAAC,SAAS;gBACjC,MAAM,EAAE,YAAY,CAAC,aAAa;aACnC,CAAC,CAAC;QACL,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,sBAAsB,EAAE,KAAK,IAAI,EAAE;YACpC,MAAM,EAAE,WAAW,EAAE,UAAU,EAAE,GAAG,KAAK,EAAE,CAAC;YAE5C,UAAU,CAAC,OAAO,GAAG,EAAE,CAAC,EAAE,CAAC,CAAC,EAAE,MAAM,EAAE,EAAE,EAAE;gBACxC,MAAM,CAAC,UAAU,CAAC,CAAC;YACrB,CAAC,CAAC,CAAC;YAEH,MAAM,IAAI,GAAG,MAAM,UAAU,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;YAC/C,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,KAAK,EAAE,CAAC;YAElC,MAAM,MAAM,CAAC,MAAM,EAAE,CAAC;YACtB,MAAM,CAAC,WAAW,CAAC,MAAM,CAAC,CAAC,oBAAoB,CAC7C,4BAA4B,CAC7B,CAAC;QACJ,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,QAAQ,CAAC,iBAAiB,EAAE,GAAG,EAAE;QAC/B,EAAE,CAAC,0BAA0B,EAAE,KAAK,IAAI,EAAE;YACxC,MAAM,EAAE,WAAW,EAAE,UAAU,EAAE,GAAG,KAAK,EAAE,CAAC;YAE5C,UAAU,CAAC,OAAO,GAAG,EAAE,CAAC,EAAE,CAAC,CAAC,EAAE,MAAM,EAAE,EAAE,EAAE;gBACxC,OAAO,MAAM,CAAC,UAAU,CAAC,CAAC;YAC5B,CAAC,CAAC,CAAC;YACH,MAAM,IAAI,GAAG,MAAM,UAAU,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;YAC/C,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,KAAK,EAAE,CAAC;YAElC,IAAI,MAAM,CAAC,IAAI,KAAK,KAAK,EAAE,CAAC;gBAC1B,MAAM,IAAI,KAAK,CAAC,0BAA0B,CAAC,CAAC;YAC9C,CAAC;YAED,MAAM,MAAM,CAAC,eAAe,CAAC;gBAC3B,SAAS,EAAE,iBAAgC;gBAC3C,MAAM,EAAE,aAA4B;aACrC,CAAC,CAAC;YAEH,MAAM,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC,oBAAoB,CAC1C,2BAA2B,GAAG,cAAc,CAAC,UAAU,CAAC,EACxD,MAAM,CAAC,GAAG,CAAC,MAAM,CAAC,CACnB,CAAC;YAEF,MAAM,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC,oBAAoB,CAC1C,0BAA0B,EAC1B,UAAU,CACX,CAAC;YAEF,MAAM,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC,oBAAoB,CAC1C,4BAA4B,EAC5B,MAAM,CAAC,GAAG,CAAC,MAAM,CAAC,CACnB,CAAC;QACJ,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,+BAA+B,EAAE,KAAK,IAAI,EAAE;YAC7C,MAAM,EAAE,WAAW,EAAE,WAAW,EAAE,UAAU,EAAE,GAAG,KAAK,EAAE,CAAC;YAEzD,MAAM,WAAW,GAAG;gBAClB,SAAS,EAAE,iBAAgC;gBAC3C,aAAa,EAAE,aAA4B;aAC5C,CAAC;YAEF,WAAW,CAAC,2BAA2B,GAAG,cAAc,CAAC,UAAU,CAAC,CAAC;gBACnE,IAAI,CAAC,SAAS,CAAC,WAAW,CAAC,CAAC;YAE9B,UAAU,CAAC,OAAO,GAAG,EAAE,CAAC,EAAE,CAAC,CAAC,EAAE,OAAO,EAAE,EAAE,EAAE;gBACzC,OAAO,OAAO,CAAC,UAAU,CAAC,CAAC;YAC7B,CAAC,CAAC,CAAC;YAEH,MAAM,IAAI,GAAG,MAAM,UAAU,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;YAC/C,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,KAAK,EAAE,CAAC;YAElC,IAAI,MAAM,CAAC,IAAI,KAAK,UAAU,EAAE,CAAC;gBAC/B,MAAM,IAAI,KAAK,CAAC,+BAA+B,CAAC,CAAC;YACnD,CAAC;YAED,MAAM,CAAC,MAAM,CAAC,WAAW,CAAC,CAAC,OAAO,CAAC;gBACjC,SAAS,EAAE,WAAW,CAAC,SAAS;gBAChC,MAAM,EAAE,WAAW,CAAC,aAAa;aAClC,CAAC,CAAC;YAEH,MAAM,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC,oBAAoB,CAC1C,4BAA4B,EAC5B,IAAI,CAAC,SAAS,CAAC,WAAW,CAAC,CAC5B,CAAC;QACJ,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,oDAAoD,EAAE,KAAK,IAAI,EAAE;YAClE,MAAM,EAAE,WAAW,EAAE,WAAW,EAAE,UAAU,EAAE,GAAG,KAAK,EAAE,CAAC;YAEzD,UAAU,CAAC,OAAO,GAAG,EAAE,CAAC,EAAE,CAAC,CAAC,EAAE,MAAM,EAAE,EAAE,EAAE;gBACxC,OAAO,MAAM,CAAC,UAAU,CAAC,CAAC;YAC5B,CAAC,CAAC,CAAC;YACH,WAAW,CAAC,0BAA0B,CAAC,GAAG,UAAU,CAAC;YAErD,MAAM,IAAI,GAAG,MAAM,UAAU,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;YAC/C,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,KAAK,EAAE,CAAC;YAElC,IAAI,MAAM,CAAC,IAAI,KAAK,KAAK,EAAE,CAAC;gBAC1B,MAAM,IAAI,KAAK,CAAC,0BAA0B,CAAC,CAAC;YAC9C,CAAC;YAED,MAAM,MAAM,CAAC,eAAe,CAAC;gBAC3B,SAAS,EAAE,iBAAgC;gBAC3C,MAAM,EAAE,aAA4B;aACrC,CAAC,CAAC;YAEH,MAAM,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC,oBAAoB,CAC1C,2BAA2B,GAAG,cAAc,CAAC,YAAY,CAAC,EAC1D,MAAM,CAAC,GAAG,CAAC,MAAM,CAAC,CACnB,CAAC;YAEF,MAAM,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC,oBAAoB,CAC1C,0BAA0B,EAC1B,qBAAqB,CACtB,CAAC;QACJ,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,gCAAgC,EAAE,KAAK,IAAI,EAAE;YAC9C,MAAM,EAAE,WAAW,EAAE,UAAU,EAAE,GAAG,KAAK,EAAE,CAAC;YAE5C,UAAU,CAAC,OAAO,GAAG,EAAE,CAAC,EAAE,CAAC,CAAC,EAAE,MAAM,EAAE,EAAE,EAAE;gBACxC,OAAO,MAAM,CAAC,UAAU,CAAC,CAAC;YAC5B,CAAC,CAAC,CAAC;YAEH,WAAW,CAAC,0BAA0B,CAAC,GAAG,mBAAmB,CAAC;YAE9D,MAAM,IAAI,GAAG,MAAM,UAAU,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;YAC/C,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,KAAK,EAAE,CAAC;YAElC,IAAI,MAAM,CAAC,IAAI,KAAK,KAAK,EAAE,CAAC;gBAC1B,MAAM,IAAI,KAAK,CAAC,0BAA0B,CAAC,CAAC;YAC9C,CAAC;YAED,MAAM,MAAM,CAAC,eAAe,CAAC;gBAC3B,SAAS,EAAE,iBAAgC;gBAC3C,MAAM,EAAE,aAA4B;aACrC,CAAC,CAAC;YAEH,MAAM,WAAW,GAAG,EAAE,CAAC,MAAM,CAAC,UAAU,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAE,CAAC,CAAC,CAAC,CAAC;YACpE,MAAM,aAAa,GAAG,MAAM,WAAW,CAAC,gBAAgB,EAAE,CAAC;YAE3D,MAAM,CAAC,aAAa,CAAC,CAAC,OAAO,CAAC,CAAC,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,UAAU,CAAC,CAAC,CAAC;QACzE,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,mDAAmD,EAAE,KAAK,IAAI,EAAE;YACjE,MAAM,EAAE,WAAW,EAAE,WAAW,EAAE,UAAU,EAAE,GAAG,KAAK,EAAE,CAAC;YAEzD,MAAM,KAAK,GAAG,IAAI,CAAC,SAAS,CAAC;gBAC3B,SAAS,EAAE,iBAAgC;gBAC3C,aAAa,EAAE,aAA4B;aAC5C,CAAC,CAAC;YAEH,WAAW,CAAC,0BAA0B,CAAC,GAAG,UAAU,CAAC;YACrD,WAAW,CAAC,mCAAmC,CAAC,GAAG,KAAK,CAAC;YAEzD,MAAM,UAAU,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;YAElC,MAAM,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC,oBAAoB,CAC1C,2BAA2B,GAAG,cAAc,CAAC,UAAU,CAAC,EACxD,KAAK,CACN,CAAC;YAEF,MAAM,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC,oBAAoB,CAC1C,2BAA2B,EAC3B,GAAG,CACJ,CAAC;YAEF,MAAM,CAAC,WAAW,CAAC,MAAM,CAAC,CAAC,oBAAoB,CAC7C,mCAAmC,CACpC,CAAC;QACJ,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
|
package/package.json
CHANGED
@@ -1,6 +1,6 @@
|
|
1
1
|
{
|
2
2
|
"name": "jazz-react-native",
|
3
|
-
"version": "0.
|
3
|
+
"version": "0.9.0",
|
4
4
|
"type": "module",
|
5
5
|
"main": "./dist/index.js",
|
6
6
|
"module": "./dist/index.js",
|
@@ -16,16 +16,21 @@
|
|
16
16
|
"react-native": "./dist/crypto/index.js",
|
17
17
|
"types": "./dist/crypto/index.d.ts",
|
18
18
|
"default": "./dist/crypto/index.js"
|
19
|
+
},
|
20
|
+
"./testing": {
|
21
|
+
"react-native": "./dist/testing.js",
|
22
|
+
"types": "./dist/testing.d.ts",
|
23
|
+
"default": "./dist/testing.js"
|
19
24
|
}
|
20
25
|
},
|
21
26
|
"license": "MIT",
|
22
27
|
"dependencies": {
|
23
28
|
"@scure/base": "1.2.1",
|
24
|
-
"@scure/bip39": "^1.3.0",
|
25
29
|
"react-native-quick-crypto": "1.0.0-beta.9",
|
26
|
-
"
|
27
|
-
"cojson
|
28
|
-
"
|
30
|
+
"jazz-react-core": "0.8.46",
|
31
|
+
"cojson": "0.9.0",
|
32
|
+
"cojson-transport-ws": "0.9.0",
|
33
|
+
"jazz-tools": "0.9.0"
|
29
34
|
},
|
30
35
|
"peerDependencies": {
|
31
36
|
"@react-native-community/netinfo": "*",
|
@@ -23,8 +23,15 @@ export namespace RNDemoAuth {
|
|
23
23
|
|
24
24
|
const localStorageKey = "demo-auth-logged-in-secret";
|
25
25
|
|
26
|
+
export function encodeUsername(username: string) {
|
27
|
+
return btoa(username)
|
28
|
+
.replace(/=/g, "-")
|
29
|
+
.replace(/\+/g, "_")
|
30
|
+
.replace(/\//g, ".");
|
31
|
+
}
|
32
|
+
|
26
33
|
function getUserStorageKey(username: string) {
|
27
|
-
return `demo-auth-existing-users-${
|
34
|
+
return `demo-auth-existing-users-${encodeUsername(username)}`;
|
28
35
|
}
|
29
36
|
|
30
37
|
function getLegacyUserStorageKey(username: string) {
|
@@ -102,7 +109,21 @@ export class RNDemoAuth implements AuthMethod {
|
|
102
109
|
},
|
103
110
|
store?: KvStore | undefined,
|
104
111
|
) {
|
105
|
-
|
112
|
+
let kvStore = store;
|
113
|
+
|
114
|
+
if (!kvStore) {
|
115
|
+
const kvStoreContext = KvStoreContext.getInstance();
|
116
|
+
|
117
|
+
if (!kvStoreContext.isInitialized()) {
|
118
|
+
const { ExpoSecureStoreAdapter } = await import(
|
119
|
+
"../storage/expo-secure-store-adapter.js"
|
120
|
+
);
|
121
|
+
|
122
|
+
kvStoreContext.initialize(new ExpoSecureStoreAdapter());
|
123
|
+
}
|
124
|
+
|
125
|
+
kvStore = kvStoreContext.getStorage();
|
126
|
+
}
|
106
127
|
|
107
128
|
await migrateExistingUsersKeys(kvStore);
|
108
129
|
|
@@ -133,6 +154,7 @@ export class RNDemoAuth implements AuthMethod {
|
|
133
154
|
this.driver.onSignedIn({ logOut });
|
134
155
|
},
|
135
156
|
onError: (error: string | Error) => {
|
157
|
+
this.kvStore.delete(localStorageKey);
|
136
158
|
this.driver.onError(error);
|
137
159
|
},
|
138
160
|
logOut: async () => {
|
@@ -181,8 +203,6 @@ export class RNDemoAuth implements AuthMethod {
|
|
181
203
|
this.driver.onSignedIn({ logOut });
|
182
204
|
},
|
183
205
|
onError: (error: string | Error) => {
|
184
|
-
// @ts-expect-error asd
|
185
|
-
console.error("onError", error.cause);
|
186
206
|
this.driver.onError(error);
|
187
207
|
},
|
188
208
|
logOut: async () => {
|
package/src/auth/DemoAuthUI.tsx
CHANGED
@@ -54,13 +54,13 @@ export function useDemoAuth({
|
|
54
54
|
{
|
55
55
|
onReady: async ({ signUp, getExistingUsers, logInAs }) => {
|
56
56
|
const existingUsers = await getExistingUsers();
|
57
|
-
setState({
|
57
|
+
setState((current) => ({
|
58
58
|
state: "ready",
|
59
59
|
signUp,
|
60
60
|
existingUsers,
|
61
61
|
logInAs,
|
62
|
-
errors:
|
63
|
-
});
|
62
|
+
errors: current.errors,
|
63
|
+
}));
|
64
64
|
},
|
65
65
|
onSignedIn: ({ logOut }) => {
|
66
66
|
setState({ state: "signedIn", logOut, errors: [] });
|
@@ -68,14 +68,14 @@ export function useDemoAuth({
|
|
68
68
|
onError: (error) => {
|
69
69
|
setState((current) => ({
|
70
70
|
...current,
|
71
|
-
errors: [
|
71
|
+
errors: [error.toString()],
|
72
72
|
}));
|
73
73
|
},
|
74
74
|
},
|
75
75
|
seedAccounts,
|
76
76
|
store,
|
77
77
|
);
|
78
|
-
}, [seedAccounts]);
|
78
|
+
}, [seedAccounts, state.errors]); // We reset the auth method when getting an error
|
79
79
|
|
80
80
|
useEffect(() => {
|
81
81
|
async function init() {
|
@@ -126,7 +126,14 @@ export const DemoAuthBasicUI = ({
|
|
126
126
|
]}
|
127
127
|
>
|
128
128
|
{state.state === "loading" ? (
|
129
|
-
|
129
|
+
<>
|
130
|
+
<Text style={styles.loadingText}>Loading...</Text>
|
131
|
+
{state.errors.map((error, index) => (
|
132
|
+
<Text key={index} style={styles.errorText}>
|
133
|
+
{error}
|
134
|
+
</Text>
|
135
|
+
))}
|
136
|
+
</>
|
130
137
|
) : state.state === "ready" ? (
|
131
138
|
<View style={styles.formContainer}>
|
132
139
|
<Text
|
package/src/hooks.tsx
ADDED
@@ -0,0 +1,60 @@
|
|
1
|
+
import { useEffect } from "react";
|
2
|
+
|
3
|
+
import { createUseAccountHooks, useJazzContext } from "jazz-react-core";
|
4
|
+
import { CoValue, CoValueClass, ID } from "jazz-tools";
|
5
|
+
import { Linking } from "react-native";
|
6
|
+
import { parseInviteLink } from "./platform.js";
|
7
|
+
import { RegisteredAccount } from "./provider.js";
|
8
|
+
|
9
|
+
export { useCoState, experimental_useInboxSender } from "jazz-react-core";
|
10
|
+
|
11
|
+
export const { useAccount, useAccountOrGuest } =
|
12
|
+
createUseAccountHooks<RegisteredAccount>();
|
13
|
+
|
14
|
+
export function useAcceptInvite<V extends CoValue>({
|
15
|
+
invitedObjectSchema,
|
16
|
+
onAccept,
|
17
|
+
forValueHint,
|
18
|
+
}: {
|
19
|
+
invitedObjectSchema: CoValueClass<V>;
|
20
|
+
onAccept: (projectID: ID<V>) => void;
|
21
|
+
forValueHint?: string;
|
22
|
+
}): void {
|
23
|
+
const context = useJazzContext();
|
24
|
+
|
25
|
+
if (!("me" in context)) {
|
26
|
+
throw new Error(
|
27
|
+
"useAcceptInvite can't be used in a JazzProvider with auth === 'guest'.",
|
28
|
+
);
|
29
|
+
}
|
30
|
+
|
31
|
+
useEffect(() => {
|
32
|
+
const handleDeepLink = ({ url }: { url: string }) => {
|
33
|
+
const result = parseInviteLink<V>(url);
|
34
|
+
if (result && result.valueHint === forValueHint) {
|
35
|
+
context.me
|
36
|
+
.acceptInvite(
|
37
|
+
result.valueID,
|
38
|
+
result.inviteSecret,
|
39
|
+
invitedObjectSchema,
|
40
|
+
)
|
41
|
+
.then(() => {
|
42
|
+
onAccept(result.valueID);
|
43
|
+
})
|
44
|
+
.catch((e) => {
|
45
|
+
console.error("Failed to accept invite", e);
|
46
|
+
});
|
47
|
+
}
|
48
|
+
};
|
49
|
+
|
50
|
+
const linkingListener = Linking.addEventListener("url", handleDeepLink);
|
51
|
+
|
52
|
+
void Linking.getInitialURL().then((url) => {
|
53
|
+
if (url) handleDeepLink({ url });
|
54
|
+
});
|
55
|
+
|
56
|
+
return () => {
|
57
|
+
linkingListener.remove();
|
58
|
+
};
|
59
|
+
}, [context, onAccept, invitedObjectSchema, forValueHint]);
|
60
|
+
}
|
package/src/index.ts
CHANGED
@@ -1,243 +1,6 @@
|
|
1
|
-
/* eslint-disable @typescript-eslint/no-explicit-any */
|
2
|
-
/* eslint-disable @typescript-eslint/no-unused-vars */
|
3
|
-
import {
|
4
|
-
Account,
|
5
|
-
AgentID,
|
6
|
-
AnonymousJazzAgent,
|
7
|
-
AuthMethod,
|
8
|
-
CoValue,
|
9
|
-
CoValueClass,
|
10
|
-
CryptoProvider,
|
11
|
-
ID,
|
12
|
-
InviteSecret,
|
13
|
-
SessionID,
|
14
|
-
cojsonInternals,
|
15
|
-
createJazzContext,
|
16
|
-
} from "jazz-tools";
|
17
|
-
|
18
|
-
import { RawAccountID } from "cojson";
|
19
|
-
|
20
|
-
export { RNDemoAuth } from "./auth/DemoAuthMethod.js";
|
21
|
-
|
22
|
-
import { PureJSCrypto } from "cojson/native";
|
23
|
-
import { createWebSocketPeerWithReconnection } from "./createWebSocketPeerWithReconnection.js";
|
24
|
-
import type { RNQuickCrypto } from "./crypto/RNQuickCrypto.js";
|
25
|
-
import { KvStoreContext } from "./storage/kv-store-context.js";
|
26
|
-
|
27
|
-
/** @category Context Creation */
|
28
|
-
export type ReactNativeContext<Acc extends Account> = {
|
29
|
-
me: Acc;
|
30
|
-
logOut: () => void;
|
31
|
-
// TODO: Symbol.dispose?
|
32
|
-
done: () => void;
|
33
|
-
};
|
34
|
-
|
35
|
-
export type ReactNativeGuestContext = {
|
36
|
-
guest: AnonymousJazzAgent;
|
37
|
-
logOut: () => void;
|
38
|
-
done: () => void;
|
39
|
-
};
|
40
|
-
|
41
|
-
export type ReactNativeContextOptions<Acc extends Account> = {
|
42
|
-
auth: AuthMethod;
|
43
|
-
AccountSchema: CoValueClass<Acc> & {
|
44
|
-
fromNode: (typeof Account)["fromNode"];
|
45
|
-
};
|
46
|
-
} & BaseReactNativeContextOptions;
|
47
|
-
|
48
|
-
export type BaseReactNativeContextOptions = {
|
49
|
-
peer: `wss://${string}` | `ws://${string}`;
|
50
|
-
reconnectionTimeout?: number;
|
51
|
-
storage?: "indexedDB" | "singleTabOPFS";
|
52
|
-
CryptoProvider?: typeof PureJSCrypto | typeof RNQuickCrypto;
|
53
|
-
};
|
54
|
-
|
55
|
-
/** @category Context Creation */
|
56
|
-
export async function createJazzRNContext<Acc extends Account>(
|
57
|
-
options: ReactNativeContextOptions<Acc>,
|
58
|
-
): Promise<ReactNativeContext<Acc>>;
|
59
|
-
export async function createJazzRNContext(
|
60
|
-
options: BaseReactNativeContextOptions,
|
61
|
-
): Promise<ReactNativeGuestContext>;
|
62
|
-
export async function createJazzRNContext<Acc extends Account>(
|
63
|
-
options: ReactNativeContextOptions<Acc> | BaseReactNativeContextOptions,
|
64
|
-
): Promise<ReactNativeContext<Acc> | ReactNativeGuestContext>;
|
65
|
-
export async function createJazzRNContext<Acc extends Account>(
|
66
|
-
options: ReactNativeContextOptions<Acc> | BaseReactNativeContextOptions,
|
67
|
-
): Promise<ReactNativeContext<Acc> | ReactNativeGuestContext> {
|
68
|
-
const websocketPeer = createWebSocketPeerWithReconnection(
|
69
|
-
options.peer,
|
70
|
-
options.reconnectionTimeout,
|
71
|
-
(peer) => {
|
72
|
-
node.syncManager.addPeer(peer);
|
73
|
-
},
|
74
|
-
);
|
75
|
-
|
76
|
-
const CryptoProvider = options.CryptoProvider || PureJSCrypto;
|
77
|
-
|
78
|
-
const context =
|
79
|
-
"auth" in options
|
80
|
-
? await createJazzContext({
|
81
|
-
AccountSchema: options.AccountSchema,
|
82
|
-
auth: options.auth,
|
83
|
-
crypto: await CryptoProvider.create(),
|
84
|
-
peersToLoadFrom: [websocketPeer.peer],
|
85
|
-
sessionProvider: provideLockSession,
|
86
|
-
})
|
87
|
-
: await createJazzContext({
|
88
|
-
crypto: await CryptoProvider.create(),
|
89
|
-
peersToLoadFrom: [websocketPeer.peer],
|
90
|
-
});
|
91
|
-
|
92
|
-
const node =
|
93
|
-
"account" in context ? context.account._raw.core.node : context.agent.node;
|
94
|
-
|
95
|
-
return "account" in context
|
96
|
-
? {
|
97
|
-
me: context.account,
|
98
|
-
done: () => {
|
99
|
-
websocketPeer.done();
|
100
|
-
context.done();
|
101
|
-
},
|
102
|
-
logOut: () => {
|
103
|
-
context.logOut();
|
104
|
-
},
|
105
|
-
}
|
106
|
-
: {
|
107
|
-
guest: context.agent,
|
108
|
-
done: () => {
|
109
|
-
websocketPeer.done();
|
110
|
-
context.done();
|
111
|
-
},
|
112
|
-
logOut: () => {
|
113
|
-
context.logOut();
|
114
|
-
},
|
115
|
-
};
|
116
|
-
}
|
117
|
-
|
118
|
-
/** @category Auth Providers */
|
119
|
-
export type SessionProvider = (
|
120
|
-
accountID: ID<Account> | AgentID,
|
121
|
-
) => Promise<SessionID>;
|
122
|
-
|
123
|
-
export async function provideLockSession(
|
124
|
-
accountID: ID<Account> | AgentID,
|
125
|
-
crypto: CryptoProvider,
|
126
|
-
) {
|
127
|
-
const sessionDone = () => {};
|
128
|
-
|
129
|
-
const kvStore = KvStoreContext.getInstance().getStorage();
|
130
|
-
|
131
|
-
const sessionID =
|
132
|
-
((await kvStore.get(accountID)) as SessionID) ||
|
133
|
-
crypto.newRandomSessionID(accountID as RawAccountID | AgentID);
|
134
|
-
await kvStore.set(accountID, sessionID);
|
135
|
-
|
136
|
-
return Promise.resolve({
|
137
|
-
sessionID,
|
138
|
-
sessionDone,
|
139
|
-
});
|
140
|
-
}
|
141
|
-
|
142
|
-
/** @category Invite Links */
|
143
|
-
export function createInviteLink<C extends CoValue>(
|
144
|
-
value: C,
|
145
|
-
role: "reader" | "writer" | "admin",
|
146
|
-
{ baseURL, valueHint }: { baseURL?: string; valueHint?: string } = {},
|
147
|
-
): string {
|
148
|
-
const coValueCore = value._raw.core;
|
149
|
-
let currentCoValue = coValueCore;
|
150
|
-
|
151
|
-
while (currentCoValue.header.ruleset.type === "ownedByGroup") {
|
152
|
-
currentCoValue = currentCoValue.getGroup().core;
|
153
|
-
}
|
154
|
-
|
155
|
-
if (currentCoValue.header.ruleset.type !== "group") {
|
156
|
-
throw new Error("Can't create invite link for object without group");
|
157
|
-
}
|
158
|
-
|
159
|
-
const group = cojsonInternals.expectGroup(currentCoValue.getCurrentContent());
|
160
|
-
const inviteSecret = group.createInvite(role);
|
161
|
-
|
162
|
-
return `${baseURL}/invite/${valueHint ? valueHint + "/" : ""}${
|
163
|
-
value.id
|
164
|
-
}/${inviteSecret}`;
|
165
|
-
}
|
166
|
-
|
167
|
-
/** @category Invite Links */
|
168
|
-
// TODO: copied from jazz-browser, should be shared
|
169
|
-
export function parseInviteLink<C extends CoValue>(
|
170
|
-
inviteURL: string,
|
171
|
-
):
|
172
|
-
| {
|
173
|
-
valueID: ID<C>;
|
174
|
-
valueHint?: string;
|
175
|
-
inviteSecret: InviteSecret;
|
176
|
-
}
|
177
|
-
| undefined {
|
178
|
-
const url = new URL(inviteURL);
|
179
|
-
const parts = url.hash.split("/");
|
180
|
-
|
181
|
-
let valueHint: string | undefined;
|
182
|
-
let valueID: ID<C> | undefined;
|
183
|
-
let inviteSecret: InviteSecret | undefined;
|
184
|
-
|
185
|
-
if (parts[0] === "#" && parts[1] === "invite") {
|
186
|
-
if (parts.length === 5) {
|
187
|
-
valueHint = parts[2];
|
188
|
-
valueID = parts[3] as ID<C>;
|
189
|
-
inviteSecret = parts[4] as InviteSecret;
|
190
|
-
} else if (parts.length === 4) {
|
191
|
-
valueID = parts[2] as ID<C>;
|
192
|
-
inviteSecret = parts[3] as InviteSecret;
|
193
|
-
}
|
194
|
-
|
195
|
-
if (!valueID || !inviteSecret) {
|
196
|
-
return undefined;
|
197
|
-
}
|
198
|
-
return { valueID, inviteSecret, valueHint };
|
199
|
-
}
|
200
|
-
}
|
201
|
-
|
202
|
-
// getting out of the `expo` business 🤞
|
203
|
-
// export function parseInviteLink<C extends CoValue>(
|
204
|
-
// inviteURL: string,
|
205
|
-
// ):
|
206
|
-
// | {
|
207
|
-
// valueID: ID<C>;
|
208
|
-
// valueHint?: string;
|
209
|
-
// inviteSecret: InviteSecret;
|
210
|
-
// }
|
211
|
-
// | undefined {
|
212
|
-
// const url = Linking.parse(inviteURL);
|
213
|
-
// const parts = url.path?.split("/");
|
214
|
-
|
215
|
-
// if (!parts || parts[0] !== "invite") {
|
216
|
-
// return undefined;
|
217
|
-
// }
|
218
|
-
|
219
|
-
// let valueHint: string | undefined;
|
220
|
-
// let valueID: ID<C> | undefined;
|
221
|
-
// let inviteSecret: InviteSecret | undefined;
|
222
|
-
|
223
|
-
// if (parts.length === 4) {
|
224
|
-
// valueHint = parts[1];
|
225
|
-
// valueID = parts[2] as ID<C>;
|
226
|
-
// inviteSecret = parts[3] as InviteSecret;
|
227
|
-
// } else if (parts.length === 3) {
|
228
|
-
// valueID = parts[1] as ID<C>;
|
229
|
-
// inviteSecret = parts[2] as InviteSecret;
|
230
|
-
// }
|
231
|
-
|
232
|
-
// if (!valueID || !inviteSecret) {
|
233
|
-
// return undefined;
|
234
|
-
// }
|
235
|
-
|
236
|
-
// return { valueID, inviteSecret, valueHint };
|
237
|
-
// }
|
238
|
-
|
239
|
-
/////////
|
240
|
-
|
241
1
|
export * from "./provider.js";
|
242
2
|
export * from "./auth/auth.js";
|
243
3
|
export * from "./storage/kv-store-context.js";
|
4
|
+
export * from "./hooks.js";
|
5
|
+
|
6
|
+
export { parseInviteLink, createInviteLink, setupKvStore } from "./platform.js";
|