temporary: use orm sets at root level for objects

feat/orm-diffs
Laurin Weger 17 hours ago
parent dbb4e3d7ce
commit aa0acfa197
No known key found for this signature in database
GPG Key ID: 9B372BB0B792770F
  1. 2
      sdk/js/examples/multi-framework-signals/src/frontends/react/HelloWorld.tsx
  2. 4
      sdk/js/examples/multi-framework-signals/src/frontends/svelte/HelloWorld.svelte
  3. 14
      sdk/js/signals/src/connector/ormConnectionHandler.ts
  4. 2
      sdk/js/signals/src/frontendAdapters/react/useShape.ts
  5. 6
      sdk/js/signals/src/frontendAdapters/svelte/useShape.svelte.ts

@ -4,7 +4,7 @@ import flattenObject from "../utils/flattenObject";
import { TestObjectShapeType } from "../../shapes/orm/testShape.shapeTypes"; import { TestObjectShapeType } from "../../shapes/orm/testShape.shapeTypes";
export function HelloWorldReact() { export function HelloWorldReact() {
const state = useShape(TestObjectShapeType); const state = useShape(TestObjectShapeType)?.entries().next();
// @ts-expect-error // @ts-expect-error
window.reactState = state; window.reactState = state;

@ -20,7 +20,9 @@
cur[keys[keys.length - 1]] = value; cur[keys[keys.length - 1]] = value;
} }
const flatEntries = $derived( const flatEntries = $derived(
$shapeObject ? flattenObject($shapeObject as any) : [] $shapeObject
? flattenObject($shapeObject.entries().next() || ({} as any))
: []
); );
$effect(() => { $effect(() => {
(window as any).svelteState = $shapeObject; (window as any).svelteState = $shapeObject;

@ -21,7 +21,7 @@ export class OrmConnection<T extends BaseType> {
readonly shapeType: ShapeType<T>; readonly shapeType: ShapeType<T>;
readonly scope: Scope; readonly scope: Scope;
readonly signalObject: DeepSignalObject<T | {}>; readonly signalObject: DeepSignalObject<Set<T>>;
private refCount: number; private refCount: number;
/*** Identifier as a combination of shape type and scope. Prevents duplications. */ /*** Identifier as a combination of shape type and scope. Prevents duplications. */
private identifier: string; private identifier: string;
@ -49,7 +49,7 @@ export class OrmConnection<T extends BaseType> {
this.ready = false; this.ready = false;
this.suspendDeepWatcher = false; this.suspendDeepWatcher = false;
this.identifier = `${shapeType.shape}::${canonicalScope(scope)}`; this.identifier = `${shapeType.shape}::${canonicalScope(scope)}`;
this.signalObject = deepSignal<T | {}>(new Set(), { this.signalObject = deepSignal<Set<T>>(new Set(), {
addIdToObjects: true, addIdToObjects: true,
idGenerator: this.generateSubjectIri, idGenerator: this.generateSubjectIri,
}); });
@ -62,7 +62,7 @@ export class OrmConnection<T extends BaseType> {
); );
// Add listener to deep signal object to report changes back to wasm land. // Add listener to deep signal object to report changes back to wasm land.
watchDeepSignal(this.signalObject as T, this.onSignalObjectUpdate); watchDeepSignal<Set<T>>(this.signalObject, this.onSignalObjectUpdate);
// Initialize per-entry readiness promise that resolves in setUpConnection // Initialize per-entry readiness promise that resolves in setUpConnection
this.readyPromise = new Promise<void>((resolve) => { this.readyPromise = new Promise<void>((resolve) => {
@ -79,7 +79,7 @@ export class OrmConnection<T extends BaseType> {
this.onBackendMessage this.onBackendMessage
); );
} catch (e) { } catch (e) {
console.error(e) console.error(e);
} }
}); });
} }
@ -123,7 +123,7 @@ export class OrmConnection<T extends BaseType> {
} }
} }
private onSignalObjectUpdate({ patches }: WatchPatchEvent<T>) { private onSignalObjectUpdate({ patches }: WatchPatchEvent<Set<T>>) {
if (this.suspendDeepWatcher || !this.ready || !patches.length) return; if (this.suspendDeepWatcher || !this.ready || !patches.length) return;
const ormPatches = deepPatchesToDiff(patches); const ormPatches = deepPatchesToDiff(patches);
@ -153,7 +153,9 @@ export class OrmConnection<T extends BaseType> {
this.suspendDeepWatcher = true; this.suspendDeepWatcher = true;
batch(() => { batch(() => {
// Convert arrays to sets and apply to signalObject (we only have sets but can only transport arrays). // Convert arrays to sets and apply to signalObject (we only have sets but can only transport arrays).
Object.assign(this.signalObject, recurseArrayToSet(initialData)!); for (const newItem of recurseArrayToSet(initialData)) {
this.signalObject.add(newItem);
}
}); });
queueMicrotask(() => { queueMicrotask(() => {

@ -31,7 +31,7 @@ const useShape = <T extends BaseType>(
}; };
}, []); }, []);
if ("id" in shapeSignalRef.current.signalObject) if ("@id" in shapeSignalRef.current.signalObject)
return shapeSignalRef.current.signalObject; return shapeSignalRef.current.signalObject;
else return null; else return null;
}; };

@ -91,7 +91,7 @@ export interface UseShapeRuneResult<T = any> extends UseDeepSignalResult<T> {
export function useShapeRune<T extends BaseType>( export function useShapeRune<T extends BaseType>(
shape: ShapeType<T>, shape: ShapeType<T>,
scope?: Scope scope?: Scope
): UseShapeRuneResult<T | {}> { ): UseShapeRuneResult<Set<T>> {
const { signalObject: rootSignal, stop } = createSignalObjectForShape( const { signalObject: rootSignal, stop } = createSignalObjectForShape(
shape, shape,
scope scope
@ -101,8 +101,8 @@ export function useShapeRune<T extends BaseType>(
onDestroy(stop); onDestroy(stop);
// rootSignal is already a deepSignal proxy root (object returned by createSignalObjectForShape) // rootSignal is already a deepSignal proxy root (object returned by createSignalObjectForShape)
const ds = useDeepSignal<T>(rootSignal as T); const ds = useDeepSignal<Set<T>>(rootSignal as Set<T>);
return { root: rootSignal, ...ds } as UseShapeRuneResult<T>; return { root: rootSignal, ...ds } as UseShapeRuneResult<Set<T>>;
} }
export default useShapeRune; export default useShapeRune;

Loading…
Cancel
Save