@lunora/platform-cloudflare 1.0.0-alpha.12 → 1.0.0-alpha.13

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/index.mjs CHANGED
@@ -1 +1 @@
1
- import{createShardAlarms as t,createShardDirectory as a,createShardHost as o,createShardKvStore as c,createSocketHost as S}from"./packem_shared/createShardAlarms-e3S0N0av.mjs";import{createShardPlatform as h,createWorkerPlatform as m}from"./packem_shared/createShardPlatform-AsnItVNl.mjs";export{t as createShardAlarms,a as createShardDirectory,o as createShardHost,c as createShardKvStore,h as createShardPlatform,S as createSocketHost,m as createWorkerPlatform};
1
+ import{createShardAlarms as t,createShardDirectory as a,createShardHost as o,createShardKvStore as c,createSocketHost as S}from"./packem_shared/createShardAlarms-D3c8M2o_.mjs";import{createShardPlatform as h,createWorkerPlatform as m}from"./packem_shared/createShardPlatform-CgM_gBah.mjs";export{t as createShardAlarms,a as createShardDirectory,o as createShardHost,c as createShardKvStore,h as createShardPlatform,S as createSocketHost,m as createWorkerPlatform};
@@ -0,0 +1 @@
1
+ import{LunoraError as g}from"@lunora/errors";const S=(t,e,n)=>{const r=t.storage.sql;if(typeof r?.exec!="function")throw new TypeError("storage.sql.exec is not available on this DurableObjectState");return r.exec(e,...n)},m=t=>({delete:()=>typeof t.deleteAlarm=="function"?t.deleteAlarm():Promise.resolve(),get:()=>typeof t.getAlarm=="function"?t.getAlarm():null,set:e=>typeof t.setAlarm=="function"?t.setAlarm(e):Promise.resolve()}),v=(t,e)=>{if(!(!(t instanceof Error)||t===e||t.cause!==void 0))try{Object.defineProperty(t,"cause",{configurable:!0,value:e,writable:!0})}catch{}},T=t=>{const{storage:e}=t,n={get databaseSize(){return t.storage.sql?.databaseSize},exec:(a,...s)=>S(t,a,s)},r=m(e),i=async a=>{if(typeof t.blockConcurrencyWhile=="function"){const s=await t.blockConcurrencyWhile(async()=>{try{return{ok:!0,value:await a()}}catch(c){return{error:c,ok:!1}}});if(!s.ok)throw s.error;return s.value}return a()},o=async a=>{const s=e;if(typeof s?.transaction=="function"){let c;try{return await s.transaction(async()=>{try{return await a()}catch(l){throw c={value:l},l}})}catch(l){throw c?(v(c.value,l),c.value):l}}return a()};return{alarms:r,runSerialized:i,shardKey:t.id?.name,sql:n,transaction:o,waitUntil:typeof t.waitUntil=="function"?a=>{t.waitUntil(a)}:void 0}},W=t=>({delete:async e=>!!await t.delete(e),get:e=>t.get(e),list:e=>{if(typeof t.list!="function")throw new TypeError("storage.list is not available on this DurableObjectStorage");return t.list(e)},put:(e,n)=>t.put(e,n)}),f="lunora-socket:",u=new WeakMap,d=new WeakMap;let h=0;const w=(t,e)=>{const{getTags:n}=t;if(typeof n=="function")try{return n.call(t,e).find(r=>r.startsWith(f))}catch{return}},k=(t,e)=>{const n=w(t,e);if(n!==void 0)return n.slice(f.length);const r=u.get(e);if(r!==void 0)return r;const i=d.get(e);if(i!==void 0)return i;h+=1;const o=`cf-socket-${String(h)}`;return d.set(e,o),o},y=10,p=256,b=1,E=t=>{if(!t||t.length===0)return;const e=y-b;if(t.length>e)throw new g("SOCKET_TAG_BUDGET_EXCEEDED",`${String(t.length)} tags supplied; Cloudflare allows ${String(y)} per socket and 1 is reserved for the host's identity tag — pass at most ${String(e)}.`);const n=t.find(r=>r.length>p);if(n!==void 0)throw new g("SOCKET_TAG_BUDGET_EXCEEDED",`Tag ${JSON.stringify(n)} is ${String(n.length)} characters; Cloudflare allows at most ${String(p)} characters per tag.`)},$=t=>{const e=new WeakSet;let n=0,r;const i=()=>{const o=t.getWebSockets();return(r?.generation!==n||r.length!==o.length)&&(r={generation:n,length:o.length,set:new WeakSet(o)}),r.set};return{accept:(o,a,s)=>{E(s);const c=o,l=crypto.randomUUID();return t.acceptWebSocket(c,[`${f}${l}`,...s??[]]),u.set(c,l),n+=1,a!==void 0&&c.serializeAttachment?.(a),c},getSockets:o=>t.getWebSockets(o),handleFor:o=>{const a=o;if(u.has(a)||w(t,a)!==void 0)return a;if(!e.has(a)){if(i().has(a))return a;e.add(a)}},idFor:o=>k(t,o)}},A=t=>{const e=r=>({fetch:i=>r.fetch(i)}),n=r=>r===void 0?void 0:{locationHint:r};return{get:(r,i)=>e(t.get(r,n(i))),getByName:(r,i)=>e(t.get(t.idFromName(r),n(i))),idForName:r=>t.idFromName(r),jurisdiction:r=>A(t.jurisdiction(r))}};export{m as createShardAlarms,A as createShardDirectory,T as createShardHost,W as createShardKvStore,$ as createSocketHost};
@@ -1 +1 @@
1
- import{CLOUDFLARE_CAPABILITIES as c}from"@lunora/platform";import{createSocketHost as d,createShardHost as n,createShardKvStore as i,createShardDirectory as l}from"./createShardAlarms-e3S0N0av.mjs";const b=e=>{const r=e;return{kv:i(r.storage),shard:n(r),sockets:d(r)}},m=(e,r={})=>{const s=e??{},t=o=>{const a=s[o];if(a==null)throw new Error(`@lunora/platform-cloudflare: no Durable Object namespace bound as "${o}" — add it to wrangler.jsonc's durable_objects.bindings`);return l(a)};return r.scheduler===void 0?{capabilities:c,directory:t}:{capabilities:c,directory:t,scheduler:r.scheduler}};export{b as createShardPlatform,m as createWorkerPlatform};
1
+ import{CLOUDFLARE_CAPABILITIES as c}from"@lunora/platform";import{createSocketHost as d,createShardHost as n,createShardKvStore as i,createShardDirectory as l}from"./createShardAlarms-D3c8M2o_.mjs";const b=e=>{const r=e;return{kv:i(r.storage),shard:n(r),sockets:d(r)}},m=(e,r={})=>{const s=e??{},t=o=>{const a=s[o];if(a==null)throw new Error(`@lunora/platform-cloudflare: no Durable Object namespace bound as "${o}" — add it to wrangler.jsonc's durable_objects.bindings`);return l(a)};return r.scheduler===void 0?{capabilities:c,directory:t}:{capabilities:c,directory:t,scheduler:r.scheduler}};export{b as createShardPlatform,m as createWorkerPlatform};
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@lunora/platform-cloudflare",
3
- "version": "1.0.0-alpha.12",
3
+ "version": "1.0.0-alpha.13",
4
4
  "description": "Cloudflare implementation of the Lunora platform contracts: ShardHost, SocketHost, ShardDirectory, ShardKvStore over Durable Objects",
