@lunora/angular 1.0.0-alpha.55 → 1.0.0-alpha.57
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/README.md +2 -2
- package/dist/index.d.mts +21 -2
- package/dist/index.d.ts +21 -2
- package/dist/index.mjs +1 -1
- package/dist/packem_shared/{agent-BPvUvuXh.mjs → agent-ZUHt9ut7.mjs} +1 -1
- package/dist/packem_shared/{agentChat-BgD9zNFw.mjs → agentChat-CSrFbg5h.mjs} +1 -1
- package/dist/packem_shared/{agentState-BBAruY2b.mjs → agentState-DhKNFqhU.mjs} +1 -1
- package/dist/packem_shared/{agentToolEvents-CUwrn-Nu.mjs → agentToolEvents-DB_9RYy5.mjs} +1 -1
- package/dist/packem_shared/infiniteQuery-DOlLHKmq.mjs +1 -0
- package/dist/packem_shared/liveQuery-CqnuEq1l.mjs +1 -0
- package/dist/packem_shared/presence-xJ3m0qXh.mjs +1 -0
- package/dist/packem_shared/stream-AffQZjVg.mjs +1 -0
- package/dist/packem_shared/subscription-DvndYt66.mjs +1 -0
- package/package.json +3 -3
- package/dist/packem_shared/infiniteQuery-B5Q21vgn.mjs +0 -1
- package/dist/packem_shared/liveQuery-BvA2co81.mjs +0 -1
- package/dist/packem_shared/presence-vJUxsR5f.mjs +0 -1
- package/dist/packem_shared/stream-CcjYdpzt.mjs +0 -1
- package/dist/packem_shared/subscription-DqtYnats.mjs +0 -1
package/README.md
CHANGED
|
@@ -58,8 +58,8 @@ export class MessagesComponent {
|
|
|
58
58
|
Pass `"skip"` as the args to short-circuit (no network call, no socket).
|
|
59
59
|
|
|
60
60
|
Pass a function/`Signal` instead of a plain object to make the args reactive —
|
|
61
|
-
each change tears the old subscription down
|
|
62
|
-
args:
|
|
61
|
+
each change tears the old subscription down, resets the signal to `undefined`,
|
|
62
|
+
and opens a fresh one for the new args:
|
|
63
63
|
|
|
64
64
|
```ts
|
|
65
65
|
export class MessagesComponent {
|
package/dist/index.d.mts
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { DestroyRef, Signal, InjectionToken, EnvironmentProviders, Injector } from '@angular/core';
|
|
2
|
-
import { FunctionReference, LunoraClient, SubscriptionError, User, LunoraClientOptions, ConnectionStatus, Preloaded, ArgsOf, ReturnOf, MutationCallOptions, MutatorHandle, ActionCallOptions } from '@lunora/client';
|
|
2
|
+
import { FunctionReference, LunoraClient, SubscriptionError, User, LunoraClientOptions, ConnectionStatus, Preloaded, ArgsOf, ReturnOf, MutationCallOptions, MutatorHandle, SubscriptionErrorCallback, ActionCallOptions } from '@lunora/client';
|
|
3
3
|
export type { ArgsOf, ConnectionStatus, FunctionReference, LunoraClient, LunoraClientOptions, MutationCallOptions, Preloaded, ReturnOf, SubscriptionError, Unsubscribe } from '@lunora/client';
|
|
4
4
|
import { PaginationStatus } from '@lunora/client/pagination';
|
|
5
5
|
import { RateLimitStatus, RateLimitConfig } from '@lunora/ratelimit';
|
|
@@ -797,7 +797,8 @@ interface LiveQueryOptions {
|
|
|
797
797
|
*
|
|
798
798
|
* `args` also accepts a function/`Signal` — `() => ({ channelId: channelId() })`
|
|
799
799
|
* — to make the subscription reactive: an args change tears the old
|
|
800
|
-
* subscription down and opens a fresh one
|
|
800
|
+
* subscription down, resets the signal to `undefined`, and opens a fresh one
|
|
801
|
+
* for the new args, mirroring
|
|
801
802
|
* `@lunora/solid`'s `createQuery`/`@lunora/vue`'s `useQuery`. A static (plain
|
|
802
803
|
* object) `args` resolves once and never re-runs — no `effect()` is created for
|
|
803
804
|
* it, so it carries none of the reactive form's DI requirement.
|
|
@@ -898,6 +899,8 @@ interface PaginatedQueryOptions {
|
|
|
898
899
|
* injection context. Unused for the static `args` form.
|
|
899
900
|
*/
|
|
900
901
|
injector?: Injector;
|
|
902
|
+
/** Called when a page subscription reports an error (also surfaced on the `error` signal). */
|
|
903
|
+
onError?: SubscriptionErrorCallback;
|
|
901
904
|
/** Route to a specific shard when the target function is `.shardBy(...)`-partitioned. */
|
|
902
905
|
shardKey?: string;
|
|
903
906
|
}
|
|
@@ -906,6 +909,13 @@ interface PaginatedQueryOptions {
|
|
|
906
909
|
* @experimental
|
|
907
910
|
*/
|
|
908
911
|
interface PaginatedQueryResult<T> {
|
|
912
|
+
/**
|
|
913
|
+
* The last page subscription error, or `undefined`. A tail page that fails
|
|
914
|
+
* before its first frame is dropped so `status` returns to `"CanLoadMore"`
|
|
915
|
+
* and `loadMore` can retry it; cleared by the next successful frame,
|
|
916
|
+
* `loadMore`, or an args change.
|
|
917
|
+
*/
|
|
918
|
+
error: Signal<SubscriptionError | undefined>;
|
|
909
919
|
/** `true` while the first page or a `loadMore` page is in flight. */
|
|
910
920
|
isLoading: Signal<boolean>;
|
|
911
921
|
/** Request the next page. A no-op unless `status === "CanLoadMore"`. */
|
|
@@ -920,6 +930,8 @@ interface PaginatedQueryResult<T> {
|
|
|
920
930
|
* @experimental
|
|
921
931
|
*/
|
|
922
932
|
interface InfiniteQueryResult<T> {
|
|
933
|
+
/** The last page subscription error, or `undefined` — see `PaginatedQueryResult.error`. */
|
|
934
|
+
error: Signal<SubscriptionError | undefined>;
|
|
923
935
|
/** Request the next page. A no-op unless `status === "CanLoadMore"`. */
|
|
924
936
|
fetchNextPage: (numberItems?: number) => void;
|
|
925
937
|
/** `true` when the loaded tail reports it can load another page. */
|
|
@@ -1147,6 +1159,13 @@ interface StreamOptions {
|
|
|
1147
1159
|
* `inject(DestroyRef)` — the calling component/service.
|
|
1148
1160
|
*/
|
|
1149
1161
|
destroyRef?: DestroyRef;
|
|
1162
|
+
/**
|
|
1163
|
+
* Opt into resume-on-reconnect for a stream the server declared `durable`.
|
|
1164
|
+
* The chunks already received are kept and the socket re-attaches to the same
|
|
1165
|
+
* run, so a dropped connection mid-generation continues instead of surfacing
|
|
1166
|
+
* `STREAM_DISCONNECTED`. Has no effect on an ephemeral stream.
|
|
1167
|
+
*/
|
|
1168
|
+
durable?: boolean;
|
|
1150
1169
|
/** Forwarded to `client.stream()` — caps the in-flight chunk buffer. */
|
|
1151
1170
|
maxBuffer?: number;
|
|
1152
1171
|
/** Route to a specific shard when the target function is `.shardBy(...)`-partitioned. */
|
package/dist/index.d.ts
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { DestroyRef, Signal, InjectionToken, EnvironmentProviders, Injector } from '@angular/core';
|
|
2
|
-
import { FunctionReference, LunoraClient, SubscriptionError, User, LunoraClientOptions, ConnectionStatus, Preloaded, ArgsOf, ReturnOf, MutationCallOptions, MutatorHandle, ActionCallOptions } from '@lunora/client';
|
|
2
|
+
import { FunctionReference, LunoraClient, SubscriptionError, User, LunoraClientOptions, ConnectionStatus, Preloaded, ArgsOf, ReturnOf, MutationCallOptions, MutatorHandle, SubscriptionErrorCallback, ActionCallOptions } from '@lunora/client';
|
|
3
3
|
export type { ArgsOf, ConnectionStatus, FunctionReference, LunoraClient, LunoraClientOptions, MutationCallOptions, Preloaded, ReturnOf, SubscriptionError, Unsubscribe } from '@lunora/client';
|
|
4
4
|
import { PaginationStatus } from '@lunora/client/pagination';
|
|
5
5
|
import { RateLimitStatus, RateLimitConfig } from '@lunora/ratelimit';
|
|
@@ -797,7 +797,8 @@ interface LiveQueryOptions {
|
|
|
797
797
|
*
|
|
798
798
|
* `args` also accepts a function/`Signal` — `() => ({ channelId: channelId() })`
|
|
799
799
|
* — to make the subscription reactive: an args change tears the old
|
|
800
|
-
* subscription down and opens a fresh one
|
|
800
|
+
* subscription down, resets the signal to `undefined`, and opens a fresh one
|
|
801
|
+
* for the new args, mirroring
|
|
801
802
|
* `@lunora/solid`'s `createQuery`/`@lunora/vue`'s `useQuery`. A static (plain
|
|
802
803
|
* object) `args` resolves once and never re-runs — no `effect()` is created for
|
|
803
804
|
* it, so it carries none of the reactive form's DI requirement.
|
|
@@ -898,6 +899,8 @@ interface PaginatedQueryOptions {
|
|
|
898
899
|
* injection context. Unused for the static `args` form.
|
|
899
900
|
*/
|
|
900
901
|
injector?: Injector;
|
|
902
|
+
/** Called when a page subscription reports an error (also surfaced on the `error` signal). */
|
|
903
|
+
onError?: SubscriptionErrorCallback;
|
|
901
904
|
/** Route to a specific shard when the target function is `.shardBy(...)`-partitioned. */
|
|
902
905
|
shardKey?: string;
|
|
903
906
|
}
|
|
@@ -906,6 +909,13 @@ interface PaginatedQueryOptions {
|
|
|
906
909
|
* @experimental
|
|
907
910
|
*/
|
|
908
911
|
interface PaginatedQueryResult<T> {
|
|
912
|
+
/**
|
|
913
|
+
* The last page subscription error, or `undefined`. A tail page that fails
|
|
914
|
+
* before its first frame is dropped so `status` returns to `"CanLoadMore"`
|
|
915
|
+
* and `loadMore` can retry it; cleared by the next successful frame,
|
|
916
|
+
* `loadMore`, or an args change.
|
|
917
|
+
*/
|
|
918
|
+
error: Signal<SubscriptionError | undefined>;
|
|
909
919
|
/** `true` while the first page or a `loadMore` page is in flight. */
|
|
910
920
|
isLoading: Signal<boolean>;
|
|
911
921
|
/** Request the next page. A no-op unless `status === "CanLoadMore"`. */
|
|
@@ -920,6 +930,8 @@ interface PaginatedQueryResult<T> {
|
|
|
920
930
|
* @experimental
|
|
921
931
|
*/
|
|
922
932
|
interface InfiniteQueryResult<T> {
|
|
933
|
+
/** The last page subscription error, or `undefined` — see `PaginatedQueryResult.error`. */
|
|
934
|
+
error: Signal<SubscriptionError | undefined>;
|
|
923
935
|
/** Request the next page. A no-op unless `status === "CanLoadMore"`. */
|
|
924
936
|
fetchNextPage: (numberItems?: number) => void;
|
|
925
937
|
/** `true` when the loaded tail reports it can load another page. */
|
|
@@ -1147,6 +1159,13 @@ interface StreamOptions {
|
|
|
1147
1159
|
* `inject(DestroyRef)` — the calling component/service.
|
|
1148
1160
|
*/
|
|
1149
1161
|
destroyRef?: DestroyRef;
|
|
1162
|
+
/**
|
|
1163
|
+
* Opt into resume-on-reconnect for a stream the server declared `durable`.
|
|
1164
|
+
* The chunks already received are kept and the socket re-attaches to the same
|
|
1165
|
+
* run, so a dropped connection mid-generation continues instead of surfacing
|
|
1166
|
+
* `STREAM_DISCONNECTED`. Has no effect on an ephemeral stream.
|
|
1167
|
+
*/
|
|
1168
|
+
durable?: boolean;
|
|
1150
1169
|
/** Forwarded to `client.stream()` — caps the in-flight chunk buffer. */
|
|
1151
1170
|
maxBuffer?: number;
|
|
1152
1171
|
/** Route to a specific shard when the target function is `.shardBy(...)`-partitioned. */
|
package/dist/index.mjs
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
import{agent as t}from"./packem_shared/agent-
|
|
1
|
+
import{agent as t}from"./packem_shared/agent-ZUHt9ut7.mjs";import{agentChat as m}from"./packem_shared/agentChat-CSrFbg5h.mjs";import{agentState as f}from"./packem_shared/agentState-DhKNFqhU.mjs";import{agentToolEvents as n}from"./packem_shared/agentToolEvents-DB_9RYy5.mjs";import{auth as i,authGate as u}from"./packem_shared/auth-BgwruT_M.mjs";import{LUNORA_CLIENT as c,injectLunoraClient as s,provideLunora as l}from"./packem_shared/LUNORA_CLIENT-B0toApHY.mjs";import{connectionStatus as L}from"./packem_shared/connectionStatus-UhmuwzMa.mjs";import{flag as v,flags as y}from"./packem_shared/flag-CeGmnEZN.mjs";import{hydratePreloaded as C}from"./packem_shared/hydratePreloaded-C8lNoww0.mjs";import{liveQuery as S}from"./packem_shared/liveQuery-CqnuEq1l.mjs";import{mutate as I}from"./packem_shared/mutate-BZvLQLyu.mjs";import{mutator as P}from"./packem_shared/mutator-DjG1yGk8.mjs";import{infiniteQuery as b,paginatedQuery as j}from"./packem_shared/infiniteQuery-DOlLHKmq.mjs";import{presence as K}from"./packem_shared/presence-xJ3m0qXh.mjs";import{rateLimit as R}from"./packem_shared/rateLimit-B3h9qzh-.mjs";import{runAction as _}from"./packem_shared/runAction-BfiPq4Xz.mjs";import{stream as q}from"./packem_shared/stream-AffQZjVg.mjs";import{subscription as z}from"./packem_shared/subscription-DvndYt66.mjs";import{voiceAgent as D}from"./packem_shared/voiceAgent-CzyUcUKj.mjs";import{SKIP as H}from"@lunora/client/query";export{c as LUNORA_CLIENT,H as SKIP,t as agent,m as agentChat,f as agentState,n as agentToolEvents,i as auth,u as authGate,L as connectionStatus,v as flag,y as flags,C as hydratePreloaded,b as infiniteQuery,s as injectLunoraClient,S as liveQuery,I as mutate,P as mutator,j as paginatedQuery,K as presence,l as provideLunora,R as rateLimit,_ as runAction,q as stream,z as subscription,D as voiceAgent};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{inject as p,DestroyRef as R,computed as o,signal as h}from"@angular/core";import{resolveLunoraClient as v}from"./LUNORA_CLIENT-B0toApHY.mjs";import{subscription as w}from"./subscription-
|
|
1
|
+
import{inject as p,DestroyRef as R,computed as o,signal as h}from"@angular/core";import{resolveLunoraClient as v}from"./LUNORA_CLIENT-B0toApHY.mjs";import{subscription as w}from"./subscription-DvndYt66.mjs";const k=e=>{const{api:i,cancel:r,run:d,runArgs:l,threadKey:n}=e,a=v(e.client),u=e.destroyRef??p(R),{data:f}=w(i.agents.agentThread,{key:n},{client:a,destroyRef:u}),s=o(()=>f()),y=o(()=>s()?.status),c=h(!1),m=async(t,g)=>{c.set(!0);try{await a.mutation(d,{input:t,threadKey:n,...l,...g})}finally{c.set(!1)}};return{cancel:async()=>{const t=s()?.instanceId;r===void 0||t===void 0||await a.mutation(r,{instanceId:t,threadKey:n})},pending:c.asReadonly(),run:m,status:y,thread:s}};export{k as agent};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{inject as K,DestroyRef as M,signal as O,computed as c}from"@angular/core";import{reconcileOptimistic as R,maxSeq as k}from"@lunora/client";import{resolveLunoraClient as F}from"./LUNORA_CLIENT-B0toApHY.mjs";import{stream as L}from"./stream-
|
|
1
|
+
import{inject as K,DestroyRef as M,signal as O,computed as c}from"@angular/core";import{reconcileOptimistic as R,maxSeq as k}from"@lunora/client";import{resolveLunoraClient as F}from"./LUNORA_CLIENT-B0toApHY.mjs";import{stream as L}from"./stream-AffQZjVg.mjs";import{subscription as w}from"./subscription-DvndYt66.mjs";const N={__lunoraRef:""},U=m=>{const{api:d,cancel:g,limit:f,send:x,sendArgs:A,stream:h,threadKey:n}=m,r=F(m.client),l=m.destroyRef??K(M),I=f===void 0?{key:n}:{key:n,limit:f},{data:b}=w(d.agents.agentMessages,I,{client:r,destroyRef:l}),{data:j}=w(d.agents.agentThread,{key:n},{client:r,destroyRef:l}),S=h===void 0?"skip":{key:n},{chunks:q}=L(h??N,S,{client:r,destroyRef:l}),o=O([]);let y=0;const u=c(()=>j()),C=c(()=>u()?.status),i=c(()=>b()??[]),D=c(()=>{const t=i(),e=R(o(),t);if(e.length===0)return t;const s=k(t);return[...t,...e.map((a,p)=>({content:a.content,optimistic:!0,role:"user",seq:s+1+p}))]}),_=c(()=>{const t=i().filter(e=>e.role==="assistant").length;return q().filter(e=>e.kind!=="progress"&&e.threadKey===n&&e.turn>=t).map(e=>e.text).join("")}),E=async(t,e)=>{const s=y;y+=1;const a=k(i());o.set([...R(o(),i()),{content:t,id:s,maxDurableSeqAtSend:a}]);try{await r.mutation(x,{input:t,threadKey:n,...A,...e})}catch(p){throw o.set(o().filter(T=>T.id!==s)),p}},v=async(t,e,s)=>{const a=u()?.instanceId;if(a===void 0)throw new Error(`agentChat: cannot ${t} — no in-flight run (thread has no instanceId)`);await r.mutation(d.agents.agentResolveApproval,{decision:t,instanceId:a,threadKey:n,toolCallId:e,...s===void 0?{}:{note:s}})};return{approve:async(t,e)=>v("approve",t,e),cancel:async()=>{const t=u()?.instanceId;g===void 0||t===void 0||await r.mutation(g,{instanceId:t,threadKey:n})},messages:D,reject:async(t,e)=>v("reject",t,e),send:E,status:C,streamingText:_}};export{U as agentChat};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{computed as c}from"@angular/core";import{subscription as n}from"./subscription-
|
|
1
|
+
import{computed as c}from"@angular/core";import{subscription as n}from"./subscription-DvndYt66.mjs";const d=t=>{const{data:e,error:r}=n(t.api.agents.agentState,{key:t.threadKey},{client:t.client,destroyRef:t.destroyRef}),a=c(()=>e());return{error:r,state:a}};export{d as agentState};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{inject as v,DestroyRef as f,computed as y}from"@angular/core";import{resolveLunoraClient as C}from"./LUNORA_CLIENT-B0toApHY.mjs";import{stream as I}from"./stream-
|
|
1
|
+
import{inject as v,DestroyRef as f,computed as y}from"@angular/core";import{resolveLunoraClient as C}from"./LUNORA_CLIENT-B0toApHY.mjs";import{stream as I}from"./stream-AffQZjVg.mjs";import{subscription as N}from"./subscription-DvndYt66.mjs";const m={__lunoraRef:""},E=[],R=t=>{if(t.role==="assistant"&&t.toolCalls)return t.toolCalls.map(r=>({input:r.input,seq:t.seq,toolCallId:r.id,toolName:r.name,type:"call"}));if(t.role==="tool")return t.status==="awaiting_approval"?[{seq:t.seq,type:"awaiting-approval",...t.toolCallId===void 0?{}:{toolCallId:t.toolCallId},...t.toolName===void 0?{}:{toolName:t.toolName}}]:[{output:t.content,seq:t.seq,type:"result",...t.status==="approved"||t.status==="rejected"?{status:t.status}:{},...t.toolCallId===void 0?{}:{toolCallId:t.toolCallId},...t.toolName===void 0?{}:{toolName:t.toolName}}]},A=t=>{const{api:r,limit:e,stream:n,threadKey:l}=t,a=C(t.client),i=t.destroyRef??v(f),u=e===void 0?{key:l}:{key:l,limit:e},{data:s}=N(r.agents.agentMessages,u,{client:a,destroyRef:i}),p=n===void 0?"skip":{key:l},{chunks:c}=I(n??m,p,{client:a,destroyRef:i});return{events:y(()=>{const d=(s()??E).flatMap(o=>R(o)??[]);for(const o of c())o.kind==="progress"&&o.threadKey===l&&d.push({data:o.data,toolCallId:o.toolCallId,type:"progress"});return d})}};export{A as agentToolEvents};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{computed as R,inject as Q,DestroyRef as V,signal as L}from"@angular/core";import{initialPages as Z,derivePaginationStatus as U,applyLoadMore as v,rebalance as tt}from"@lunora/client/pagination";import{resolveLunoraClient as z}from"./LUNORA_CLIENT-B0toApHY.mjs";import{s as G,a as et}from"./platform-I2VyCEIl.mjs";const nt=/["\\\u0000-\u001F\uD800-\uDFFF]/,J=t=>nt.test(t)?JSON.stringify(t):`"${t}"`,$=t=>{if(t===void 0)return"null";if(typeof t=="bigint")throw new TypeError("stableStringify: cannot use a bigint in a stable JSON cache key — pass it as a string, or use stableWireKey");if(typeof t=="number"){if(Number.isNaN(t))return"nan";if(t===1/0)return"inf";if(t===-1/0)return"-inf";if(Object.is(t,-0))return"-0"}if(typeof t=="string")return J(t);if(t===null||typeof t!="object")return JSON.stringify(t);if(Array.isArray(t)){let r="[";for(let s=0;s<t.length;s++)s>0&&(r+=","),r+=$(t[s]);return r+"]"}const n=Object.getPrototypeOf(t);if(n!==null&&n!==Object.prototype){const r=t.constructor?.name??"value";throw new TypeError(`stableStringify: cannot use a ${r} in a stable JSON cache key — only plain objects, arrays, and JSON primitives are supported (wire-typed values key via stableWireKey)`)}const o=t,i=Object.keys(o).sort();let c="{",e=!0;for(const r of i){const s=o[r];s!==void 0&&(e?e=!1:c+=",",c+=J(r),c+=":",c+=$(s))}return c+"}"},D=t=>{let n="";for(let i=0;i<t.length;i+=32768)n+=String.fromCharCode(...t.subarray(i,i+32768));return btoa(n)},d="$lunora.wire$",W=64,rt="__proto__",ot=t=>{if(t===null||typeof t!="object")return!1;const n=Object.getPrototypeOf(t);return n===null||n===Object.prototype},S=(t,n=0)=>{if(n>W)throw new RangeError(`wire-codec: value nesting exceeds the ${W}-level limit`);if(t===void 0)return[d,"undefined"];if(t===null)return null;const o=typeof t;if(o==="bigint")return[d,"bigint",t.toString()];if(o==="number"){const e=t;return Number.isNaN(e)?[d,"nan"]:e===1/0?[d,"inf"]:e===-1/0?[d,"-inf"]:e}if(o!=="object")return t;if(t instanceof Date)return[d,"date",S(t.getTime(),n+1)];if(t instanceof Error){const e=t,r={};for(const u of Object.keys(e))e[u]!==void 0&&(r[u]=S(e[u],n+1));const s=[d,"error",e.name,e.message,r];return e.cause!==void 0&&s.push(S(e.cause,n+1)),s}if(t instanceof URL)return[d,"url",t.href];if(t instanceof Map)return[d,"map",[...t.entries()].map(([e,r])=>[S(e,n+1),S(r,n+1)])];if(t instanceof Set)return[d,"set",[...t].map(e=>S(e,n+1))];if(t instanceof ArrayBuffer)return[d,"bytes",D(new Uint8Array(t)),"ArrayBuffer"];if(ArrayBuffer.isView(t)){const e=t,r=e.constructor.name,s=new Uint8Array(e.buffer,e.byteOffset,e.byteLength);return r==="Uint8Array"?[d,"bytes",D(s)]:[d,"bytes",D(s),r]}if(Array.isArray(t)){const e=t.map(r=>S(r,n+1));return e.length>0&&e[0]===d?[d,"arr",e]:e}if(!ot(t)){const e=t.constructor?.name??"value";throw new TypeError(`wire-codec: cannot encode a ${e} over the Lunora wire — only plain objects, arrays, and the supported built-ins (Date, Error, URL, Map, Set, ArrayBuffer/typed arrays, bigint) round-trip`)}const i=t,c={};for(const e of Object.keys(i)){const r=i[e];if(r===void 0)continue;const s=S(r,n+1);e===rt?Object.defineProperty(c,e,{configurable:!0,enumerable:!0,value:s,writable:!0}):c[e]=s}return c},st=t=>$(S(t)),K=(t,n)=>`${t}::${st(n)}`,M=(t,n)=>({...n,paginationOpts:{cursor:t.lower,endCursor:t.upper,numItems:t.numItems}}),q=(t,n,o,i)=>{const c=z(o.client),e=o.destroyRef===void 0&&i===void 0,{initialNumItems:r,shardKey:s}=o,u=t.__lunoraRef,p=n==="skip"?{}:n,a=L(Z(r)),E=L([]),B=L("LoadingFirstPage"),A=L(void 0),k=new Map,m=new Map,C=new Set,N=()=>{const b=a().map(f=>{const l=K(u,M(f,p));return m.get(l)});E.set(b);const{status:P}=U(n==="skip",b);B.set(P)},X=(w,b)=>{const P=f=>K(u,M(f,p));for(const f of b){const l=P(f);if(m.has(l))continue;const g=w.find(y=>y.lower===f.lower);if(g){const y=m.get(P(g));y&&m.set(l,y)}}},Y=w=>{const b=new Set;for(const f of w)b.add(K(u,M(f,p)));for(const[f,l]of k)b.has(l.currentKey)||(l.unsub(),k.delete(f),m.delete(l.currentKey));const P=new Set([...k.values()].map(f=>f.currentKey));for(const f of w){const l=M(f,p),g=K(u,l);if(P.has(g))continue;const y={currentKey:g,unsub:void 0};C.add(g);const x=c.subscribe(t,l,O=>{if(m.set(y.currentKey,O),C.delete(y.currentKey),A.set(void 0),N(),C.size===0){const h=a(),j=tt(h,E());j&&(X(h,j),a.set(j),F(j),N())}},{onError:O=>{C.delete(g),A.set(O);const h=a(),j=h.at(-1);h.length>1&&j&&!m.has(g)&&K(u,M(j,p))===g&&(a.set(h.slice(0,-1)),F(a())),N(),o.onError?.(O)},shardKey:s});y.unsub=x,k.set(g,y),P.add(g)}};let I=!1,_=!1;const F=w=>{if(I){_=!0;return}I=!0;try{let b=w;do _=!1,Y(b),b=a();while(_)}finally{I=!1}};n!=="skip"&&G(e)&&F(a()),N();const T=()=>{for(const w of k.values())w.unsub();k.clear(),m.clear()};return i===void 0?(o.destroyRef??Q(V)).onDestroy(T):i(T),{error:A,loadMore:w=>{if(n==="skip")return;const{nextCursor:b,status:P}=U(!1,E());if(P!=="CanLoadMore")return;const f=v(a(),b,w);if(!f)return;const l=a().at(-1),g=f.at(-2);if(l&&g){const y=K(u,M(l,p)),x=K(u,M(g,p)),O=k.get(y);if(O&&y!==x){const h=m.get(y);h&&m.set(x,h),O.unsub(),k.delete(y),m.delete(y)}}A.set(void 0),a.set(f),F(a()),N()},pageResults:E,status:B}},H=(t,n,o)=>{if(typeof n!="function")return q(t,n,o);const i=z(o.client),c=o.destroyRef===void 0,e=o.destroyRef??Q(V),r=L(void 0);return G(c)&&et(n,{destroyRef:e,injector:o.injector},(s,u)=>{const p=[];r.set(q(t,s,{...o,client:i},a=>p.push(a))),u(()=>{for(const a of p)a()})}),{error:R(()=>r()?.error()),loadMore:s=>{r()?.loadMore(s)},pageResults:R(()=>r()?.pageResults()??[]),status:R(()=>r()?.status()??"LoadingFirstPage")}},yt=(t,n,o)=>{const i=H(t,n,o),c=R(()=>i.pageResults().flatMap(r=>r?.page??[])),e=R(()=>{const r=i.status();return r==="LoadingFirstPage"||r==="LoadingMore"});return{error:i.error,isLoading:e,loadMore:i.loadMore,results:c,status:i.status}},dt=(t,n,o)=>{const{initialNumItems:i}=o,c=H(t,n,o),e=R(()=>c.pageResults().flatMap(a=>a?[a.page]:[])),r=R(()=>c.status()==="LoadingFirstPage"),s=R(()=>c.status()==="CanLoadMore"),u=R(()=>c.status()==="LoadingMore"),p=a=>{c.loadMore(a??i)};return{error:c.error,fetchNextPage:p,hasNextPage:s,isFetchingNextPage:u,isLoading:r,pages:e,status:c.status}};export{dt as infiniteQuery,yt as paginatedQuery};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{inject as u,DestroyRef as y,signal as v}from"@angular/core";import{createQuerySubscription as m}from"@lunora/client/query";import{resolveLunoraClient as R}from"./LUNORA_CLIENT-B0toApHY.mjs";import{s as p,a as b}from"./platform-I2VyCEIl.mjs";const g=(c,t,e={})=>{const i=R(e.client),a=e.destroyRef===void 0,s=e.destroyRef??u(y),o=v(void 0),n=(r,f)=>{o.set(void 0);const l=m(i,c,r,{onData:d=>{o.set(d)},onError:e.onError,onReset:()=>{o.set(void 0)}},{shardKey:e.shardKey});f(l)};return p(a)&&(typeof t=="function"?b(t,{destroyRef:s,injector:e.injector},n):n(t,r=>s.onDestroy(r))),o.asReadonly()};export{g as liveQuery};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{inject as I,DestroyRef as h,signal as D}from"@angular/core";import{resolveLunoraClient as S}from"./LUNORA_CLIENT-B0toApHY.mjs";import{s as U,r as C}from"./platform-I2VyCEIl.mjs";const A=()=>{if(typeof crypto<"u"){if(typeof crypto.randomUUID=="function")return crypto.randomUUID();if(typeof crypto.getRandomValues=="function"){const n=crypto.getRandomValues(new Uint8Array(16));return Array.from(n,e=>e.toString(16).padStart(2,"0")).join("")}}throw new Error("randomSessionId: no Web Crypto available — a session id needs crypto.randomUUID or crypto.getRandomValues")},E=1e4,x=(n,e)=>{const s=S(e.client),d=e.destroyRef===void 0,f=e.destroyRef??I(h),{heartbeat:y,listPresent:m,shardKey:i}=e,o=e.intervalMs??E,a=e.sessionId??A(),u=D(void 0);if(!Number.isFinite(o)||o<=0)throw new RangeError(`presence intervalMs must be a positive number, got ${String(o)}`);let c=e.data;const r=()=>{const t={roomId:n,sessionId:a};c!==void 0&&(t.data=c),s.mutation(y,t,{shardKey:i}).catch(()=>{})},p=t=>{c=t,r()};if(U(d)){const t=s.acquireConnectionContext({roomId:n,sessionId:a},{shardKey:i});r();const l=()=>{typeof document<"u"&&document.visibilityState==="visible"&&r()},v=C(d,()=>(typeof document<"u"&&document.addEventListener("visibilitychange",l),setInterval(r,o))),b={roomId:n},g=s.subscribe(m,b,R=>{u.set(R)},{shardKey:i});f.onDestroy(()=>{clearInterval(v),typeof document<"u"&&document.removeEventListener("visibilitychange",l),t(),g()})}return{present:u.asReadonly(),sessionId:a,setData:p}};export{x as presence};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{inject as h,DestroyRef as R,signal as s}from"@angular/core";import{resolveLunoraClient as b}from"./LUNORA_CLIENT-B0toApHY.mjs";const x=(u,n,e={})=>{const d=b(e.client),m=e.destroyRef??h(R),c=s([]),o=s(void 0),t=s("idle");let a=!0,l;const f=()=>{a=!1,l?.()};if(n!=="skip"){t.set("streaming");const i=d.stream(u,n,{durable:e.durable,maxBuffer:e.maxBuffer,shardKey:e.shardKey});l=()=>{i.cancel()},(async()=>{try{for await(const r of i){if(!a)return;c.update(y=>[...y,r])}a&&t.set("complete")}catch(r){if(!a)return;o.set(r instanceof Error?r:new Error(String(r))),t.set("error")}})().catch(()=>{})}return m.onDestroy(f),{cancel:f,chunks:c.asReadonly(),error:o.asReadonly(),status:t.asReadonly()}};export{x as stream};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{inject as m,DestroyRef as R,signal as a}from"@angular/core";import{createQuerySubscription as p}from"@lunora/client/query";import{resolveLunoraClient as b}from"./LUNORA_CLIENT-B0toApHY.mjs";import{s as h,a as j}from"./platform-I2VyCEIl.mjs";const C=(d,n,e={})=>{const f=b(e.client),v=e.destroyRef===void 0,i=e.destroyRef??m(R),l=e.onError,o=a(void 0),r=a(void 0),c=(t,u)=>{if(o.set(void 0),r.set(void 0),t==="skip")return;const y=p(f,d,t,{onData:s=>{o.set(s),r.set(void 0)},onError:s=>{r.set(s),o.set(void 0),l?.(s)},onReset:()=>{o.set(void 0)}},{shardKey:e.shardKey});u(y)};return h(v)&&(typeof n=="function"?j(n,{destroyRef:i,injector:e.injector},c):c(n,t=>i.onDestroy(t))),{data:o.asReadonly(),error:r.asReadonly()}};export{C as subscription};
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@lunora/angular",
|
|
3
|
-
"version": "1.0.0-alpha.
|
|
3
|
+
"version": "1.0.0-alpha.57",
|
|
4
4
|
"description": "Angular reactive adapter for Lunora — signal-based live queries and mutations",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"angular",
|
|
@@ -53,8 +53,8 @@
|
|
|
53
53
|
"access": "public"
|
|
54
54
|
},
|
|
55
55
|
"dependencies": {
|
|
56
|
-
"@lunora/client": "1.0.0-alpha.
|
|
57
|
-
"@lunora/ratelimit": "1.0.0-alpha.
|
|
56
|
+
"@lunora/client": "1.0.0-alpha.73",
|
|
57
|
+
"@lunora/ratelimit": "1.0.0-alpha.37",
|
|
58
58
|
"@visulima/storage-client": "1.0.2"
|
|
59
59
|
},
|
|
60
60
|
"peerDependencies": {
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
import{computed as R,inject as q,DestroyRef as Q,signal as C}from"@angular/core";import{initialPages as Y,derivePaginationStatus as T,applyLoadMore as Z,rebalance as v}from"@lunora/client/pagination";import{resolveLunoraClient as V}from"./LUNORA_CLIENT-B0toApHY.mjs";import{s as z,a as tt}from"./platform-I2VyCEIl.mjs";const et=/["\\\u0000-\u001F\uD800-\uDFFF]/,U=t=>et.test(t)?JSON.stringify(t):`"${t}"`,D=t=>{if(t===void 0)return"null";if(typeof t=="bigint")throw new TypeError("stableStringify: cannot use a bigint in a stable JSON cache key — pass it as a string, or use stableWireKey");if(typeof t=="number"){if(Number.isNaN(t))return"nan";if(t===1/0)return"inf";if(t===-1/0)return"-inf";if(Object.is(t,-0))return"-0"}if(typeof t=="string")return U(t);if(t===null||typeof t!="object")return JSON.stringify(t);if(Array.isArray(t)){let r="[";for(let s=0;s<t.length;s++)s>0&&(r+=","),r+=D(t[s]);return r+"]"}const n=Object.getPrototypeOf(t);if(n!==null&&n!==Object.prototype){const r=t.constructor?.name??"value";throw new TypeError(`stableStringify: cannot use a ${r} in a stable JSON cache key — only plain objects, arrays, and JSON primitives are supported (wire-typed values key via stableWireKey)`)}const o=t,i=Object.keys(o).sort();let c="{",e=!0;for(const r of i){const s=o[r];s!==void 0&&(e?e=!1:c+=",",c+=U(r),c+=":",c+=D(s))}return c+"}"},_=t=>{let n="";for(let i=0;i<t.length;i+=32768)n+=String.fromCharCode(...t.subarray(i,i+32768));return btoa(n)},y="$lunora.wire$",J=64,nt="__proto__",rt=t=>{if(t===null||typeof t!="object")return!1;const n=Object.getPrototypeOf(t);return n===null||n===Object.prototype},S=(t,n=0)=>{if(n>J)throw new RangeError(`wire-codec: value nesting exceeds the ${J}-level limit`);if(t===void 0)return[y,"undefined"];if(t===null)return null;const o=typeof t;if(o==="bigint")return[y,"bigint",t.toString()];if(o==="number"){const e=t;return Number.isNaN(e)?[y,"nan"]:e===1/0?[y,"inf"]:e===-1/0?[y,"-inf"]:e}if(o!=="object")return t;if(t instanceof Date)return[y,"date",S(t.getTime(),n+1)];if(t instanceof Error){const e=t,r={};for(const d of Object.keys(e))e[d]!==void 0&&(r[d]=S(e[d],n+1));const s=[y,"error",e.name,e.message,r];return e.cause!==void 0&&s.push(S(e.cause,n+1)),s}if(t instanceof URL)return[y,"url",t.href];if(t instanceof Map)return[y,"map",[...t.entries()].map(([e,r])=>[S(e,n+1),S(r,n+1)])];if(t instanceof Set)return[y,"set",[...t].map(e=>S(e,n+1))];if(t instanceof ArrayBuffer)return[y,"bytes",_(new Uint8Array(t)),"ArrayBuffer"];if(ArrayBuffer.isView(t)){const e=t,r=e.constructor.name,s=new Uint8Array(e.buffer,e.byteOffset,e.byteLength);return r==="Uint8Array"?[y,"bytes",_(s)]:[y,"bytes",_(s),r]}if(Array.isArray(t)){const e=t.map(r=>S(r,n+1));return e.length>0&&e[0]===y?[y,"arr",e]:e}if(!rt(t)){const e=t.constructor?.name??"value";throw new TypeError(`wire-codec: cannot encode a ${e} over the Lunora wire — only plain objects, arrays, and the supported built-ins (Date, Error, URL, Map, Set, ArrayBuffer/typed arrays, bigint) round-trip`)}const i=t,c={};for(const e of Object.keys(i)){const r=i[e];if(r===void 0)continue;const s=S(r,n+1);e===nt?Object.defineProperty(c,e,{configurable:!0,enumerable:!0,value:s,writable:!0}):c[e]=s}return c},ot=t=>D(S(t)),k=(t,n)=>`${t}::${ot(n)}`,K=(t,n)=>({...n,paginationOpts:{cursor:t.lower,endCursor:t.upper,numItems:t.numItems}}),W=(t,n,o,i)=>{const c=V(o.client),e=o.destroyRef===void 0&&i===void 0,{initialNumItems:r,shardKey:s}=o,d=t.__lunoraRef,m=n==="skip"?{}:n,a=C(Y(r)),N=C([]),$=C("LoadingFirstPage"),h=new Map,w=new Map,M=new Set,O=()=>{const g=a().map(f=>{const l=k(d,K(f,m));return w.get(l)});N.set(g);const{status:P}=T(n==="skip",g);$.set(P)},H=(p,g)=>{const P=f=>k(d,K(f,m));for(const f of g){const l=P(f);if(w.has(l))continue;const b=p.find(u=>u.lower===f.lower);if(b){const u=w.get(P(b));u&&w.set(l,u)}}},X=p=>{const g=new Set;for(const f of p)g.add(k(d,K(f,m)));for(const[f,l]of h)g.has(l.currentKey)||(l.unsub(),h.delete(f),w.delete(l.currentKey));const P=new Set([...h.values()].map(f=>f.currentKey));for(const f of p){const l=K(f,m),b=k(d,l);if(P.has(b))continue;const u={currentKey:b,unsub:void 0};M.add(b);const L=c.subscribe(t,l,E=>{if(w.set(u.currentKey,E),M.delete(u.currentKey),O(),M.size===0){const j=a(),A=v(j,N());A&&(H(j,A),a.set(A),I(A),O())}},{onError:()=>{M.delete(u.currentKey),O()},shardKey:s});u.unsub=L,h.set(b,u),P.add(b)}};let x=!1,F=!1;const I=p=>{if(x){F=!0;return}x=!0;try{let g=p;do F=!1,X(g),g=a();while(F)}finally{x=!1}};n!=="skip"&&z(e)&&I(a()),O();const B=()=>{for(const p of h.values())p.unsub();h.clear(),w.clear()};return i===void 0?(o.destroyRef??q(Q)).onDestroy(B):i(B),{loadMore:p=>{if(n==="skip")return;const{nextCursor:g,status:P}=T(!1,N());if(P!=="CanLoadMore")return;const f=Z(a(),g,p);if(!f)return;const l=a().at(-1),b=f.at(-2);if(l&&b){const u=k(d,K(l,m)),L=k(d,K(b,m)),E=h.get(u);if(E&&u!==L){const j=w.get(u);j&&w.set(L,j),E.unsub(),h.delete(u),w.delete(u)}}a.set(f),I(a()),O()},pageResults:N,status:$}},G=(t,n,o)=>{if(typeof n!="function")return W(t,n,o);const i=V(o.client),c=o.destroyRef===void 0,e=o.destroyRef??q(Q),r=C(void 0);return z(c)&&tt(n,{destroyRef:e,injector:o.injector},(s,d)=>{const m=[];r.set(W(t,s,{...o,client:i},a=>m.push(a))),d(()=>{for(const a of m)a()})}),{loadMore:s=>{r()?.loadMore(s)},pageResults:R(()=>r()?.pageResults()??[]),status:R(()=>r()?.status()??"LoadingFirstPage")}},ut=(t,n,o)=>{const i=G(t,n,o),c=R(()=>i.pageResults().flatMap(r=>r?.page??[]));return{isLoading:R(()=>{const r=i.status();return r==="LoadingFirstPage"||r==="LoadingMore"}),loadMore:i.loadMore,results:c,status:i.status}},yt=(t,n,o)=>{const{initialNumItems:i}=o,c=G(t,n,o),e=R(()=>c.pageResults().flatMap(a=>a?[a.page]:[])),r=R(()=>c.status()==="LoadingFirstPage"),s=R(()=>c.status()==="CanLoadMore"),d=R(()=>c.status()==="LoadingMore");return{fetchNextPage:a=>{c.loadMore(a??i)},hasNextPage:s,isFetchingNextPage:d,isLoading:r,pages:e,status:c.status}};export{yt as infiniteQuery,ut as paginatedQuery};
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
import{inject as y,DestroyRef as d,signal as m}from"@angular/core";import{createQuerySubscription as v}from"@lunora/client/query";import{resolveLunoraClient as R}from"./LUNORA_CLIENT-B0toApHY.mjs";import{s as p,a as b}from"./platform-I2VyCEIl.mjs";const g=(c,r,e={})=>{const i=R(e.client),a=e.destroyRef===void 0,n=e.destroyRef??y(d),t=m(void 0),s=(o,f)=>{const l=v(i,c,o,{onData:u=>{t.set(u)},onError:e.onError,onReset:()=>{t.set(void 0)}},{shardKey:e.shardKey});f(l)};return p(a)&&(typeof r=="function"?b(r,{destroyRef:n,injector:e.injector},s):s(r,o=>n.onDestroy(o))),t.asReadonly()};export{g as liveQuery};
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
import{inject as D,DestroyRef as S,signal as h}from"@angular/core";import{resolveLunoraClient as I}from"./LUNORA_CLIENT-B0toApHY.mjs";import{s as A,r as C}from"./platform-I2VyCEIl.mjs";const U=()=>{if(typeof crypto<"u"){if(typeof crypto.randomUUID=="function")return crypto.randomUUID();if(typeof crypto.getRandomValues=="function"){const n=crypto.getRandomValues(new Uint8Array(16));return Array.from(n,e=>e.toString(16).padStart(2,"0")).join("")}}return Date.now().toString(36)},E=1e4,M=(n,e)=>{const s=I(e.client),d=e.destroyRef===void 0,l=e.destroyRef??D(S),{heartbeat:y,listPresent:m,shardKey:i}=e,r=e.intervalMs??E,a=e.sessionId??U(),u=h(void 0);if(!Number.isFinite(r)||r<=0)throw new RangeError(`presence intervalMs must be a positive number, got ${String(r)}`);let c=e.data;const o=()=>{const t={roomId:n,sessionId:a};c!==void 0&&(t.data=c),s.mutation(y,t,{shardKey:i}).catch(()=>{})},v=t=>{c=t,o()};if(A(d)){const t=s.acquireConnectionContext({roomId:n,sessionId:a},{shardKey:i});o();const f=()=>{typeof document<"u"&&document.visibilityState==="visible"&&o()},p=C(d,()=>(typeof document<"u"&&document.addEventListener("visibilitychange",f),setInterval(o,r))),b={roomId:n},g=s.subscribe(m,b,R=>{u.set(R)},{shardKey:i});l.onDestroy(()=>{clearInterval(p),typeof document<"u"&&document.removeEventListener("visibilitychange",f),t(),g()})}return{present:u.asReadonly(),sessionId:a,setData:v}};export{M as presence};
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
import{inject as h,DestroyRef as R,signal as a}from"@angular/core";import{resolveLunoraClient as k}from"./LUNORA_CLIENT-B0toApHY.mjs";const x=(u,n,r={})=>{const m=k(r.client),y=r.destroyRef??h(R),c=a([]),o=a(void 0),t=a("idle");let s=!0,l;const f=()=>{s=!1,l?.()};if(n!=="skip"){t.set("streaming");const i=m.stream(u,n,{maxBuffer:r.maxBuffer,shardKey:r.shardKey});l=()=>{i.cancel()},(async()=>{try{for await(const e of i){if(!s)return;c.update(d=>[...d,e])}s&&t.set("complete")}catch(e){if(!s)return;o.set(e instanceof Error?e:new Error(String(e))),t.set("error")}})().catch(()=>{})}return y.onDestroy(f),{cancel:f,chunks:c.asReadonly(),error:o.asReadonly(),status:t.asReadonly()}};export{x as stream};
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
import{inject as m,DestroyRef as R,signal as a}from"@angular/core";import{createQuerySubscription as p}from"@lunora/client/query";import{resolveLunoraClient as b}from"./LUNORA_CLIENT-B0toApHY.mjs";import{s as h,a as j}from"./platform-I2VyCEIl.mjs";const C=(d,n,e={})=>{const f=b(e.client),v=e.destroyRef===void 0,i=e.destroyRef??m(R),l=e.onError,o=a(void 0),r=a(void 0),c=(t,u)=>{if(t==="skip"){o.set(void 0),r.set(void 0);return}const y=p(f,d,t,{onData:s=>{o.set(s),r.set(void 0)},onError:s=>{r.set(s),o.set(void 0),l?.(s)},onReset:()=>{o.set(void 0)}},{shardKey:e.shardKey});u(y)};return h(v)&&(typeof n=="function"?j(n,{destroyRef:i,injector:e.injector},c):c(n,t=>i.onDestroy(t))),{data:o.asReadonly(),error:r.asReadonly()}};export{C as subscription};
|