@q9labsai/chalk-react-native 4.1.5 → 4.1.8

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.
Files changed (35) hide show
  1. package/dist/android.js +12 -2
  2. package/dist/chunk-4L5GXJ36.js +58 -0
  3. package/dist/{chunk-HXYIJ75K.js → chunk-LZ67SXGB.js} +148 -1
  4. package/dist/{chunk-5HETUU73.js → chunk-MMBE2BVK.js} +11 -2
  5. package/dist/client.js +1 -1
  6. package/dist/diagnostics.d.ts +4 -4
  7. package/dist/diagnostics.d.ts.map +1 -1
  8. package/dist/diagnostics.js +7 -7
  9. package/dist/index.d.ts +3 -0
  10. package/dist/index.d.ts.map +1 -1
  11. package/dist/index.js +12 -2
  12. package/dist/invites.d.ts +6 -1
  13. package/dist/invites.d.ts.map +1 -1
  14. package/dist/invites.js +8 -39
  15. package/dist/ios-pad.js +12 -2
  16. package/dist/ios-phone.js +12 -2
  17. package/dist/ios.js +12 -2
  18. package/dist/macos.js +12 -2
  19. package/dist/space-client/cloudflare-rtk-native.d.ts +3 -0
  20. package/dist/space-client/cloudflare-rtk-native.d.ts.map +1 -0
  21. package/dist/space-client/create-native-space-client.d.ts.map +1 -1
  22. package/dist/utils/build-chalk-invite-link.d.ts +1 -1
  23. package/dist/utils/build-chalk-invite-link.d.ts.map +1 -1
  24. package/package.json +7 -6
  25. package/src/diagnostics.test.ts +3 -3
  26. package/src/diagnostics.ts +8 -8
  27. package/src/index.ts +3 -0
  28. package/src/invites.test.ts +24 -29
  29. package/src/invites.ts +34 -10
  30. package/src/space-client/cloudflare-rtk-native.test.ts +118 -0
  31. package/src/space-client/cloudflare-rtk-native.ts +104 -0
  32. package/src/space-client/create-native-space-client.test.ts +54 -1
  33. package/src/space-client/create-native-space-client.ts +55 -2
  34. package/src/utils/build-chalk-invite-link.test.ts +3 -3
  35. package/src/utils/build-chalk-invite-link.ts +4 -2
