gemi 0.111.0 → 0.112.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/dist/ai/Agent.d.ts +54 -1
- package/dist/ai/Agent.d.ts.map +1 -1
- package/dist/ai/AgentController.d.ts +41 -0
- package/dist/ai/AgentController.d.ts.map +1 -1
- package/dist/ai/client/index.d.ts +1 -1
- package/dist/ai/client/index.d.ts.map +1 -1
- package/dist/ai/contextCompaction.d.ts +247 -0
- package/dist/ai/contextCompaction.d.ts.map +1 -0
- package/dist/ai/contextWindow.d.ts +18 -0
- package/dist/ai/contextWindow.d.ts.map +1 -1
- package/dist/ai/index.d.ts +5 -1
- package/dist/ai/index.d.ts.map +1 -1
- package/dist/ai/index.js +93 -14
- package/dist/ai/index.js.map +16 -10
- package/dist/ai/jobs/AgentJob.d.ts +259 -0
- package/dist/ai/jobs/AgentJob.d.ts.map +1 -0
- package/dist/ai/jobs/AgentJobDeadlineSweep.d.ts +18 -0
- package/dist/ai/jobs/AgentJobDeadlineSweep.d.ts.map +1 -0
- package/dist/ai/jobs/AgentJobStore.d.ts +141 -0
- package/dist/ai/jobs/AgentJobStore.d.ts.map +1 -0
- package/dist/ai/jobs/DatabaseAgentJobStore.d.ts +82 -0
- package/dist/ai/jobs/DatabaseAgentJobStore.d.ts.map +1 -0
- package/dist/ai/jobs/contextBlock.d.ts +31 -0
- package/dist/ai/jobs/contextBlock.d.ts.map +1 -0
- package/dist/ai/jobs/index.d.ts +6 -0
- package/dist/ai/jobs/index.d.ts.map +1 -0
- package/dist/ai/jobs/overlay.d.ts +49 -0
- package/dist/ai/jobs/overlay.d.ts.map +1 -0
- package/dist/ai/providers/request.d.ts.map +1 -1
- package/dist/ai/store/Attachments.d.ts +6 -0
- package/dist/ai/store/Attachments.d.ts.map +1 -1
- package/dist/ai/store/MemoryAgentStore.d.ts +3 -0
- package/dist/ai/store/MemoryAgentStore.d.ts.map +1 -1
- package/dist/ai/types.d.ts +28 -0
- package/dist/ai/types.d.ts.map +1 -1
- package/dist/app/index.js +1 -1
- package/dist/bin/gemi.js +13 -2
- package/dist/bin/gemi.js.map +4 -4
- package/dist/bun/plugin.js +1 -1
- package/dist/bun/preload.js +1 -1
- package/dist/{chunk-30xjcyzh.js → chunk-0z2h35d7.js} +2 -2
- package/dist/{chunk-30xjcyzh.js.map → chunk-0z2h35d7.js.map} +1 -1
- package/dist/{chunk-358sdcx9.js → chunk-15a1mrdv.js} +2 -2
- package/dist/{chunk-358sdcx9.js.map → chunk-15a1mrdv.js.map} +1 -1
- package/dist/{chunk-hf7a51s3.js → chunk-18c3y8m3.js} +2 -2
- package/dist/{chunk-hf7a51s3.js.map → chunk-18c3y8m3.js.map} +1 -1
- package/dist/{chunk-tq85n8zh.js → chunk-1pvkw2pq.js} +2 -2
- package/dist/{chunk-tq85n8zh.js.map → chunk-1pvkw2pq.js.map} +1 -1
- package/dist/{chunk-8afxrmdc.js → chunk-2taa0brj.js} +2 -2
- package/dist/{chunk-8afxrmdc.js.map → chunk-2taa0brj.js.map} +1 -1
- package/dist/{chunk-5cygrbxv.js → chunk-30yg31sz.js} +2 -2
- package/dist/{chunk-5cygrbxv.js.map → chunk-30yg31sz.js.map} +1 -1
- package/dist/{chunk-3y8q8x11.js → chunk-3z9vhjd7.js} +2 -2
- package/dist/{chunk-3y8q8x11.js.map → chunk-3z9vhjd7.js.map} +1 -1
- package/dist/chunk-4sb1484x.js +46 -0
- package/dist/{chunk-h3864a8z.js.map → chunk-4sb1484x.js.map} +13 -4
- package/dist/{chunk-0sjh5v1n.js → chunk-53bek7sp.js} +1 -1
- package/dist/{chunk-xkc7ftnq.js → chunk-57edag57.js} +3 -3
- package/dist/{chunk-xkc7ftnq.js.map → chunk-57edag57.js.map} +1 -1
- package/dist/{chunk-ddr4qvvt.js → chunk-5az0mq4p.js} +3 -3
- package/dist/{chunk-ddr4qvvt.js.map → chunk-5az0mq4p.js.map} +1 -1
- package/dist/{chunk-nsvktvp4.js → chunk-5waxjsvv.js} +2 -2
- package/dist/{chunk-nsvktvp4.js.map → chunk-5waxjsvv.js.map} +1 -1
- package/dist/{chunk-rfcygmf5.js → chunk-6w79zajj.js} +3 -3
- package/dist/{chunk-rfcygmf5.js.map → chunk-6w79zajj.js.map} +1 -1
- package/dist/{chunk-gb37722w.js → chunk-75ptmewf.js} +3 -3
- package/dist/{chunk-gb37722w.js.map → chunk-75ptmewf.js.map} +1 -1
- package/dist/{chunk-pyj7cd9t.js → chunk-851k0b26.js} +2 -2
- package/dist/{chunk-pyj7cd9t.js.map → chunk-851k0b26.js.map} +1 -1
- package/dist/{chunk-m6ystvtk.js → chunk-8reepafh.js} +2 -2
- package/dist/{chunk-m6ystvtk.js.map → chunk-8reepafh.js.map} +1 -1
- package/dist/{chunk-nvv9wej6.js → chunk-9hr0bcfy.js} +3 -3
- package/dist/{chunk-nvv9wej6.js.map → chunk-9hr0bcfy.js.map} +1 -1
- package/dist/{chunk-yqavgpwd.js → chunk-a9q2cr4w.js} +2 -2
- package/dist/{chunk-yqavgpwd.js.map → chunk-a9q2cr4w.js.map} +1 -1
- package/dist/{chunk-cy5qp6mz.js → chunk-amvy4r59.js} +2 -2
- package/dist/{chunk-cy5qp6mz.js.map → chunk-amvy4r59.js.map} +1 -1
- package/dist/{chunk-twnn7r66.js → chunk-b1mk12xg.js} +2 -2
- package/dist/{chunk-twnn7r66.js.map → chunk-b1mk12xg.js.map} +1 -1
- package/dist/{chunk-a6453d9s.js → chunk-b7cqwcbm.js} +2 -2
- package/dist/{chunk-a6453d9s.js.map → chunk-b7cqwcbm.js.map} +1 -1
- package/dist/{chunk-nncz308h.js → chunk-b7qjp7r1.js} +2 -2
- package/dist/{chunk-nncz308h.js.map → chunk-b7qjp7r1.js.map} +1 -1
- package/dist/chunk-beks65me.js +19 -0
- package/dist/{chunk-mb7q7s0a.js.map → chunk-beks65me.js.map} +3 -4
- package/dist/chunk-bf1ets45.js +5 -0
- package/dist/{chunk-11fsn5mr.js.map → chunk-bf1ets45.js.map} +4 -3
- package/dist/{chunk-9rchedr4.js → chunk-bhw7k8vp.js} +2 -2
- package/dist/{chunk-9rchedr4.js.map → chunk-bhw7k8vp.js.map} +1 -1
- package/dist/{chunk-k1vw22t2.js → chunk-ck0v2kzw.js} +2 -2
- package/dist/{chunk-k1vw22t2.js.map → chunk-ck0v2kzw.js.map} +1 -1
- package/dist/{chunk-1bkr5wnt.js → chunk-cptzbdn6.js} +2 -2
- package/dist/{chunk-1bkr5wnt.js.map → chunk-cptzbdn6.js.map} +1 -1
- package/dist/{chunk-6vr7f5fq.js → chunk-csbc1fxa.js} +3 -3
- package/dist/{chunk-6vr7f5fq.js.map → chunk-csbc1fxa.js.map} +1 -1
- package/dist/{chunk-kf71mjxa.js → chunk-d0trs736.js} +3 -3
- package/dist/{chunk-kf71mjxa.js.map → chunk-d0trs736.js.map} +1 -1
- package/dist/{chunk-zhs1r1z0.js → chunk-d8ekyng4.js} +3 -3
- package/dist/{chunk-zhs1r1z0.js.map → chunk-d8ekyng4.js.map} +1 -1
- package/dist/chunk-d9an2nra.js +5 -0
- package/dist/{chunk-hn67spz6.js.map → chunk-d9an2nra.js.map} +1 -1
- package/dist/{chunk-0d9qsmx2.js → chunk-dan79jab.js} +2 -2
- package/dist/{chunk-0d9qsmx2.js.map → chunk-dan79jab.js.map} +1 -1
- package/dist/{chunk-1yx2e0bh.js → chunk-ddad3902.js} +2 -2
- package/dist/{chunk-1yx2e0bh.js.map → chunk-ddad3902.js.map} +1 -1
- package/dist/{chunk-3cg7y62b.js → chunk-dm59ze55.js} +2 -2
- package/dist/{chunk-3cg7y62b.js.map → chunk-dm59ze55.js.map} +1 -1
- package/dist/{chunk-wvsv1jgg.js → chunk-dx7wpz5b.js} +2 -2
- package/dist/{chunk-wvsv1jgg.js.map → chunk-dx7wpz5b.js.map} +1 -1
- package/dist/{chunk-q9s7kwgt.js → chunk-eazqda9z.js} +3 -3
- package/dist/{chunk-q9s7kwgt.js.map → chunk-eazqda9z.js.map} +1 -1
- package/dist/{chunk-td8tha3j.js → chunk-es487acc.js} +1 -1
- package/dist/{chunk-9s851qz8.js → chunk-et3vhkbf.js} +2 -2
- package/dist/{chunk-9s851qz8.js.map → chunk-et3vhkbf.js.map} +1 -1
- package/dist/{chunk-qd2v93y4.js → chunk-f1y8eggf.js} +2 -2
- package/dist/{chunk-qd2v93y4.js.map → chunk-f1y8eggf.js.map} +1 -1
- package/dist/{chunk-1pem26zc.js → chunk-ga7c7tq0.js} +3 -3
- package/dist/{chunk-1pem26zc.js.map → chunk-ga7c7tq0.js.map} +1 -1
- package/dist/{chunk-c098fzvk.js → chunk-gcs9ydjv.js} +2 -2
- package/dist/{chunk-c098fzvk.js.map → chunk-gcs9ydjv.js.map} +1 -1
- package/dist/{chunk-bn5yn731.js → chunk-hfyxvdjj.js} +2 -2
- package/dist/{chunk-bn5yn731.js.map → chunk-hfyxvdjj.js.map} +1 -1
- package/dist/chunk-j0sncgxc.js +14 -0
- package/dist/{chunk-mn5xw79b.js.map → chunk-j0sncgxc.js.map} +6 -5
- package/dist/{chunk-p7r2w4qw.js → chunk-j9jqxv1d.js} +3 -3
- package/dist/{chunk-p7r2w4qw.js.map → chunk-j9jqxv1d.js.map} +1 -1
- package/dist/{chunk-jbrwt3cs.js → chunk-jdtn0zk2.js} +4 -4
- package/dist/{chunk-jbrwt3cs.js.map → chunk-jdtn0zk2.js.map} +1 -1
- package/dist/{chunk-s6jjy4y9.js → chunk-jn59bsww.js} +2 -2
- package/dist/{chunk-s6jjy4y9.js.map → chunk-jn59bsww.js.map} +1 -1
- package/dist/{chunk-he7z7y9j.js → chunk-kk502yk2.js} +2 -2
- package/dist/{chunk-he7z7y9j.js.map → chunk-kk502yk2.js.map} +1 -1
- package/dist/{chunk-wsttx9rg.js → chunk-mrdarm2q.js} +2 -2
- package/dist/{chunk-wsttx9rg.js.map → chunk-mrdarm2q.js.map} +1 -1
- package/dist/chunk-mvtgx1mr.js +4 -0
- package/dist/{chunk-x78jrs4y.js.map → chunk-mvtgx1mr.js.map} +2 -2
- package/dist/{chunk-et4pv1b1.js → chunk-mx9y9mtx.js} +1 -1
- package/dist/chunk-nv7mv51r.js +6 -0
- package/dist/{chunk-tdsfke9q.js.map → chunk-nv7mv51r.js.map} +2 -2
- package/dist/{chunk-cttmy1jp.js → chunk-p2fhtf5r.js} +3 -3
- package/dist/{chunk-cttmy1jp.js.map → chunk-p2fhtf5r.js.map} +1 -1
- package/dist/{chunk-w7jsh3xd.js → chunk-qtbf3w6w.js} +2 -2
- package/dist/{chunk-w7jsh3xd.js.map → chunk-qtbf3w6w.js.map} +1 -1
- package/dist/chunk-qx87cdfg.js +5 -0
- package/dist/chunk-qx87cdfg.js.map +10 -0
- package/dist/{chunk-1kr25rcg.js → chunk-qyp652jz.js} +3 -3
- package/dist/{chunk-1kr25rcg.js.map → chunk-qyp652jz.js.map} +1 -1
- package/dist/{chunk-8b2tw2yp.js → chunk-rend2sbk.js} +1 -1
- package/dist/chunk-rx2shb3t.js +25 -0
- package/dist/chunk-rx2shb3t.js.map +19 -0
- package/dist/{chunk-mwqg079k.js → chunk-ryzcfxq7.js} +2 -2
- package/dist/{chunk-mwqg079k.js.map → chunk-ryzcfxq7.js.map} +1 -1
- package/dist/{chunk-7tx5y712.js → chunk-s9rfgxj5.js} +2 -2
- package/dist/{chunk-7tx5y712.js.map → chunk-s9rfgxj5.js.map} +1 -1
- package/dist/{chunk-1c1d0e60.js → chunk-scbvv2e4.js} +3 -3
- package/dist/{chunk-1c1d0e60.js.map → chunk-scbvv2e4.js.map} +1 -1
- package/dist/chunk-sj8jp4p9.js +24 -0
- package/dist/{chunk-wqvvjd5r.js.map → chunk-sj8jp4p9.js.map} +2 -2
- package/dist/{chunk-pwmgqq7z.js → chunk-teny6xkw.js} +2 -2
- package/dist/{chunk-pwmgqq7z.js.map → chunk-teny6xkw.js.map} +1 -1
- package/dist/{chunk-09ypnhjv.js → chunk-tmrmwthr.js} +2 -2
- package/dist/{chunk-09ypnhjv.js.map → chunk-tmrmwthr.js.map} +1 -1
- package/dist/{chunk-h4sw6nt3.js → chunk-vgdcz7tk.js} +3 -3
- package/dist/{chunk-h4sw6nt3.js.map → chunk-vgdcz7tk.js.map} +1 -1
- package/dist/{chunk-xk930yaw.js → chunk-wexs11yy.js} +2 -2
- package/dist/{chunk-xk930yaw.js.map → chunk-wexs11yy.js.map} +1 -1
- package/dist/{chunk-k1xt2tw7.js → chunk-xs4c2nvz.js} +2 -2
- package/dist/{chunk-k1xt2tw7.js.map → chunk-xs4c2nvz.js.map} +1 -1
- package/dist/{chunk-1va15sfq.js → chunk-xv74rhay.js} +2 -2
- package/dist/{chunk-1va15sfq.js.map → chunk-xv74rhay.js.map} +1 -1
- package/dist/{chunk-sq2wkynk.js → chunk-yv1psptb.js} +2 -2
- package/dist/{chunk-sq2wkynk.js.map → chunk-yv1psptb.js.map} +1 -1
- package/dist/{chunk-tk5q8hkv.js → chunk-zfter1x0.js} +4 -4
- package/dist/{chunk-tk5q8hkv.js.map → chunk-zfter1x0.js.map} +1 -1
- package/dist/client/index.d.ts +2 -0
- package/dist/client/index.d.ts.map +1 -1
- package/dist/client/index.js +214 -1
- package/dist/client/index.js.map +1 -1
- package/dist/client/useSubscription.d.ts +70 -0
- package/dist/client/useSubscription.d.ts.map +1 -0
- package/dist/config/index.js +1 -1
- package/dist/console/run.js +2 -2
- package/dist/console/run.js.map +2 -2
- package/dist/container/index.js +2 -2
- package/dist/container/index.js.map +1 -1
- package/dist/database/index.js +2 -2
- package/dist/database/index.js.map +1 -1
- package/dist/email/index.js +2 -2
- package/dist/email/index.js.map +1 -1
- package/dist/facades/ChangeFeed.d.ts +42 -0
- package/dist/facades/ChangeFeed.d.ts.map +1 -0
- package/dist/facades/index.d.ts +1 -0
- package/dist/facades/index.d.ts.map +1 -1
- package/dist/facades/index.js +2 -2
- package/dist/facades/index.js.map +1 -1
- package/dist/foundation/index.js +2 -2
- package/dist/foundation/index.js.map +1 -1
- package/dist/http/ResourcePolicy.d.ts +141 -0
- package/dist/http/ResourcePolicy.d.ts.map +1 -0
- package/dist/http/errors.d.ts +13 -0
- package/dist/http/errors.d.ts.map +1 -1
- package/dist/http/index.d.ts +2 -1
- package/dist/http/index.d.ts.map +1 -1
- package/dist/http/index.js +2 -2
- package/dist/http/index.js.map +1 -1
- package/dist/i18n/dictionaryRuntime.js +2 -2
- package/dist/i18n/dictionaryRuntime.js.map +1 -1
- package/dist/i18n/index.js +2 -2
- package/dist/i18n/index.js.map +2 -2
- package/dist/kernel/index.js +3 -3
- package/dist/kernel/index.js.map +3 -3
- package/dist/kernel/providers.d.ts.map +1 -1
- package/dist/orm/index.js +2 -2
- package/dist/orm/index.js.map +1 -1
- package/dist/server/index.js +2 -2
- package/dist/server/index.js.map +1 -1
- package/dist/services/change-feed/ChangeFeedDriver.d.ts +94 -0
- package/dist/services/change-feed/ChangeFeedDriver.d.ts.map +1 -0
- package/dist/services/change-feed/ChangeFeedManager.d.ts +166 -0
- package/dist/services/change-feed/ChangeFeedManager.d.ts.map +1 -0
- package/dist/services/change-feed/ChangeFeedServiceProvider.d.ts +11 -0
- package/dist/services/change-feed/ChangeFeedServiceProvider.d.ts.map +1 -0
- package/dist/services/change-feed/DatabaseChangeFeedDriver.d.ts +84 -0
- package/dist/services/change-feed/DatabaseChangeFeedDriver.d.ts.map +1 -0
- package/dist/services/change-feed/MemoryChangeFeedDriver.d.ts +26 -0
- package/dist/services/change-feed/MemoryChangeFeedDriver.d.ts.map +1 -0
- package/dist/services/change-feed/changeFeedDriverContract.d.ts +8 -0
- package/dist/services/change-feed/changeFeedDriverContract.d.ts.map +1 -0
- package/dist/services/change-feed/config.d.ts +42 -0
- package/dist/services/change-feed/config.d.ts.map +1 -0
- package/dist/services/change-feed/cursor.d.ts +17 -0
- package/dist/services/change-feed/cursor.d.ts.map +1 -0
- package/dist/services/change-feed/postgresListen.d.ts +30 -0
- package/dist/services/change-feed/postgresListen.d.ts.map +1 -0
- package/dist/services/change-feed/stream.d.ts +16 -0
- package/dist/services/change-feed/stream.d.ts.map +1 -0
- package/dist/services/change-feed/wire.d.ts +20 -0
- package/dist/services/change-feed/wire.d.ts.map +1 -0
- package/dist/services/index.d.ts +9 -0
- package/dist/services/index.d.ts.map +1 -1
- package/dist/services/index.js +3 -3
- package/dist/services/index.js.map +2 -2
- package/dist/services/queue/work.js +2 -2
- package/dist/services/queue/work.js.map +1 -1
- package/dist/services/router/ViewRouteDispatcher.d.ts +16 -0
- package/dist/services/router/ViewRouteDispatcher.d.ts.map +1 -1
- package/dist/stats/route-table.js +1 -1
- package/dist/support/index.js +2 -2
- package/dist/support/index.js.map +1 -1
- package/dist/vitest/index.js +1 -1
- package/package.json +6 -2
- package/skills/gemi-react-best-practices/rules/controller-authorize-every-tenant-read.md +16 -1
- package/dist/chunk-11fsn5mr.js +0 -5
- package/dist/chunk-h3864a8z.js +0 -17
- package/dist/chunk-hn67spz6.js +0 -5
- package/dist/chunk-mb7q7s0a.js +0 -19
- package/dist/chunk-mn5xw79b.js +0 -9
- package/dist/chunk-tdsfke9q.js +0 -6
- package/dist/chunk-wqvvjd5r.js +0 -24
- package/dist/chunk-x78jrs4y.js +0 -4
- /package/dist/{chunk-0sjh5v1n.js.map → chunk-53bek7sp.js.map} +0 -0
- /package/dist/{chunk-td8tha3j.js.map → chunk-es487acc.js.map} +0 -0
- /package/dist/{chunk-et4pv1b1.js.map → chunk-mx9y9mtx.js.map} +0 -0
- /package/dist/{chunk-8b2tw2yp.js.map → chunk-rend2sbk.js.map} +0 -0
package/dist/client/index.js
CHANGED
|
@@ -954,6 +954,219 @@ function useMutate() {
|
|
|
954
954
|
};
|
|
955
955
|
}
|
|
956
956
|
//#endregion
|
|
957
|
+
//#region client/useSubscription.ts
|
|
958
|
+
var MIN_RETRY_MS = 1e3;
|
|
959
|
+
var MAX_RETRY_MS = 3e4;
|
|
960
|
+
/** The server answered in a way retrying will not change (401, 403, 404). */
|
|
961
|
+
var FatalStatus = class extends Error {
|
|
962
|
+
status;
|
|
963
|
+
constructor(status) {
|
|
964
|
+
super(`The subscription was refused with ${status}.`);
|
|
965
|
+
this.status = status;
|
|
966
|
+
}
|
|
967
|
+
};
|
|
968
|
+
/**
|
|
969
|
+
* Follows a route that answers with `ChangeFeed.stream`, as long as the
|
|
970
|
+
* component is mounted: each change reaches `onChange`, in order, exactly
|
|
971
|
+
* once, across dropped connections and hidden tabs.
|
|
972
|
+
*
|
|
973
|
+
* ```tsx
|
|
974
|
+
* const { status } = useSubscription(
|
|
975
|
+
* "/sites/:siteId/changes",
|
|
976
|
+
* { params: { siteId } },
|
|
977
|
+
* { cursor: site.cursor, onChange: ({ data }) => apply(data), onReset: () => reload() },
|
|
978
|
+
* );
|
|
979
|
+
* ```
|
|
980
|
+
*
|
|
981
|
+
* It reconnects after a drop with backoff (1 s doubling to 30 s, or the
|
|
982
|
+
* server's `Retry-After`), resuming with `Last-Event-ID` from the last event
|
|
983
|
+
* it saw. A `4xx` other than `408` and `429` stops it, with status `closed`.
|
|
984
|
+
* The callbacks may change between renders without reconnecting.
|
|
985
|
+
*/
|
|
986
|
+
function useSubscription(url, options = {}, config = {}) {
|
|
987
|
+
const params = {
|
|
988
|
+
...useParams(),
|
|
989
|
+
...options.params
|
|
990
|
+
};
|
|
991
|
+
const search = new URLSearchParams(Object.entries(options.search ?? {}).filter(([, value]) => value !== null && value !== void 0).map(([key, value]) => [key, String(value)]));
|
|
992
|
+
search.sort();
|
|
993
|
+
const endpoint = `/api${[applyParams$1(String(url), params), search.toString()].filter(Boolean).join("?")}`;
|
|
994
|
+
const enabled = config.enabled !== false;
|
|
995
|
+
const pauseWhenHidden = config.pauseWhenHidden !== false;
|
|
996
|
+
const callbacks = useRef(config);
|
|
997
|
+
useEffect(() => {
|
|
998
|
+
callbacks.current = config;
|
|
999
|
+
});
|
|
1000
|
+
const cursor = useRef(config.cursor ?? null);
|
|
1001
|
+
const [state, setState] = useState({
|
|
1002
|
+
status: enabled ? "connecting" : "closed",
|
|
1003
|
+
cursor: cursor.current,
|
|
1004
|
+
error: null
|
|
1005
|
+
});
|
|
1006
|
+
useEffect(() => {
|
|
1007
|
+
cursor.current = config.cursor ?? null;
|
|
1008
|
+
}, [endpoint, config.cursor]);
|
|
1009
|
+
useEffect(() => {
|
|
1010
|
+
if (!enabled) {
|
|
1011
|
+
setState((s) => ({
|
|
1012
|
+
...s,
|
|
1013
|
+
status: "closed"
|
|
1014
|
+
}));
|
|
1015
|
+
return;
|
|
1016
|
+
}
|
|
1017
|
+
let stopped = false;
|
|
1018
|
+
let request = null;
|
|
1019
|
+
let resume = null;
|
|
1020
|
+
let retryMs = MIN_RETRY_MS;
|
|
1021
|
+
const hidden = () => pauseWhenHidden && typeof document !== "undefined" && document.visibilityState === "hidden";
|
|
1022
|
+
const onVisibilityChange = () => {
|
|
1023
|
+
if (hidden()) request?.abort();
|
|
1024
|
+
else resume?.();
|
|
1025
|
+
};
|
|
1026
|
+
if (typeof document !== "undefined") document.addEventListener("visibilitychange", onVisibilityChange);
|
|
1027
|
+
const wait = (ms) => new Promise((resolve) => {
|
|
1028
|
+
const timer = setTimeout(done, ms);
|
|
1029
|
+
function done() {
|
|
1030
|
+
clearTimeout(timer);
|
|
1031
|
+
resume = null;
|
|
1032
|
+
resolve();
|
|
1033
|
+
}
|
|
1034
|
+
resume = done;
|
|
1035
|
+
});
|
|
1036
|
+
(async () => {
|
|
1037
|
+
while (!stopped) {
|
|
1038
|
+
if (hidden()) {
|
|
1039
|
+
setState((s) => ({
|
|
1040
|
+
...s,
|
|
1041
|
+
status: "paused"
|
|
1042
|
+
}));
|
|
1043
|
+
await new Promise((resolve) => resume = resolve);
|
|
1044
|
+
resume = null;
|
|
1045
|
+
continue;
|
|
1046
|
+
}
|
|
1047
|
+
setState((s) => ({
|
|
1048
|
+
...s,
|
|
1049
|
+
status: "connecting"
|
|
1050
|
+
}));
|
|
1051
|
+
const controller = request = new AbortController();
|
|
1052
|
+
let delay = retryMs;
|
|
1053
|
+
try {
|
|
1054
|
+
const headers = { Accept: "text/event-stream" };
|
|
1055
|
+
if (cursor.current) headers["Last-Event-ID"] = cursor.current;
|
|
1056
|
+
const response = await fetch(endpoint, {
|
|
1057
|
+
headers,
|
|
1058
|
+
signal: controller.signal
|
|
1059
|
+
});
|
|
1060
|
+
if (!response.ok || !response.body) {
|
|
1061
|
+
const status = response.status;
|
|
1062
|
+
if (status >= 400 && status < 500 && status !== 408 && status !== 429) throw new FatalStatus(status);
|
|
1063
|
+
const retryAfter = Number(response.headers.get("Retry-After"));
|
|
1064
|
+
if (Number.isFinite(retryAfter) && retryAfter > 0) delay = retryAfter * 1e3;
|
|
1065
|
+
throw new Error(`The subscription answered ${status}.`);
|
|
1066
|
+
}
|
|
1067
|
+
for await (const { id, message } of readEvents(response.body)) {
|
|
1068
|
+
if (stopped) return;
|
|
1069
|
+
if (id !== void 0) cursor.current = id;
|
|
1070
|
+
if (message.type === "ready") {
|
|
1071
|
+
retryMs = MIN_RETRY_MS;
|
|
1072
|
+
delay = MIN_RETRY_MS;
|
|
1073
|
+
setState({
|
|
1074
|
+
status: "open",
|
|
1075
|
+
cursor: cursor.current,
|
|
1076
|
+
error: null
|
|
1077
|
+
});
|
|
1078
|
+
} else {
|
|
1079
|
+
setState((s) => ({
|
|
1080
|
+
...s,
|
|
1081
|
+
cursor: cursor.current
|
|
1082
|
+
}));
|
|
1083
|
+
if (message.type === "change") callbacks.current.onChange?.(message);
|
|
1084
|
+
else if (message.type === "reset") callbacks.current.onReset?.(message);
|
|
1085
|
+
}
|
|
1086
|
+
}
|
|
1087
|
+
} catch (error) {
|
|
1088
|
+
if (stopped) return;
|
|
1089
|
+
if (error instanceof FatalStatus) {
|
|
1090
|
+
setState((s) => ({
|
|
1091
|
+
...s,
|
|
1092
|
+
status: "closed",
|
|
1093
|
+
error
|
|
1094
|
+
}));
|
|
1095
|
+
return;
|
|
1096
|
+
}
|
|
1097
|
+
if (controller.signal.aborted) continue;
|
|
1098
|
+
setState((s) => ({
|
|
1099
|
+
...s,
|
|
1100
|
+
error
|
|
1101
|
+
}));
|
|
1102
|
+
}
|
|
1103
|
+
if (stopped || controller.signal.aborted) continue;
|
|
1104
|
+
setState((s) => ({
|
|
1105
|
+
...s,
|
|
1106
|
+
status: "connecting"
|
|
1107
|
+
}));
|
|
1108
|
+
await wait(delay);
|
|
1109
|
+
retryMs = Math.min(retryMs * 2, MAX_RETRY_MS);
|
|
1110
|
+
}
|
|
1111
|
+
})();
|
|
1112
|
+
return () => {
|
|
1113
|
+
stopped = true;
|
|
1114
|
+
request?.abort();
|
|
1115
|
+
resume?.();
|
|
1116
|
+
if (typeof document !== "undefined") document.removeEventListener("visibilitychange", onVisibilityChange);
|
|
1117
|
+
};
|
|
1118
|
+
}, [
|
|
1119
|
+
endpoint,
|
|
1120
|
+
enabled,
|
|
1121
|
+
pauseWhenHidden,
|
|
1122
|
+
config.cursor
|
|
1123
|
+
]);
|
|
1124
|
+
return state;
|
|
1125
|
+
}
|
|
1126
|
+
/**
|
|
1127
|
+
* The events of an SSE body: `id` and the JSON `data`. Comments (keepalives)
|
|
1128
|
+
* and events without data are skipped; an event whose data is not JSON is
|
|
1129
|
+
* dropped rather than ending the stream.
|
|
1130
|
+
*/
|
|
1131
|
+
async function* readEvents(body) {
|
|
1132
|
+
const reader = body.getReader();
|
|
1133
|
+
const decoder = new TextDecoder();
|
|
1134
|
+
let buffer = "";
|
|
1135
|
+
try {
|
|
1136
|
+
for (;;) {
|
|
1137
|
+
const { done, value } = await reader.read();
|
|
1138
|
+
if (done) return;
|
|
1139
|
+
buffer = (buffer + decoder.decode(value, { stream: true })).replace(/\r\n?/g, "\n");
|
|
1140
|
+
let boundary = buffer.indexOf("\n\n");
|
|
1141
|
+
while (boundary !== -1) {
|
|
1142
|
+
const block = buffer.slice(0, boundary);
|
|
1143
|
+
buffer = buffer.slice(boundary + 2);
|
|
1144
|
+
boundary = buffer.indexOf("\n\n");
|
|
1145
|
+
let id;
|
|
1146
|
+
const data = [];
|
|
1147
|
+
for (const line of block.split("\n")) {
|
|
1148
|
+
if (line === "" || line.startsWith(":")) continue;
|
|
1149
|
+
const colon = line.indexOf(":");
|
|
1150
|
+
const field = colon === -1 ? line : line.slice(0, colon);
|
|
1151
|
+
let text = colon === -1 ? "" : line.slice(colon + 1);
|
|
1152
|
+
if (text.startsWith(" ")) text = text.slice(1);
|
|
1153
|
+
if (field === "id") id = text;
|
|
1154
|
+
else if (field === "data") data.push(text);
|
|
1155
|
+
}
|
|
1156
|
+
if (data.length === 0) continue;
|
|
1157
|
+
try {
|
|
1158
|
+
yield {
|
|
1159
|
+
id,
|
|
1160
|
+
message: JSON.parse(data.join("\n"))
|
|
1161
|
+
};
|
|
1162
|
+
} catch {}
|
|
1163
|
+
}
|
|
1164
|
+
}
|
|
1165
|
+
} finally {
|
|
1166
|
+
await reader.cancel().catch(() => {});
|
|
1167
|
+
}
|
|
1168
|
+
}
|
|
1169
|
+
//#endregion
|
|
957
1170
|
//#region client/Mutation.tsx
|
|
958
1171
|
var MutationContext = createContext({
|
|
959
1172
|
isPending: false,
|
|
@@ -2767,6 +2980,6 @@ function island(loader, options = {}) {
|
|
|
2767
2980
|
return Island;
|
|
2768
2981
|
}
|
|
2769
2982
|
//#endregion
|
|
2770
|
-
export { CHUNK_RELOAD_MARKER, Form, FormError, FormFieldContainer, Head, Image, Link, OpenGraphImage, QueryError, QueryManagerProvider, Redirect, ValidationErrors, create, createRoot, defineDictionary, init, isAuthenticationError, isChunkLoadError, isCsrfError, isFormError, isHttpError, isNetworkError, isNotFoundError, isPermissionError, isRateLimitError, isRetryableQueryError, isServerError, isValidationError, island, mutationErrorKind, recoverFromChunkLoadError, useAppIdMissmatch, useBreadcrumbs, useDelete, useDictionary, useDomain, useEmailCode, useFeature, useFeatures, useForgotPassword, useFormData, useFormStatus, useFormatter, useInfiniteQuery, useIntendedUrl, useIsNavigationPending, useLocale, useLocation, useMutate, useMutation, useMutationStatus, useNavigate, useNavigationProgress, useParams, usePatch, usePost, usePrefetch, usePut, useQuery, useResetPassword, useRoute, useRouteTransition, useSearchParams, useSignIn, useSignOut, useSignUp, useTheme, useTranslator, useUpload, useUser };
|
|
2983
|
+
export { CHUNK_RELOAD_MARKER, Form, FormError, FormFieldContainer, Head, Image, Link, OpenGraphImage, QueryError, QueryManagerProvider, Redirect, ValidationErrors, create, createRoot, defineDictionary, init, isAuthenticationError, isChunkLoadError, isCsrfError, isFormError, isHttpError, isNetworkError, isNotFoundError, isPermissionError, isRateLimitError, isRetryableQueryError, isServerError, isValidationError, island, mutationErrorKind, recoverFromChunkLoadError, useAppIdMissmatch, useBreadcrumbs, useDelete, useDictionary, useDomain, useEmailCode, useFeature, useFeatures, useForgotPassword, useFormData, useFormStatus, useFormatter, useInfiniteQuery, useIntendedUrl, useIsNavigationPending, useLocale, useLocation, useMutate, useMutation, useMutationStatus, useNavigate, useNavigationProgress, useParams, usePatch, usePost, usePrefetch, usePut, useQuery, useResetPassword, useRoute, useRouteTransition, useSearchParams, useSignIn, useSignOut, useSignUp, useSubscription, useTheme, useTranslator, useUpload, useUser };
|
|
2771
2984
|
|
|
2772
2985
|
//# sourceMappingURL=index.js.map
|