5
5
  "keywords": [
6
6
  "cloudflare",
@@ -43,8 +43,8 @@
43
43
  "access": "public"
44
44
  },
45
45
  "dependencies": {
46
- "@lunora/errors": "1.0.0-alpha.18",
47
- "@lunora/platform": "1.0.0-alpha.8"
46
+ "@lunora/errors": "1.0.0-alpha.19",
47
+ "@lunora/platform": "1.0.0-alpha.9"
48
48
  },
49
49
  "engines": {
50
50
  "node": "^22.15.0 || >=24.11.0"
@@ -1 +0,0 @@
1
- import{LunoraError as g}from"@lunora/errors";const S=(t,e,r)=>{const a=t.storage.sql;if(typeof a?.exec!="function")throw new TypeError("storage.sql.exec is not available on this DurableObjectState");return a.exec(e,...r)},m=t=>({delete:()=>typeof t.deleteAlarm=="function"?t.deleteAlarm():Promise.resolve(),get:()=>typeof t.getAlarm=="function"?t.getAlarm():null,set:e=>typeof t.setAlarm=="function"?t.setAlarm(e):Promise.resolve()}),v=(t,e)=>{if(!(!(t instanceof Error)||t===e||t.cause!==void 0))try{Object.defineProperty(t,"cause",{configurable:!0,value:e,writable:!0})}catch{}},T=t=>{const{storage:e}=t,r={get databaseSize(){return t.storage.sql?.databaseSize},exec:(n,...s)=>S(t,n,s)},a=m(e),l=async n=>{if(typeof t.blockConcurrencyWhile=="function"){const s=await t.blockConcurrencyWhile(async()=>{try{return{ok:!0,value:await n()}}catch(i){return{error:i,ok:!1}}});if(!s.ok)throw s.error;return s.value}return n()},o=async n=>{const s=e;if(typeof s?.transaction=="function"){let i;try{return await s.transaction(async()=>{try{return await n()}catch(c){throw i={value:c},c}})}catch(c){throw i?(v(i.value,c),i.value):c}}return n()};return{alarms:a,runSerialized:l,shardKey:t.id?.name,sql:r,transaction:o,waitUntil:typeof t.waitUntil=="function"?n=>{t.waitUntil(n)}:void 0}},W=t=>({delete:async e=>!!await t.delete(e),get:e=>t.get(e),list:e=>{if(typeof t.list!="function")throw new TypeError("storage.list is not available on this DurableObjectStorage");return t.list(e)},put:(e,r)=>t.put(e,r)}),f="lunora-socket:",u=new WeakMap,h=new WeakMap;let d=0;const w=(t,e)=>{const{getTags:r}=t;if(typeof r=="function")try{return r.call(t,e).find(a=>a.startsWith(f))}catch{return}},k=(t,e)=>{const r=w(t,e);if(r!==void 0)return r.slice(f.length);const a=u.get(e);if(a!==void 0)return a;const l=h.get(e);if(l!==void 0)return l;d+=1;const o=`cf-socket-${String(d)}`;return h.set(e,o),o},y=10,p=256,b=1,E=t=>{if(!t||t.length===0)return;const e=y-b;if(t.length>e)throw new g("SOCKET_TAG_BUDGET_EXCEEDED",`${String(t.length)} tags supplied; Cloudflare allows ${String(y)} per socket and 1 is reserved for the host's identity tag — pass at most ${String(e)}.`);const r=t.find(a=>a.length>p);if(r!==void 0)throw new g("SOCKET_TAG_BUDGET_EXCEEDED",`Tag ${JSON.stringify(r)} is ${String(r.length)} characters; Cloudflare allows at most ${String(p)} characters per tag.`)},$=t=>{const e=new WeakSet;let r=0,a;const l=()=>{const o=t.getWebSockets();return(a?.generation!==r||a.length!==o.length)&&(a={generation:r,length:o.length,set:new WeakSet(o)}),a.set};return{accept:(o,n,s)=>{E(s);const i=o,c=crypto.randomUUID();return t.acceptWebSocket(i,[`${f}${c}`,...s??[]]),u.set(i,c),r+=1,n!==void 0&&i.serializeAttachment?.(n),i},getSockets:o=>t.getWebSockets(o),handleFor:o=>{const n=o;if(u.has(n)||w(t,n)!==void 0)return n;if(!e.has(n)){if(l().has(n))return n;e.add(n)}},idFor:o=>k(t,o)}},A=t=>{const e=r=>({fetch:a=>r.fetch(a)});return{get:r=>e(t.get(r)),getByName:r=>e(t.get(t.idFromName(r))),idForName:r=>t.idFromName(r),jurisdiction:r=>A(t.jurisdiction(r))}};export{m as createShardAlarms,A as createShardDirectory,T as createShardHost,W as createShardKvStore,$ as createSocketHost};