package/dist/android.js CHANGED
@@ -2,6 +2,7 @@ import {
2
2
  Chalk,
3
3
  ChalkProvider,
4
4
  Entrance,
5
+ buildChalkInviteLink,
5
6
  useCan,
6
7
  useChat,
7
8
  useConnection,
@@ -11,7 +12,7 @@ import {
11
12
  useSelf,
12
13
  useSpaceClient,
13
14
  useWhiteboard
14
- } from "./chunk-5HETUU73.js";
15
+ } from "./chunk-MMBE2BVK.js";
15
16
  import {
16
17
  THEME_PALETTES,
17
18
  THEME_TEXTURES,
@@ -23,7 +24,12 @@ import {
23
24
  Theme,
24
25
  createNativeTheme
25
26
  } from "./chunk-JB4LNWVP.js";
26
- import "./chunk-HXYIJ75K.js";
27
+ import "./chunk-LZ67SXGB.js";
28
+ import {
29
+ extractSpaceInviteFromLink,
30
+ getClipboardInviteSuggestion,
31
+ parseSpaceInviteLink
32
+ } from "./chunk-4L5GXJ36.js";
27
33
  export {
28
34
  Chalk,
29
35
  ChalkProvider,
@@ -31,9 +37,13 @@ export {
31
37
  THEME_PALETTES,
32
38
  THEME_TEXTURES,
33
39
  Theme,
40
+ buildChalkInviteLink,
34
41
  createNativeTheme,
42
+ extractSpaceInviteFromLink,
43
+ getClipboardInviteSuggestion,
35
44
  getThemeMode,
36
45
  isDarkThemePalette,
46
+ parseSpaceInviteLink,
37
47
  resolveNativeAppearance,
38
48
  useCan,
39
49
  useChat,
@@ -0,0 +1,58 @@
1
+ // src/invites.ts
2
+ var CHALK_INVITE_HOSTS = ["chalkmeet.com", "chalk.q9labs.ai"];
3
+ var CHALK_CUSTOM_PROTOCOLS = /* @__PURE__ */ new Set(["chalk:", "ai.q9labs.chalk.mobile:"]);
4
+ var SPACE_SLUG_PATTERN = /^[A-Za-z0-9][A-Za-z0-9_-]{0,127}$/u;
5
+ var SPACE_INVITE_TOKEN_PATTERN = /^cspi1\.[A-Za-z0-9_-]+\.[A-Za-z0-9_-]+\.[A-Za-z0-9_-]+$/u;
6
+ function parseSpaceInviteLink(input) {
7
+ const trimmed = input.trim();
8
+ if (!trimmed) {
9
+ return null;
10
+ }
11
+ const normalized = trimmed.includes("://") ? trimmed : CHALK_INVITE_HOSTS.some((host) => trimmed.startsWith(`${host}/`)) ? `https://${trimmed}` : null;
12
+ if (!normalized) {
13
+ return null;
14
+ }
15
+ try {
16
+ const parsed = new URL(normalized);
17
+ if (!CHALK_CUSTOM_PROTOCOLS.has(parsed.protocol) && !isAllowedWebInviteOrigin(parsed)) {
18
+ return null;
19
+ }
20
+ const pathSegments = parsed.pathname.split("/").filter(Boolean);
21
+ if (CHALK_CUSTOM_PROTOCOLS.has(parsed.protocol)) pathSegments.unshift(parsed.hostname);
22
+ if (pathSegments.length !== 2 || pathSegments[0] !== "space") return null;
23
+ const slug = pathSegments[1];
24
+ const token = new URLSearchParams(parsed.hash.replace(/^#/u, "")).get("spaceInviteToken")?.trim();
25
+ return slug && token && token.length <= 512 && SPACE_SLUG_PATTERN.test(slug) && SPACE_INVITE_TOKEN_PATTERN.test(token) ? { slug, spaceInviteToken: token } : null;
26
+ } catch {
27
+ return null;
28
+ }
29
+ }
30
+ function isChalkInviteHost(hostname) {
31
+ return CHALK_INVITE_HOSTS.some((host) => host === hostname);
32
+ }
33
+ function isAllowedWebInviteOrigin(url) {
34
+ if (url.protocol === "https:") return isChalkInviteHost(url.hostname);
35
+ return url.protocol === "http:" && isLoopbackHost(url.hostname);
36
+ }
37
+ function isLoopbackHost(hostname) {
38
+ return hostname === "localhost" || hostname === "127.0.0.1" || hostname === "[::1]";
39
+ }
40
+ function extractSpaceInviteFromLink(input) {
41
+ return parseSpaceInviteLink(input);
42
+ }
43
+ function getClipboardInviteSuggestion(clipboardText, currentInput = "") {
44
+ const normalizedClipboardText = clipboardText?.trim();
45
+ if (!normalizedClipboardText) {
46
+ return null;
47
+ }
48
+ if (normalizedClipboardText === currentInput.trim()) {
49
+ return null;
50
+ }
51
+ return parseSpaceInviteLink(normalizedClipboardText) ? normalizedClipboardText : null;
52
+ }
53
+
54
+ export {
55
+ parseSpaceInviteLink,
56
+ extractSpaceInviteFromLink,
57
+ getClipboardInviteSuggestion
58
+ };
@@ -1,6 +1,7 @@
1
1
  // src/space-client/create-native-space-client.ts
2
2
  import {
3
3
  AsyncStorageV1PendingTargetStore,
4
+ CloudflareRTKClient,
4
5
  CloudflareSFUClient,
5
6
  createChalkChatFileHttpTransport,
6
7
  createChalkWhiteboardV1Client,
@@ -167,6 +168,104 @@ function isObject(value) {
167
168
  return typeof value === "object" && value !== null;
168
169
  }
169
170
 
171
+ // src/space-client/cloudflare-rtk-native.ts
172
+ var createNativeRealtimeKitClient = async ({ authToken, onError }) => {
173
+ const { default: NativeRealtimeKitClient } = await import("@cloudflare/realtimekit-react-native");
174
+ const client = await NativeRealtimeKitClient.init({
175
+ authToken,
176
+ defaults: { audio: false, video: false },
177
+ onError
178
+ });
179
+ return adaptNativeRealtimeKitClient(client);
180
+ };
181
+ function adaptNativeRealtimeKitClient(client) {
182
+ const self = client.self;
183
+ return {
184
+ join: () => client.joinRoom(),
185
+ leave: () => client.leaveRoom(),
186
+ self: {
187
+ get peerId() {
188
+ return self.peerId;
189
+ },
190
+ get audioEnabled() {
191
+ return self.audioEnabled;
192
+ },
193
+ get videoEnabled() {
194
+ return self.videoEnabled;
195
+ },
196
+ get screenShareEnabled() {
197
+ return self.screenShareEnabled;
198
+ },
199
+ get audioTrack() {
200
+ return self.audioTrack ?? null;
201
+ },
202
+ get videoTrack() {
203
+ return self.videoTrack ?? null;
204
+ },
205
+ get screenShareTracks() {
206
+ return {
207
+ ...self.screenShareTracks.audio ? { audio: self.screenShareTracks.audio } : {},
208
+ ...self.screenShareTracks.video ? { video: self.screenShareTracks.video } : {}
209
+ };
210
+ },
211
+ enableAudio: () => self.enableAudio(),
212
+ enableVideo: () => self.enableVideo(),
213
+ enableScreenShare: () => self.enableScreenShare(),
214
+ disableAudio: () => self.disableAudio(),
215
+ disableVideo: () => self.disableVideo(),
216
+ disableScreenShare: () => self.disableScreenShare(),
217
+ onAudioUpdate: (listener) => {
218
+ self.on("audioUpdate", listener);
219
+ return () => self.off("audioUpdate", listener);
220
+ },
221
+ onVideoUpdate: (listener) => {
222
+ self.on("videoUpdate", listener);
223
+ return () => self.off("videoUpdate", listener);
224
+ },
225
+ onScreenShareUpdate: (listener) => {
226
+ self.on("screenShareUpdate", listener);
227
+ return () => self.off("screenShareUpdate", listener);
228
+ },
229
+ onLeft: (listener) => {
230
+ const callback = () => listener();
231
+ self.on("roomLeft", callback);
232
+ return () => self.off("roomLeft", callback);
233
+ }
234
+ },
235
+ participants: {
236
+ joined: {
237
+ list: () => client.participants.joined.toArray().map(toParticipant),
238
+ onJoined: (listener) => {
239
+ const callback = (participant) => listener(toParticipant(participant));
240
+ client.participants.joined.on("participantJoined", callback);
241
+ return () => client.participants.joined.off("participantJoined", callback);
242
+ },
243
+ onLeft: (listener) => {
244
+ const callback = (participant) => listener(toParticipant(participant));
245
+ client.participants.joined.on("participantLeft", callback);
246
+ return () => client.participants.joined.off("participantLeft", callback);
247
+ }
248
+ }
249
+ }
250
+ };
251
+ }
252
+ function toParticipant(participant) {
253
+ return {
254
+ id: participant.id,
255
+ userId: participant.userId,
256
+ ...participant.customParticipantId === void 0 ? {} : { customParticipantId: participant.customParticipantId },
257
+ audioEnabled: participant.audioEnabled,
258
+ videoEnabled: participant.videoEnabled,
259
+ screenShareEnabled: participant.screenShareEnabled,
260
+ audioTrack: participant.audioTrack ?? null,
261
+ videoTrack: participant.videoTrack ?? null,
262
+ screenShareTracks: {
263
+ ...participant.screenShareTracks.audio ? { audio: participant.screenShareTracks.audio } : {},
264
+ ...participant.screenShareTracks.video ? { video: participant.screenShareTracks.video } : {}
265
+ }
266
+ };
267
+ }
268
+
170
269
  // src/space-client/create-native-space-client.ts
171
270
  function createNativeSpaceClient(options) {
172
271
  const { storage, telemetry: journey } = options;
@@ -253,7 +352,17 @@ function joinTracePhase(step) {
253
352
  }
254
353
  function createMediaClient(apiBaseURL, input, fetch, observePeerConnection, journey) {
255
354
  const { subject } = input.access;
256
- return new CloudflareSFUClient({
355
+ if (input.access.media.provider === "cloudflare_rtk") {
356
+ const client2 = new CloudflareRTKClient({
357
+ authToken: input.access.media.clientPayload.token,
358
+ participantId: subject.participantId,
359
+ clientFactory: createNativeRealtimeKitClient,
360
+ onError: input.onFailure,
361
+ onScreenEnded: input.onScreenEnded
362
+ });
363
+ return createRTKConnectionMediaClient(client2);
364
+ }
365
+ const client = new CloudflareSFUClient({
257
366
  bootstrap: input.access.media.clientPayload,
258
367
  participantId: subject.participantId,
259
368
  transport: createCloudflareSFUHTTPTransport({
@@ -273,6 +382,44 @@ function createMediaClient(apiBaseURL, input, fetch, observePeerConnection, jour
273
382
  onError: input.onFailure,
274
383
  onScreenEnded: input.onScreenEnded
275
384
  });
385
+ return createSFUConnectionMediaClient(client);
386
+ }
387
+ function createRTKConnectionMediaClient(client) {
388
+ return {
389
+ setLocalPublicationTarget: client.setLocalPublicationTarget.bind(client),
390
+ observeLocalPublications: client.observeLocalPublications.bind(client),
391
+ observeRemotePublications: client.observeRemotePublications.bind(client),
392
+ start: client.start.bind(client),
393
+ stop: client.stop.bind(client),
394
+ restart: (input) => {
395
+ if (!("provider" in input) || input.provider !== "cloudflare_rtk") throw new TypeError("The RealtimeKit adapter requires a Cloudflare RealtimeKit access grant");
396
+ return client.restart(input);
397
+ },
398
+ prepareLocalTrack: client.prepareLocalTrack.bind(client),
399
+ clearPreparedLocalTrack: client.clearPreparedLocalTrack.bind(client),
400
+ getSnapshot: client.getSnapshot.bind(client),
401
+ subscribe: client.subscribe.bind(client)
402
+ };
403
+ }
404
+ function createSFUConnectionMediaClient(client) {
405
+ return {
406
+ setLocalPublicationTarget: client.setLocalPublicationTarget.bind(client),
407
+ observeLocalPublications: client.observeLocalPublications.bind(client),
408
+ observeRemotePublications: client.observeRemotePublications.bind(client),
409
+ start: client.start.bind(client),
410
+ stop: client.stop.bind(client),
411
+ restart: (input) => {
412
+ if ("provider" in input) {
413
+ if (input.provider !== "cloudflare_sfu") throw new TypeError("The Cloudflare SFU adapter requires a Cloudflare SFU access grant");
414
+ return client.restart(input.clientPayload);
415
+ }
416
+ return client.restart(input);
417
+ },
418
+ prepareLocalTrack: client.prepareLocalTrack.bind(client),
419
+ clearPreparedLocalTrack: client.clearPreparedLocalTrack.bind(client),
420
+ getSnapshot: client.getSnapshot.bind(client),
421
+ subscribe: client.subscribe.bind(client)
422
+ };
276
423
  }
277
424
  function createSyncClient(syncURL, input, lifecycle, webSocket, storage) {
278
425
  const subject = input.access.subject;
@@ -12,7 +12,7 @@ import {
12
12
  import {
13
13
  createNativeSpaceClient,
14
14
  getNativeJourneyContext
15
- } from "./chunk-HXYIJ75K.js";
15
+ } from "./chunk-LZ67SXGB.js";
16
16
 
17
17
  // src/components/Chalk.tsx
18
18
  import { useCallback as useCallback9, useEffect as useEffect8, useMemo as useMemo15, useRef as useRef5, useState as useState9 } from "react";
@@ -4522,6 +4522,14 @@ var styles24 = StyleSheet25.create({
4522
4522
  retryText: { fontWeight: "800" }
4523
4523
  });
4524
4524
 
4525
+ // src/utils/build-chalk-invite-link.ts
4526
+ var PUBLIC_INVITE_ORIGIN = "https://chalkmeet.com";
4527
+ function buildChalkInviteLink(spaceSlug, spaceInviteToken, origin = PUBLIC_INVITE_ORIGIN) {
4528
+ const link = new URL(`/space/${encodeURIComponent(spaceSlug)}`, origin.replace(/\/+$/u, ""));
4529
+ link.hash = new URLSearchParams({ spaceInviteToken }).toString();
4530
+ return link.toString();
4531
+ }
4532
+
4525
4533
  export {
4526
4534
  ChalkProvider,
4527
4535
  useSpaceClient,
@@ -4534,5 +4542,6 @@ export {
4534
4542
  useWhiteboard,
4535
4543
  useCan,
4536
4544
  Entrance,
4537
- Chalk
4545
+ Chalk,
4546
+ buildChalkInviteLink
4538
4547
  };
package/dist/client.js CHANGED
@@ -1,6 +1,6 @@
1
1
  import {
2
2
  createNativeSpaceClient
3
- } from "./chunk-HXYIJ75K.js";
3
+ } from "./chunk-LZ67SXGB.js";
4
4
  export {
5
5
  createNativeSpaceClient
6
6
  };
@@ -13,8 +13,8 @@ export interface DevDiagnosticsTimelineEntry {
13
13
  export interface DevDiagnosticsState {
14
14
  readonly enabled: boolean;
15
15
  readonly environment: {
16
+ readonly apiBaseURL: string | null;
16
17
  readonly buildProfile: string | null;
17
- readonly brokerUrl: string | null;
18
18
  readonly target: "custom" | "local" | "production" | "unknown";
19
19
  readonly routeKind: string | null;
20
20
  readonly routeSpaceId: string | null;
@@ -29,10 +29,10 @@ export interface DevDiagnosticsState {
29
29
  } | null;
30
30
  readonly timeline: readonly DevDiagnosticsTimelineEntry[];
31
31
  }
32
- export declare function classifyTarget(brokerUrl: string | null | undefined): DevDiagnosticsState["environment"]["target"];
33
- export declare function resolveDevDiagnosticsMode({ isDevRuntime, brokerUrl }: {
32
+ export declare function classifyTarget(apiBaseURL: string | null | undefined): DevDiagnosticsState["environment"]["target"];
33
+ export declare function resolveDevDiagnosticsMode({ isDevRuntime, apiBaseURL }: {
34
34
  readonly isDevRuntime: boolean;
35
- readonly brokerUrl: string | null | undefined;
35
+ readonly apiBaseURL: string | null | undefined;
36
36
  }): {
37
37
  readonly enabled: boolean;
38
38
  readonly buildProfile: "development" | "production";
@@ -1 +1 @@
1
- {"version":3,"file":"diagnostics.d.ts","sourceRoot":"","sources":["../src/diagnostics.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"diagnostics.d.ts","sourceRoot":"","sources":["../src/diagnostics.ts"],"names":[],"mappings":"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"}
@@ -4,10 +4,10 @@ var isDevelopmentRuntime = typeof __DEV__ !== "undefined" ? __DEV__ : runtimeEnv
4
4
  var maximumTimelineItems = 120;
5
5
  var listeners = /* @__PURE__ */ new Set();
6
6
  var state = initialState();
7
- function classifyTarget(brokerUrl) {
8
- if (!brokerUrl) return "unknown";
7
+ function classifyTarget(apiBaseURL) {
8
+ if (!apiBaseURL) return "unknown";
9
9
  try {
10
- const hostname = new URL(brokerUrl).hostname;
10
+ const hostname = new URL(apiBaseURL).hostname;
11
11
  if (["localhost", "127.0.0.1", "0.0.0.0"].includes(hostname)) return "local";
12
12
  if (hostname === "chalkmeet.com" || hostname.endsWith(".chalkmeet.com")) return "production";
13
13
  return "custom";
@@ -15,10 +15,10 @@ function classifyTarget(brokerUrl) {
15
15
  return "unknown";
16
16
  }
17
17
  }
18
- function resolveDevDiagnosticsMode({ isDevRuntime, brokerUrl }) {
18
+ function resolveDevDiagnosticsMode({ isDevRuntime, apiBaseURL }) {
19
19
  return {
20
20
  enabled: isDevRuntime,
21
- buildProfile: isDevRuntime || classifyTarget(brokerUrl) === "local" ? "development" : "production"
21
+ buildProfile: isDevRuntime || classifyTarget(apiBaseURL) === "local" ? "development" : "production"
22
22
  };
23
23
  }
24
24
  function subscribeDevDiagnostics(listener) {
@@ -34,7 +34,7 @@ function setDevDiagnosticsEnvironment(next) {
34
34
  environment: {
35
35
  ...current.environment,
36
36
  ...next,
37
- target: next.brokerUrl ? classifyTarget(next.brokerUrl) : current.environment.target
37
+ target: next.apiBaseURL ? classifyTarget(next.apiBaseURL) : current.environment.target
38
38
  }
39
39
  }));
40
40
  }
@@ -94,8 +94,8 @@ function initialState() {
94
94
  return {
95
95
  enabled: isDevelopmentRuntime,
96
96
  environment: {
97
+ apiBaseURL: null,
97
98
  buildProfile: null,
98
- brokerUrl: null,
99
99
  target: "unknown",
100
100
  routeKind: null,
101
101
  routeSpaceId: null,
package/dist/index.d.ts CHANGED
@@ -6,6 +6,9 @@ export { ChalkProvider, useSpaceClient } from "./context/space-client-context";
6
6
  export type { ChalkProviderProps } from "./context/space-client-context";
7
7
  export { useCan, useChat, useConnection, useMedia, useParticipants, useReactions, useSelf, useWhiteboard } from "./hooks/space-hooks";
8
8
  export { Theme, createNativeTheme } from "./ui/theme";
9
+ export { extractSpaceInviteFromLink, getClipboardInviteSuggestion, parseSpaceInviteLink } from "./invites";
10
+ export type { SpaceInviteLink } from "./invites";
11
+ export { buildChalkInviteLink } from "./utils/build-chalk-invite-link";
9
12
  export { getThemeMode, isDarkThemePalette, resolveNativeAppearance, THEME_PALETTES, THEME_TEXTURES } from "./ui/appearance";
10
13
  export type { NativeAppearance, NativeAppearanceTokens, NativeShadowToken, NativeTextureBlendMode, NativeTextureDescriptor, NativeTextureKind, ThemeAppearance, ThemeMode, ThemePalette, ThemeTexture } from "./ui/appearance";
11
14
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,MAAM,oBAAoB,CAAC;AAC3C,YAAY,EAAE,aAAa,EAAE,UAAU,EAAE,UAAU,EAAE,gBAAgB,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AAC/G,OAAO,EAAE,QAAQ,EAAE,MAAM,uBAAuB,CAAC;AACjD,YAAY,EAAE,aAAa,EAAE,gBAAgB,EAAE,MAAM,uBAAuB,CAAC;AAC7E,OAAO,EAAE,aAAa,EAAE,cAAc,EAAE,MAAM,gCAAgC,CAAC;AAC/E,YAAY,EAAE,kBAAkB,EAAE,MAAM,gCAAgC,CAAC;AACzE,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,aAAa,EAAE,QAAQ,EAAE,eAAe,EAAE,YAAY,EAAE,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AACtI,OAAO,EAAE,KAAK,EAAE,iBAAiB,EAAE,MAAM,YAAY,CAAC;AACtD,OAAO,EAAE,YAAY,EAAE,kBAAkB,EAAE,uBAAuB,EAAE,cAAc,EAAE,cAAc,EAAE,MAAM,iBAAiB,CAAC;AAC5H,YAAY,EAAE,gBAAgB,EAAE,sBAAsB,EAAE,iBAAiB,EAAE,sBAAsB,EAAE,uBAAuB,EAAE,iBAAiB,EAAE,eAAe,EAAE,SAAS,EAAE,YAAY,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,MAAM,oBAAoB,CAAC;AAC3C,YAAY,EAAE,aAAa,EAAE,UAAU,EAAE,UAAU,EAAE,gBAAgB,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AAC/G,OAAO,EAAE,QAAQ,EAAE,MAAM,uBAAuB,CAAC;AACjD,YAAY,EAAE,aAAa,EAAE,gBAAgB,EAAE,MAAM,uBAAuB,CAAC;AAC7E,OAAO,EAAE,aAAa,EAAE,cAAc,EAAE,MAAM,gCAAgC,CAAC;AAC/E,YAAY,EAAE,kBAAkB,EAAE,MAAM,gCAAgC,CAAC;AACzE,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,aAAa,EAAE,QAAQ,EAAE,eAAe,EAAE,YAAY,EAAE,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AACtI,OAAO,EAAE,KAAK,EAAE,iBAAiB,EAAE,MAAM,YAAY,CAAC;AACtD,OAAO,EAAE,0BAA0B,EAAE,4BAA4B,EAAE,oBAAoB,EAAE,MAAM,WAAW,CAAC;AAC3G,YAAY,EAAE,eAAe,EAAE,MAAM,WAAW,CAAC;AACjD,OAAO,EAAE,oBAAoB,EAAE,MAAM,iCAAiC,CAAC;AACvE,OAAO,EAAE,YAAY,EAAE,kBAAkB,EAAE,uBAAuB,EAAE,cAAc,EAAE,cAAc,EAAE,MAAM,iBAAiB,CAAC;AAC5H,YAAY,EAAE,gBAAgB,EAAE,sBAAsB,EAAE,iBAAiB,EAAE,sBAAsB,EAAE,uBAAuB,EAAE,iBAAiB,EAAE,eAAe,EAAE,SAAS,EAAE,YAAY,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAC"}
package/dist/index.js CHANGED
@@ -2,6 +2,7 @@ import {
2
2
  Chalk,
3
3
  ChalkProvider,
4
4
  Entrance,
5
+ buildChalkInviteLink,
5
6
  useCan,
6
7
  useChat,
7
8
  useConnection,
@@ -11,7 +12,7 @@ import {
11
12
  useSelf,
12
13
  useSpaceClient,
13
14
  useWhiteboard
14
- } from "./chunk-5HETUU73.js";
15
+ } from "./chunk-MMBE2BVK.js";
15
16
  import {
16
17
  THEME_PALETTES,
17
18
  THEME_TEXTURES,
@@ -23,7 +24,12 @@ import {
23
24
  Theme,
24
25
  createNativeTheme
25
26
  } from "./chunk-JB4LNWVP.js";
26
- import "./chunk-HXYIJ75K.js";
27
+ import "./chunk-LZ67SXGB.js";
28
+ import {
29
+ extractSpaceInviteFromLink,
30
+ getClipboardInviteSuggestion,
31
+ parseSpaceInviteLink
32
+ } from "./chunk-4L5GXJ36.js";
27
33
  export {
28
34
  Chalk,
29
35
  ChalkProvider,
@@ -31,9 +37,13 @@ export {
31
37
  THEME_PALETTES,
32
38
  THEME_TEXTURES,
33
39
  Theme,
40
+ buildChalkInviteLink,
34
41
  createNativeTheme,
42
+ extractSpaceInviteFromLink,
43
+ getClipboardInviteSuggestion,
35
44
  getThemeMode,
36
45
  isDarkThemePalette,
46
+ parseSpaceInviteLink,
37
47
  resolveNativeAppearance,
38
48
  useCan,
39
49
  useChat,
package/dist/invites.d.ts CHANGED
@@ -1,3 +1,8 @@
1
- export declare function extractJoinTokenFromInviteLink(input: string): string | null;
1
+ export type SpaceInviteLink = {
2
+ readonly slug: string;
3
+ readonly spaceInviteToken: string;
4
+ };
5
+ export declare function parseSpaceInviteLink(input: string): SpaceInviteLink | null;
6
+ export declare function extractSpaceInviteFromLink(input: string): SpaceInviteLink | null;
2
7
  export declare function getClipboardInviteSuggestion(clipboardText: string | null | undefined, currentInput?: string): string | null;
3
8
  //# sourceMappingURL=invites.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"invites.d.ts","sourceRoot":"","sources":["../src/invites.ts"],"names":[],"mappings":"AAIA,wBAAgB,8BAA8B,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAyB3E;AAED,wBAAgB,4BAA4B,CAAC,aAAa,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,EAAE,YAAY,SAAK,GAAG,MAAM,GAAG,IAAI,CAWvH"}
1
+ {"version":3,"file":"invites.d.ts","sourceRoot":"","sources":["../src/invites.ts"],"names":[],"mappings":"AAKA,MAAM,MAAM,eAAe,GAAG;IAC5B,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,gBAAgB,EAAE,MAAM,CAAC;CACnC,CAAC;AAEF,wBAAgB,oBAAoB,CAAC,KAAK,EAAE,MAAM,GAAG,eAAe,GAAG,IAAI,CA0B1E;AAeD,wBAAgB,0BAA0B,CAAC,KAAK,EAAE,MAAM,GAAG,eAAe,GAAG,IAAI,CAEhF;AAED,wBAAgB,4BAA4B,CAAC,aAAa,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,EAAE,YAAY,SAAK,GAAG,MAAM,GAAG,IAAI,CAWvH"}
package/dist/invites.js CHANGED
@@ -1,41 +1,10 @@
1
- // src/invites.ts
2
- var CHALK_INVITE_HOSTS = ["chalkmeet.com", "chalk.q9labs.ai"];
3
- var CHALK_CUSTOM_PROTOCOLS = /* @__PURE__ */ new Set(["chalk:", "ai.q9labs.chalk.mobile:"]);
4
- var capabilityPattern = /^[A-Za-z0-9_-]{43}$/u;
5
- function extractJoinTokenFromInviteLink(input) {
6
- const trimmed = input.trim();
7
- if (!trimmed) {
8
- return null;
9
- }
10
- const normalized = trimmed.includes("://") ? trimmed : CHALK_INVITE_HOSTS.some((host) => trimmed.startsWith(`${host}/`)) ? `https://${trimmed}` : null;
11
- if (!normalized) {
12
- return null;
13
- }
14
- try {
15
- const parsed = new URL(normalized);
16
- if (!CHALK_CUSTOM_PROTOCOLS.has(parsed.protocol) && (parsed.protocol !== "https:" || !CHALK_INVITE_HOSTS.includes(parsed.hostname))) {
17
- return null;
18
- }
19
- const pathSegments = CHALK_CUSTOM_PROTOCOLS.has(parsed.protocol) ? [parsed.hostname, ...parsed.pathname.split("/").filter(Boolean)] : parsed.pathname.split("/").filter(Boolean);
20
- const [head, tail] = pathSegments;
21
- const hashInvite = new URLSearchParams(parsed.hash.replace(/^#/u, "")).get("access");
22
- const token = head === "j" && tail ? tail : hashInvite?.trim();
23
- return token && capabilityPattern.test(token) ? token : null;
24
- } catch {
25
- return null;
26
- }
27
- }
28
- function getClipboardInviteSuggestion(clipboardText, currentInput = "") {
29
- const normalizedClipboardText = clipboardText?.trim();
30
- if (!normalizedClipboardText) {
31
- return null;
32
- }
33
- if (normalizedClipboardText === currentInput.trim()) {
34
- return null;
35
- }
36
- return extractJoinTokenFromInviteLink(normalizedClipboardText) ? normalizedClipboardText : null;
37
- }
1
+ import {
2
+ extractSpaceInviteFromLink,
3
+ getClipboardInviteSuggestion,
4
+ parseSpaceInviteLink
5
+ } from "./chunk-4L5GXJ36.js";
38
6
  export {
39
- extractJoinTokenFromInviteLink,
40
- getClipboardInviteSuggestion
7
+ extractSpaceInviteFromLink,
8
+ getClipboardInviteSuggestion,
9
+ parseSpaceInviteLink
41
10
  };
package/dist/ios-pad.js CHANGED
@@ -2,6 +2,7 @@ import {
2
2
  Chalk,
3
3
  ChalkProvider,
4
4
  Entrance,
5
+ buildChalkInviteLink,
5
6
  useCan,
6
7
  useChat,
7
8
  useConnection,
@@ -11,7 +12,7 @@ import {
11
12
  useSelf,
12
13
  useSpaceClient,
13
14
  useWhiteboard
14
- } from "./chunk-5HETUU73.js";
15
+ } from "./chunk-MMBE2BVK.js";
15
16
  import {
16
17
  THEME_PALETTES,
17
18
  THEME_TEXTURES,
@@ -23,7 +24,12 @@ import {
23
24
  Theme,
24
25
  createNativeTheme
25
26
  } from "./chunk-JB4LNWVP.js";
26
- import "./chunk-HXYIJ75K.js";
27
+ import "./chunk-LZ67SXGB.js";
28
+ import {
29
+ extractSpaceInviteFromLink,
30
+ getClipboardInviteSuggestion,
31
+ parseSpaceInviteLink
32
+ } from "./chunk-4L5GXJ36.js";
27
33
  export {
28
34
  Chalk,
29
35
  ChalkProvider,
@@ -31,9 +37,13 @@ export {
31
37
  THEME_PALETTES,
32
38
  THEME_TEXTURES,
33
39
  Theme,
40
+ buildChalkInviteLink,
34
41
  createNativeTheme,
42
+ extractSpaceInviteFromLink,
43
+ getClipboardInviteSuggestion,
35
44
  getThemeMode,
36
45
  isDarkThemePalette,
46
+ parseSpaceInviteLink,
37
47
  resolveNativeAppearance,
38
48
  useCan,
39
49
  useChat,
package/dist/ios-phone.js CHANGED
@@ -2,6 +2,7 @@ import {
2
2
  Chalk,
3
3
  ChalkProvider,
4
4
  Entrance,
5
+ buildChalkInviteLink,
5
6
  useCan,
6
7
  useChat,
7
8
  useConnection,
@@ -11,7 +12,7 @@ import {
11
12
  useSelf,
12
13
  useSpaceClient,
13
14
  useWhiteboard
14
- } from "./chunk-5HETUU73.js";
15
+ } from "./chunk-MMBE2BVK.js";
15
16
  import {
16
17
  THEME_PALETTES,
17
18
  THEME_TEXTURES,
@@ -23,7 +24,12 @@ import {
23
24
  Theme,
24
25
  createNativeTheme
25
26
  } from "./chunk-JB4LNWVP.js";
26
- import "./chunk-HXYIJ75K.js";
27
+ import "./chunk-LZ67SXGB.js";
28
+ import {
29
+ extractSpaceInviteFromLink,
30
+ getClipboardInviteSuggestion,
31
+ parseSpaceInviteLink
32
+ } from "./chunk-4L5GXJ36.js";
27
33
  export {
28
34
  Chalk,
29
35
  ChalkProvider,
@@ -31,9 +37,13 @@ export {
31
37
  THEME_PALETTES,
32
38
  THEME_TEXTURES,
33
39
  Theme,
40
+ buildChalkInviteLink,
34
41
  createNativeTheme,
42
+ extractSpaceInviteFromLink,
43
+ getClipboardInviteSuggestion,
35
44
  getThemeMode,
36
45
  isDarkThemePalette,
46
+ parseSpaceInviteLink,
37
47
  resolveNativeAppearance,
38
48
  useCan,
39
49
  useChat,
package/dist/ios.js CHANGED
@@ -2,6 +2,7 @@ import {
2
2
  Chalk,
3
3
  ChalkProvider,
4
4
  Entrance,
5
+ buildChalkInviteLink,
5
6
  useCan,
6
7
  useChat,
7
8
  useConnection,
@@ -11,7 +12,7 @@ import {
11
12
  useSelf,
12
13
  useSpaceClient,
13
14
  useWhiteboard
14
- } from "./chunk-5HETUU73.js";
15
+ } from "./chunk-MMBE2BVK.js";
15
16
  import {
16
17
  THEME_PALETTES,
17
18
  THEME_TEXTURES,
@@ -23,7 +24,12 @@ import {
23
24
  Theme,
24
25
  createNativeTheme
25
26
  } from "./chunk-JB4LNWVP.js";
26
- import "./chunk-HXYIJ75K.js";
27
+ import "./chunk-LZ67SXGB.js";
28
+ import {
29
+ extractSpaceInviteFromLink,
30
+ getClipboardInviteSuggestion,
31
+ parseSpaceInviteLink
32
+ } from "./chunk-4L5GXJ36.js";
27
33
  export {
28
34
  Chalk,
29
35
  ChalkProvider,
@@ -31,9 +37,13 @@ export {
31
37
  THEME_PALETTES,
32
38
  THEME_TEXTURES,
33
39
  Theme,
40
+ buildChalkInviteLink,
34
41
  createNativeTheme,
42
+ extractSpaceInviteFromLink,
43
+ getClipboardInviteSuggestion,
35
44
  getThemeMode,
36
45
  isDarkThemePalette,
46
+ parseSpaceInviteLink,
37
47
  resolveNativeAppearance,
38
48
  useCan,
39
49
  useChat,