@portel/photon-core 2.1.1 → 2.2.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/README.md +61 -0
- package/dist/base.d.ts +41 -1
- package/dist/base.d.ts.map +1 -1
- package/dist/base.js +63 -1
- package/dist/base.js.map +1 -1
- package/dist/channels/daemon-broker.d.ts +35 -0
- package/dist/channels/daemon-broker.d.ts.map +1 -0
- package/dist/channels/daemon-broker.js +229 -0
- package/dist/channels/daemon-broker.js.map +1 -0
- package/dist/channels/http-broker.d.ts +45 -0
- package/dist/channels/http-broker.d.ts.map +1 -0
- package/dist/channels/http-broker.js +182 -0
- package/dist/channels/http-broker.js.map +1 -0
- package/dist/channels/index.d.ts +53 -0
- package/dist/channels/index.d.ts.map +1 -0
- package/dist/channels/index.js +67 -0
- package/dist/channels/index.js.map +1 -0
- package/dist/channels/noop-broker.d.ts +21 -0
- package/dist/channels/noop-broker.d.ts.map +1 -0
- package/dist/channels/noop-broker.js +38 -0
- package/dist/channels/noop-broker.js.map +1 -0
- package/dist/channels/redis-broker.d.ts +45 -0
- package/dist/channels/redis-broker.d.ts.map +1 -0
- package/dist/channels/redis-broker.js +214 -0
- package/dist/channels/redis-broker.js.map +1 -0
- package/dist/channels/registry.d.ts +49 -0
- package/dist/channels/registry.d.ts.map +1 -0
- package/dist/channels/registry.js +150 -0
- package/dist/channels/registry.js.map +1 -0
- package/dist/channels/types.d.ts +85 -0
- package/dist/channels/types.d.ts.map +1 -0
- package/dist/channels/types.js +8 -0
- package/dist/channels/types.js.map +1 -0
- package/dist/decorators.d.ts +48 -0
- package/dist/decorators.d.ts.map +1 -0
- package/dist/decorators.js +64 -0
- package/dist/decorators.js.map +1 -0
- package/dist/index.d.ts +2 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +6 -0
- package/dist/index.js.map +1 -1
- package/dist/schema-extractor.d.ts +23 -2
- package/dist/schema-extractor.d.ts.map +1 -1
- package/dist/schema-extractor.js +88 -3
- package/dist/schema-extractor.js.map +1 -1
- package/dist/types.d.ts +18 -0
- package/dist/types.d.ts.map +1 -1
- package/dist/types.js.map +1 -1
- package/package.json +7 -5
- package/src/base.ts +70 -1
- package/src/channels/daemon-broker.ts +271 -0
- package/src/channels/http-broker.ts +221 -0
- package/src/channels/index.ts +96 -0
- package/src/channels/noop-broker.ts +47 -0
- package/src/channels/redis-broker.ts +252 -0
- package/src/channels/registry.ts +170 -0
- package/src/channels/types.ts +95 -0
- package/src/decorators.ts +87 -0
- package/src/index.ts +13 -0
- package/src/schema-extractor.ts +100 -3
- package/src/types.ts +23 -0
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Channel Broker Registry
|
|
3
|
+
*
|
|
4
|
+
* Manages registration and selection of channel brokers.
|
|
5
|
+
* Auto-detects the appropriate broker based on environment configuration.
|
|
6
|
+
*/
|
|
7
|
+
import type { ChannelBroker, BrokerFactory } from './types.js';
|
|
8
|
+
/**
|
|
9
|
+
* Register a broker factory
|
|
10
|
+
* @param type Broker type identifier (e.g., 'redis', 'daemon', 'http')
|
|
11
|
+
* @param factory Factory function that creates the broker
|
|
12
|
+
*/
|
|
13
|
+
export declare function registerBroker(type: string, factory: BrokerFactory): void;
|
|
14
|
+
/**
|
|
15
|
+
* Get a list of registered broker types
|
|
16
|
+
*/
|
|
17
|
+
export declare function getRegisteredBrokers(): string[];
|
|
18
|
+
/**
|
|
19
|
+
* Create a broker instance by type
|
|
20
|
+
* @param type Broker type
|
|
21
|
+
* @param options Type-specific options
|
|
22
|
+
*/
|
|
23
|
+
export declare function createBroker(type: string, options?: Record<string, unknown>): ChannelBroker;
|
|
24
|
+
/**
|
|
25
|
+
* Auto-detect and create the appropriate broker based on environment
|
|
26
|
+
*
|
|
27
|
+
* Detection order:
|
|
28
|
+
* 1. PHOTON_CHANNEL_BROKER env var (explicit override)
|
|
29
|
+
* 2. PHOTON_REDIS_URL → Redis broker
|
|
30
|
+
* 3. PHOTON_CHANNEL_HTTP_URL → HTTP broker
|
|
31
|
+
* 4. PHOTON_CLOUDFLARE_* → Cloudflare broker
|
|
32
|
+
* 5. Default → NoOp broker (silent, no-op)
|
|
33
|
+
*/
|
|
34
|
+
export declare function detectBroker(): ChannelBroker;
|
|
35
|
+
/**
|
|
36
|
+
* Get or create the active broker
|
|
37
|
+
* Uses auto-detection on first call, then caches the instance
|
|
38
|
+
*/
|
|
39
|
+
export declare function getBroker(): ChannelBroker;
|
|
40
|
+
/**
|
|
41
|
+
* Set the active broker explicitly
|
|
42
|
+
* @param broker Broker instance to use
|
|
43
|
+
*/
|
|
44
|
+
export declare function setBroker(broker: ChannelBroker): void;
|
|
45
|
+
/**
|
|
46
|
+
* Clear the active broker (for testing)
|
|
47
|
+
*/
|
|
48
|
+
export declare function clearBroker(): void;
|
|
49
|
+
//# sourceMappingURL=registry.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"registry.d.ts","sourceRoot":"","sources":["../../src/channels/registry.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,EAAE,aAAa,EAAgB,aAAa,EAAE,MAAM,YAAY,CAAC;AAY7E;;;;GAIG;AACH,wBAAgB,cAAc,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,aAAa,GAAG,IAAI,CAEzE;AAED;;GAEG;AACH,wBAAgB,oBAAoB,IAAI,MAAM,EAAE,CAE/C;AAED;;;;GAIG;AACH,wBAAgB,YAAY,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,aAAa,CAQ3F;AAED;;;;;;;;;GASG;AACH,wBAAgB,YAAY,IAAI,aAAa,CA6C5C;AAwCD;;;GAGG;AACH,wBAAgB,SAAS,IAAI,aAAa,CAKzC;AAED;;;GAGG;AACH,wBAAgB,SAAS,CAAC,MAAM,EAAE,aAAa,GAAG,IAAI,CAErD;AAED;;GAEG;AACH,wBAAgB,WAAW,IAAI,IAAI,CAElC"}
|
|
@@ -0,0 +1,150 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Channel Broker Registry
|
|
3
|
+
*
|
|
4
|
+
* Manages registration and selection of channel brokers.
|
|
5
|
+
* Auto-detects the appropriate broker based on environment configuration.
|
|
6
|
+
*/
|
|
7
|
+
/**
|
|
8
|
+
* Registry of available broker factories
|
|
9
|
+
*/
|
|
10
|
+
const brokerFactories = new Map();
|
|
11
|
+
/**
|
|
12
|
+
* Current active broker instance
|
|
13
|
+
*/
|
|
14
|
+
let activeBroker = null;
|
|
15
|
+
/**
|
|
16
|
+
* Register a broker factory
|
|
17
|
+
* @param type Broker type identifier (e.g., 'redis', 'daemon', 'http')
|
|
18
|
+
* @param factory Factory function that creates the broker
|
|
19
|
+
*/
|
|
20
|
+
export function registerBroker(type, factory) {
|
|
21
|
+
brokerFactories.set(type, factory);
|
|
22
|
+
}
|
|
23
|
+
/**
|
|
24
|
+
* Get a list of registered broker types
|
|
25
|
+
*/
|
|
26
|
+
export function getRegisteredBrokers() {
|
|
27
|
+
return Array.from(brokerFactories.keys());
|
|
28
|
+
}
|
|
29
|
+
/**
|
|
30
|
+
* Create a broker instance by type
|
|
31
|
+
* @param type Broker type
|
|
32
|
+
* @param options Type-specific options
|
|
33
|
+
*/
|
|
34
|
+
export function createBroker(type, options) {
|
|
35
|
+
const factory = brokerFactories.get(type);
|
|
36
|
+
if (!factory) {
|
|
37
|
+
throw new Error(`Unknown broker type: ${type}. Available types: ${getRegisteredBrokers().join(', ')}`);
|
|
38
|
+
}
|
|
39
|
+
return factory(options);
|
|
40
|
+
}
|
|
41
|
+
/**
|
|
42
|
+
* Auto-detect and create the appropriate broker based on environment
|
|
43
|
+
*
|
|
44
|
+
* Detection order:
|
|
45
|
+
* 1. PHOTON_CHANNEL_BROKER env var (explicit override)
|
|
46
|
+
* 2. PHOTON_REDIS_URL → Redis broker
|
|
47
|
+
* 3. PHOTON_CHANNEL_HTTP_URL → HTTP broker
|
|
48
|
+
* 4. PHOTON_CLOUDFLARE_* → Cloudflare broker
|
|
49
|
+
* 5. Default → NoOp broker (silent, no-op)
|
|
50
|
+
*/
|
|
51
|
+
export function detectBroker() {
|
|
52
|
+
// Explicit broker type override
|
|
53
|
+
const explicitType = process.env.PHOTON_CHANNEL_BROKER;
|
|
54
|
+
if (explicitType) {
|
|
55
|
+
return createBrokerFromEnv(explicitType);
|
|
56
|
+
}
|
|
57
|
+
// Redis detection
|
|
58
|
+
if (process.env.PHOTON_REDIS_URL || process.env.REDIS_URL) {
|
|
59
|
+
try {
|
|
60
|
+
return createBrokerFromEnv('redis');
|
|
61
|
+
}
|
|
62
|
+
catch {
|
|
63
|
+
// Redis broker not available, continue
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
// HTTP webhook detection
|
|
67
|
+
if (process.env.PHOTON_CHANNEL_HTTP_URL) {
|
|
68
|
+
try {
|
|
69
|
+
return createBrokerFromEnv('http');
|
|
70
|
+
}
|
|
71
|
+
catch {
|
|
72
|
+
// HTTP broker not available, continue
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
// Cloudflare detection
|
|
76
|
+
if (process.env.PHOTON_CLOUDFLARE_ACCOUNT_ID || process.env.CF_ACCOUNT_ID) {
|
|
77
|
+
try {
|
|
78
|
+
return createBrokerFromEnv('cloudflare');
|
|
79
|
+
}
|
|
80
|
+
catch {
|
|
81
|
+
// Cloudflare broker not available, continue
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
// Local daemon detection (for local development)
|
|
85
|
+
if (process.env.PHOTON_DAEMON_ENABLED !== 'false') {
|
|
86
|
+
try {
|
|
87
|
+
return createBrokerFromEnv('daemon');
|
|
88
|
+
}
|
|
89
|
+
catch {
|
|
90
|
+
// Daemon broker not available, continue
|
|
91
|
+
}
|
|
92
|
+
}
|
|
93
|
+
// Fallback to NoOp
|
|
94
|
+
return createBrokerFromEnv('noop');
|
|
95
|
+
}
|
|
96
|
+
/**
|
|
97
|
+
* Create a broker with configuration from environment variables
|
|
98
|
+
*/
|
|
99
|
+
function createBrokerFromEnv(type) {
|
|
100
|
+
const options = {};
|
|
101
|
+
switch (type) {
|
|
102
|
+
case 'redis':
|
|
103
|
+
options.url = process.env.PHOTON_REDIS_URL || process.env.REDIS_URL;
|
|
104
|
+
options.prefix = process.env.PHOTON_REDIS_PREFIX || 'photon:channel:';
|
|
105
|
+
break;
|
|
106
|
+
case 'http':
|
|
107
|
+
options.publishUrl = process.env.PHOTON_CHANNEL_HTTP_URL;
|
|
108
|
+
options.subscribeUrl = process.env.PHOTON_CHANNEL_SSE_URL;
|
|
109
|
+
options.authToken = process.env.PHOTON_CHANNEL_AUTH_TOKEN;
|
|
110
|
+
break;
|
|
111
|
+
case 'cloudflare':
|
|
112
|
+
options.accountId = process.env.PHOTON_CLOUDFLARE_ACCOUNT_ID || process.env.CF_ACCOUNT_ID;
|
|
113
|
+
options.namespaceId = process.env.PHOTON_CLOUDFLARE_DO_NAMESPACE;
|
|
114
|
+
options.apiToken = process.env.PHOTON_CLOUDFLARE_API_TOKEN || process.env.CF_API_TOKEN;
|
|
115
|
+
break;
|
|
116
|
+
case 'daemon':
|
|
117
|
+
options.photonName = process.env.PHOTON_NAME;
|
|
118
|
+
options.socketDir = process.env.PHOTON_SOCKET_DIR;
|
|
119
|
+
break;
|
|
120
|
+
case 'noop':
|
|
121
|
+
default:
|
|
122
|
+
// No configuration needed
|
|
123
|
+
break;
|
|
124
|
+
}
|
|
125
|
+
return createBroker(type, options);
|
|
126
|
+
}
|
|
127
|
+
/**
|
|
128
|
+
* Get or create the active broker
|
|
129
|
+
* Uses auto-detection on first call, then caches the instance
|
|
130
|
+
*/
|
|
131
|
+
export function getBroker() {
|
|
132
|
+
if (!activeBroker) {
|
|
133
|
+
activeBroker = detectBroker();
|
|
134
|
+
}
|
|
135
|
+
return activeBroker;
|
|
136
|
+
}
|
|
137
|
+
/**
|
|
138
|
+
* Set the active broker explicitly
|
|
139
|
+
* @param broker Broker instance to use
|
|
140
|
+
*/
|
|
141
|
+
export function setBroker(broker) {
|
|
142
|
+
activeBroker = broker;
|
|
143
|
+
}
|
|
144
|
+
/**
|
|
145
|
+
* Clear the active broker (for testing)
|
|
146
|
+
*/
|
|
147
|
+
export function clearBroker() {
|
|
148
|
+
activeBroker = null;
|
|
149
|
+
}
|
|
150
|
+
//# sourceMappingURL=registry.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"registry.js","sourceRoot":"","sources":["../../src/channels/registry.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,85 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Channel Broker Types
|
|
3
|
+
*
|
|
4
|
+
* Defines the interface for channel-based pub/sub messaging.
|
|
5
|
+
* Implementations can use different backends (local daemon, Redis, HTTP, etc.)
|
|
6
|
+
*/
|
|
7
|
+
/**
|
|
8
|
+
* Message published to a channel
|
|
9
|
+
*/
|
|
10
|
+
export interface ChannelMessage {
|
|
11
|
+
/** Channel identifier (e.g., 'board:my-board', 'user:123') */
|
|
12
|
+
channel: string;
|
|
13
|
+
/** Event type (e.g., 'update', 'created', 'deleted') */
|
|
14
|
+
event: string;
|
|
15
|
+
/** Message payload */
|
|
16
|
+
data?: unknown;
|
|
17
|
+
/** Timestamp when message was created */
|
|
18
|
+
timestamp?: number;
|
|
19
|
+
/** Source identifier (photon name, instance id, etc.) */
|
|
20
|
+
source?: string;
|
|
21
|
+
}
|
|
22
|
+
/**
|
|
23
|
+
* Handler function for channel messages
|
|
24
|
+
*/
|
|
25
|
+
export type ChannelHandler = (message: ChannelMessage) => void;
|
|
26
|
+
/**
|
|
27
|
+
* Subscription handle returned by subscribe()
|
|
28
|
+
*/
|
|
29
|
+
export interface Subscription {
|
|
30
|
+
/** Unsubscribe from the channel */
|
|
31
|
+
unsubscribe(): void;
|
|
32
|
+
/** Channel name */
|
|
33
|
+
channel: string;
|
|
34
|
+
/** Whether subscription is active */
|
|
35
|
+
active: boolean;
|
|
36
|
+
}
|
|
37
|
+
/**
|
|
38
|
+
* Channel broker interface
|
|
39
|
+
*
|
|
40
|
+
* Implementations provide the actual pub/sub transport mechanism.
|
|
41
|
+
* Examples: Unix socket daemon, Redis, HTTP webhooks, Cloudflare Durable Objects, etc.
|
|
42
|
+
*/
|
|
43
|
+
export interface ChannelBroker {
|
|
44
|
+
/** Broker type identifier */
|
|
45
|
+
readonly type: string;
|
|
46
|
+
/**
|
|
47
|
+
* Publish a message to a channel
|
|
48
|
+
* @param message The message to publish
|
|
49
|
+
* @returns Promise that resolves when message is sent (not necessarily delivered)
|
|
50
|
+
*/
|
|
51
|
+
publish(message: ChannelMessage): Promise<void>;
|
|
52
|
+
/**
|
|
53
|
+
* Subscribe to messages on a channel
|
|
54
|
+
* @param channel Channel to subscribe to (supports wildcards in some implementations)
|
|
55
|
+
* @param handler Function called when messages arrive
|
|
56
|
+
* @returns Subscription handle for unsubscribing
|
|
57
|
+
*/
|
|
58
|
+
subscribe(channel: string, handler: ChannelHandler): Promise<Subscription>;
|
|
59
|
+
/**
|
|
60
|
+
* Check if broker is connected/ready
|
|
61
|
+
*/
|
|
62
|
+
isConnected(): boolean;
|
|
63
|
+
/**
|
|
64
|
+
* Connect to the broker (if applicable)
|
|
65
|
+
*/
|
|
66
|
+
connect?(): Promise<void>;
|
|
67
|
+
/**
|
|
68
|
+
* Disconnect from the broker and cleanup resources
|
|
69
|
+
*/
|
|
70
|
+
disconnect?(): Promise<void>;
|
|
71
|
+
}
|
|
72
|
+
/**
|
|
73
|
+
* Configuration for broker initialization
|
|
74
|
+
*/
|
|
75
|
+
export interface BrokerConfig {
|
|
76
|
+
/** Broker type (e.g., 'daemon', 'redis', 'http', 'cloudflare') */
|
|
77
|
+
type: string;
|
|
78
|
+
/** Type-specific options */
|
|
79
|
+
options?: Record<string, unknown>;
|
|
80
|
+
}
|
|
81
|
+
/**
|
|
82
|
+
* Factory function type for creating brokers
|
|
83
|
+
*/
|
|
84
|
+
export type BrokerFactory = (config?: BrokerConfig['options']) => ChannelBroker;
|
|
85
|
+
//# sourceMappingURL=types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/channels/types.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH;;GAEG;AACH,MAAM,WAAW,cAAc;IAC7B,8DAA8D;IAC9D,OAAO,EAAE,MAAM,CAAC;IAChB,wDAAwD;IACxD,KAAK,EAAE,MAAM,CAAC;IACd,sBAAsB;IACtB,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,yCAAyC;IACzC,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,yDAAyD;IACzD,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED;;GAEG;AACH,MAAM,MAAM,cAAc,GAAG,CAAC,OAAO,EAAE,cAAc,KAAK,IAAI,CAAC;AAE/D;;GAEG;AACH,MAAM,WAAW,YAAY;IAC3B,mCAAmC;IACnC,WAAW,IAAI,IAAI,CAAC;IACpB,mBAAmB;IACnB,OAAO,EAAE,MAAM,CAAC;IAChB,qCAAqC;IACrC,MAAM,EAAE,OAAO,CAAC;CACjB;AAED;;;;;GAKG;AACH,MAAM,WAAW,aAAa;IAC5B,6BAA6B;IAC7B,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IAEtB;;;;OAIG;IACH,OAAO,CAAC,OAAO,EAAE,cAAc,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAEhD;;;;;OAKG;IACH,SAAS,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,cAAc,GAAG,OAAO,CAAC,YAAY,CAAC,CAAC;IAE3E;;OAEG;IACH,WAAW,IAAI,OAAO,CAAC;IAEvB;;OAEG;IACH,OAAO,CAAC,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;IAE1B;;OAEG;IACH,UAAU,CAAC,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;CAC9B;AAED;;GAEG;AACH,MAAM,WAAW,YAAY;IAC3B,kEAAkE;IAClE,IAAI,EAAE,MAAM,CAAC;IACb,4BAA4B;IAC5B,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CACnC;AAED;;GAEG;AACH,MAAM,MAAM,aAAa,GAAG,CAAC,MAAM,CAAC,EAAE,YAAY,CAAC,SAAS,CAAC,KAAK,aAAa,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/channels/types.ts"],"names":[],"mappings":"AAAA;;;;;GAKG"}
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Photon Lock Helpers
|
|
3
|
+
*
|
|
4
|
+
* Runtime support for distributed locking via daemon.
|
|
5
|
+
* The @locked docblock tag and this.withLock() helper both use this.
|
|
6
|
+
*/
|
|
7
|
+
/**
|
|
8
|
+
* Interface for lock management
|
|
9
|
+
* Implemented by daemon client or other providers
|
|
10
|
+
*/
|
|
11
|
+
export interface LockManager {
|
|
12
|
+
acquire(lockName: string, timeout?: number): Promise<boolean>;
|
|
13
|
+
release(lockName: string): Promise<boolean>;
|
|
14
|
+
}
|
|
15
|
+
/**
|
|
16
|
+
* Set the global lock manager (called by runtime)
|
|
17
|
+
* @internal
|
|
18
|
+
*/
|
|
19
|
+
export declare function setLockManager(manager: LockManager | null): void;
|
|
20
|
+
/**
|
|
21
|
+
* Get the current lock manager
|
|
22
|
+
* @internal
|
|
23
|
+
*/
|
|
24
|
+
export declare function getLockManager(): LockManager | null;
|
|
25
|
+
/**
|
|
26
|
+
* Execute a function with a distributed lock
|
|
27
|
+
*
|
|
28
|
+
* Use this for fine-grained locking within a method, or when you
|
|
29
|
+
* need dynamic lock names.
|
|
30
|
+
*
|
|
31
|
+
* @param lockName Name of the lock to acquire
|
|
32
|
+
* @param fn Function to execute while holding the lock
|
|
33
|
+
* @param timeout Optional lock timeout in ms (default 30000)
|
|
34
|
+
*
|
|
35
|
+
* @example
|
|
36
|
+
* ```typescript
|
|
37
|
+
* async moveTask(params: { taskId: string; column: string }) {
|
|
38
|
+
* return this.withLock(`task:${params.taskId}`, async () => {
|
|
39
|
+
* const task = await this.loadTask(params.taskId);
|
|
40
|
+
* task.column = params.column;
|
|
41
|
+
* await this.saveTask(task);
|
|
42
|
+
* return task;
|
|
43
|
+
* });
|
|
44
|
+
* }
|
|
45
|
+
* ```
|
|
46
|
+
*/
|
|
47
|
+
export declare function withLock<T>(lockName: string, fn: () => Promise<T>, timeout?: number): Promise<T>;
|
|
48
|
+
//# sourceMappingURL=decorators.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"decorators.d.ts","sourceRoot":"","sources":["../src/decorators.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAMH;;;GAGG;AACH,MAAM,WAAW,WAAW;IAC1B,OAAO,CAAC,QAAQ,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;IAC9D,OAAO,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;CAC7C;AAID;;;GAGG;AACH,wBAAgB,cAAc,CAAC,OAAO,EAAE,WAAW,GAAG,IAAI,GAAG,IAAI,CAEhE;AAED;;;GAGG;AACH,wBAAgB,cAAc,IAAI,WAAW,GAAG,IAAI,CAEnD;AAMD;;;;;;;;;;;;;;;;;;;;;GAqBG;AACH,wBAAsB,QAAQ,CAAC,CAAC,EAC9B,QAAQ,EAAE,MAAM,EAChB,EAAE,EAAE,MAAM,OAAO,CAAC,CAAC,CAAC,EACpB,OAAO,CAAC,EAAE,MAAM,GACf,OAAO,CAAC,CAAC,CAAC,CAkBZ"}
|
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Photon Lock Helpers
|
|
3
|
+
*
|
|
4
|
+
* Runtime support for distributed locking via daemon.
|
|
5
|
+
* The @locked docblock tag and this.withLock() helper both use this.
|
|
6
|
+
*/
|
|
7
|
+
let _lockManager = null;
|
|
8
|
+
/**
|
|
9
|
+
* Set the global lock manager (called by runtime)
|
|
10
|
+
* @internal
|
|
11
|
+
*/
|
|
12
|
+
export function setLockManager(manager) {
|
|
13
|
+
_lockManager = manager;
|
|
14
|
+
}
|
|
15
|
+
/**
|
|
16
|
+
* Get the current lock manager
|
|
17
|
+
* @internal
|
|
18
|
+
*/
|
|
19
|
+
export function getLockManager() {
|
|
20
|
+
return _lockManager;
|
|
21
|
+
}
|
|
22
|
+
// ============================================================================
|
|
23
|
+
// withLock Helper
|
|
24
|
+
// ============================================================================
|
|
25
|
+
/**
|
|
26
|
+
* Execute a function with a distributed lock
|
|
27
|
+
*
|
|
28
|
+
* Use this for fine-grained locking within a method, or when you
|
|
29
|
+
* need dynamic lock names.
|
|
30
|
+
*
|
|
31
|
+
* @param lockName Name of the lock to acquire
|
|
32
|
+
* @param fn Function to execute while holding the lock
|
|
33
|
+
* @param timeout Optional lock timeout in ms (default 30000)
|
|
34
|
+
*
|
|
35
|
+
* @example
|
|
36
|
+
* ```typescript
|
|
37
|
+
* async moveTask(params: { taskId: string; column: string }) {
|
|
38
|
+
* return this.withLock(`task:${params.taskId}`, async () => {
|
|
39
|
+
* const task = await this.loadTask(params.taskId);
|
|
40
|
+
* task.column = params.column;
|
|
41
|
+
* await this.saveTask(task);
|
|
42
|
+
* return task;
|
|
43
|
+
* });
|
|
44
|
+
* }
|
|
45
|
+
* ```
|
|
46
|
+
*/
|
|
47
|
+
export async function withLock(lockName, fn, timeout) {
|
|
48
|
+
const lockManager = getLockManager();
|
|
49
|
+
if (!lockManager) {
|
|
50
|
+
// No lock manager, run without lock
|
|
51
|
+
return fn();
|
|
52
|
+
}
|
|
53
|
+
const acquired = await lockManager.acquire(lockName, timeout);
|
|
54
|
+
if (!acquired) {
|
|
55
|
+
throw new Error(`Could not acquire lock: ${lockName}`);
|
|
56
|
+
}
|
|
57
|
+
try {
|
|
58
|
+
return await fn();
|
|
59
|
+
}
|
|
60
|
+
finally {
|
|
61
|
+
await lockManager.release(lockName);
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
//# sourceMappingURL=decorators.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"decorators.js","sourceRoot":"","sources":["../src/decorators.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAeH,IAAI,YAAY,GAAuB,IAAI,CAAC;AAE5C;;;GAGG;AACH,MAAM,UAAU,cAAc,CAAC,OAA2B;IACxD,YAAY,GAAG,OAAO,CAAC;AACzB,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,cAAc;IAC5B,OAAO,YAAY,CAAC;AACtB,CAAC;AAED,+EAA+E;AAC/E,kBAAkB;AAClB,+EAA+E;AAE/E;;;;;;;;;;;;;;;;;;;;;GAqBG;AACH,MAAM,CAAC,KAAK,UAAU,QAAQ,CAC5B,QAAgB,EAChB,EAAoB,EACpB,OAAgB;IAEhB,MAAM,WAAW,GAAG,cAAc,EAAE,CAAC;IAErC,IAAI,CAAC,WAAW,EAAE,CAAC;QACjB,oCAAoC;QACpC,OAAO,EAAE,EAAE,CAAC;IACd,CAAC;IAED,MAAM,QAAQ,GAAG,MAAM,WAAW,CAAC,OAAO,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;IAC9D,IAAI,CAAC,QAAQ,EAAE,CAAC;QACd,MAAM,IAAI,KAAK,CAAC,2BAA2B,QAAQ,EAAE,CAAC,CAAC;IACzD,CAAC;IAED,IAAI,CAAC;QACH,OAAO,MAAM,EAAE,EAAE,CAAC;IACpB,CAAC;YAAS,CAAC;QACT,MAAM,WAAW,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC;IACtC,CAAC;AACH,CAAC"}
|
package/dist/index.d.ts
CHANGED
|
@@ -47,4 +47,6 @@ export { io, emit, ask } from './io.js';
|
|
|
47
47
|
export * from './design-system/index.js';
|
|
48
48
|
export * from './rendering/index.js';
|
|
49
49
|
export * from './ucp/index.js';
|
|
50
|
+
export * from './channels/index.js';
|
|
51
|
+
export { withLock, setLockManager, getLockManager, type LockManager, } from './decorators.js';
|
|
50
52
|
//# sourceMappingURL=index.d.ts.map
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
package/dist/index.js
CHANGED
|
@@ -101,4 +101,10 @@ export * from './rendering/index.js';
|
|
|
101
101
|
// ===== UCP (Universal Commerce Protocol) =====
|
|
102
102
|
// Agentic commerce with checkout, identity, orders, and AP2 payments
|
|
103
103
|
export * from './ucp/index.js';
|
|
104
|
+
// ===== CHANNEL-BASED PUB/SUB =====
|
|
105
|
+
// Cross-process messaging with pluggable brokers (daemon, Redis, HTTP, etc.)
|
|
106
|
+
export * from './channels/index.js';
|
|
107
|
+
// ===== LOCK HELPERS =====
|
|
108
|
+
// Runtime support for distributed locking via daemon
|
|
109
|
+
export { withLock, setLockManager, getLockManager, } from './decorators.js';
|
|
104
110
|
//# sourceMappingURL=index.js.map
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAiCG;AAEH,yCAAyC;AACzC,gEAAgE;AAChE,OAAO;AASL,iBAAiB;AACjB,YAAY,EACZ,YAAY,EACZ,eAAe,EACf,UAAU,EACV,WAAW,EACX,UAAU,EACV,UAAU,EACV,SAAS,EACT,WAAW,EACX,gBAAgB,EAChB,YAAY,EACZ,UAAU,EACV,SAAS,EACT,YAAY,EACZ,WAAW,EACX,MAAM;AAEN,WAAW;AACX,gBAAgB,EAChB,mBAAmB,EACnB,YAAY,EACZ,YAAY,EACZ,qBAAqB,EACrB,YAAY,EACZ,gBAAgB;AAEhB,oBAAoB;AACpB,gBAAgB,EAChB,cAAc,EACd,UAAU;AAEV,aAAa;AACb,SAAS;AAET,iBAAiB;AACjB,YAAY,EACZ,UAAU,EACV,UAAU,EACV,aAAa;AAEb,SAAS;AACT,MAAM,EACN,YAAY,EACZ,SAAS,GACV,MAAM,aAAa,CAAC;AAErB,yCAAyC;AACzC,oDAAoD;AACpD,OAAO;AAeL,aAAa;AACb,SAAS,EAET,QAAQ,EACR,oBAAoB,EACpB,YAAY,EACZ,qBAAqB,EACrB,cAAc;AAEd,oBAAoB;AACpB,eAAe,EACf,mBAAmB,EACnB,aAAa,EACb,yBAAyB,EACzB,gBAAgB;AAEhB,oBAAoB;AACpB,iBAAiB,EACjB,uBAAuB,EACvB,mBAAmB,EACnB,mBAAmB,EACnB,eAAe,EACf,kBAAkB,EAClB,cAAc,EACd,kBAAkB,EAClB,qBAAqB,EACrB,WAAW,EACX,cAAc;AAEd,cAAc;AACd,MAAM,EACN,OAAO,EACP,MAAM,EACN,cAAc,EACd,kBAAkB,EAClB,gBAAgB,EAChB,gBAAgB,EAChB,gBAAgB,EAChB,gBAAgB,GACjB,MAAM,aAAa,CAAC;AAErB,sCAAsC;AAEtC,uCAAuC;AACvC,OAAO,EAAE,SAAS,EAAE,MAAM,WAAW,CAAC;AAEtC,wBAAwB;AACxB,OAAO,EAAE,iBAAiB,EAAE,MAAM,yBAAyB,CAAC;AAE5D,oBAAoB;AACpB,OAAO,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAC;AAExD,0CAA0C;AAC1C,OAAO,EACL,WAAW,EACX,SAAS,EACT,SAAS,EACT,iBAAiB,EACjB,eAAe,EACf,eAAe,EACf,kBAAkB,GAEnB,MAAM,oBAAoB,CAAC;AAE5B,QAAQ;AACR,cAAc,YAAY,CAAC;AAE3B,8CAA8C;AAC9C,OAAO;AACL,cAAc;AACd,UAAU,EACV,WAAW,EACX,iBAAiB,EACjB,UAAU,EACV,WAAW;AAEX,sBAAsB;AACtB,wBAAwB,EACxB,gBAAgB;AAEhB,WAAW;AACX,gBAAgB;AAEhB,iBAAiB;AACjB,WAAW;AAEX,qBAAqB;AACrB,uBAAuB,EACvB,eAAe;AAEf,UAAU;AACV,eAAe;AAmDf,uBAAuB;AACvB,YAAY,EACZ,eAAe,EACf,aAAa,EACb,UAAU,EACV,aAAa,GAQd,MAAM,gBAAgB,CAAC;AAExB,8BAA8B;AAC9B,OAAO,EACL,QAAQ,EACR,QAAQ,EACR,gBAAgB,EAChB,wBAAwB,EACxB,aAAa,EACb,oBAAoB,EACpB,QAAQ,EACR,UAAU,EACV,SAAS,EACT,WAAW,EAGX,iBAAiB,IAAI,yBAAyB,GAM/C,MAAM,eAAe,CAAC;AAEvB,iBAAiB;AACjB,OAAO,EAKL,cAAc,EACd,mBAAmB,EACnB,iBAAiB,EACjB,cAAc,EACd,cAAc,EAEd,iBAAiB,GAClB,MAAM,cAAc,CAAC;AAEtB,kBAAkB;AAClB,OAAO,EACL,aAAa,EACb,WAAW,GACZ,MAAM,sBAAsB,CAAC;AAE9B,gBAAgB;AAChB,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,GAAG,EAAE,MAAM,SAAS,CAAC;AAExC,4CAA4C;AAC5C,qCAAqC;AACrC,cAAc,0BAA0B,CAAC;AAEzC,iDAAiD;AACjD,cAAc,sBAAsB,CAAC;AAErC,gDAAgD;AAChD,qEAAqE;AACrE,cAAc,gBAAgB,CAAC;AAE/B,oCAAoC;AACpC,6EAA6E;AAC7E,cAAc,qBAAqB,CAAC;AAEpC,2BAA2B;AAC3B,qDAAqD;AACrD,OAAO,EACL,QAAQ,EACR,cAAc,EACd,cAAc,GAEf,MAAM,iBAAiB,CAAC"}
|
|
@@ -87,7 +87,7 @@ export declare class SchemaExtractor {
|
|
|
87
87
|
/**
|
|
88
88
|
* Extract parameter constraints from JSDoc @param tags
|
|
89
89
|
* Supports inline tags: {@min}, {@max}, {@pattern}, {@format}, {@default}, {@unique},
|
|
90
|
-
* {@example}, {@multipleOf}, {@deprecated}, {@readOnly}, {@writeOnly}
|
|
90
|
+
* {@example}, {@multipleOf}, {@deprecated}, {@readOnly}, {@writeOnly}, {@accept}
|
|
91
91
|
*/
|
|
92
92
|
private extractParamConstraints;
|
|
93
93
|
/**
|
|
@@ -115,6 +115,26 @@ export declare class SchemaExtractor {
|
|
|
115
115
|
* Indicates this method should auto-execute when selected (idempotent, no required params)
|
|
116
116
|
*/
|
|
117
117
|
private hasAutorunTag;
|
|
118
|
+
/**
|
|
119
|
+
* Extract webhook configuration from @webhook tag or handle* prefix
|
|
120
|
+
* - @webhook → use method name as path
|
|
121
|
+
* - @webhook stripe → custom path "stripe"
|
|
122
|
+
* - handle* prefix → auto-detected as webhook
|
|
123
|
+
*/
|
|
124
|
+
private extractWebhook;
|
|
125
|
+
/**
|
|
126
|
+
* Extract scheduled cron expression from @scheduled, @cron tag, or scheduled* prefix
|
|
127
|
+
* - @scheduled 0 0 * * * → cron expression
|
|
128
|
+
* - @cron 0 0 * * * → cron expression
|
|
129
|
+
* - scheduled* prefix requires @cron tag for the expression
|
|
130
|
+
*/
|
|
131
|
+
private extractScheduled;
|
|
132
|
+
/**
|
|
133
|
+
* Extract lock configuration from @locked tag
|
|
134
|
+
* - @locked → use method name as lock
|
|
135
|
+
* - @locked board:write → custom lock name
|
|
136
|
+
*/
|
|
137
|
+
private extractLocked;
|
|
118
138
|
/**
|
|
119
139
|
* Extract URI pattern from @Static tag
|
|
120
140
|
* Example: @Static github://repos/{owner}/{repo}/readme
|
|
@@ -142,10 +162,11 @@ export declare class SchemaExtractor {
|
|
|
142
162
|
*/
|
|
143
163
|
private extractButtonLabel;
|
|
144
164
|
/**
|
|
145
|
-
* Extract icon from @icon tag
|
|
165
|
+
* Extract icon from @icon tag (standalone, not inside layout hints)
|
|
146
166
|
* Example: @icon calculator
|
|
147
167
|
* Example: @icon 🧮
|
|
148
168
|
* Example: @icon mdi:calculator
|
|
169
|
+
* Note: Does NOT match @icon inside layout hints like {@icon fieldname}
|
|
149
170
|
*/
|
|
150
171
|
private extractIcon;
|
|
151
172
|
/**
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"schema-extractor.d.ts","sourceRoot":"","sources":["../src/schema-extractor.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAIH,OAAO,EAAE,eAAe,EAAE,gBAAgB,EAAE,YAAY,EAAE,UAAU,EAA2B,aAAa,EAAE,gBAAgB,EAAE,iBAAiB,EAAE,YAAY,EAAuC,MAAM,YAAY,CAAC;AAEzN,MAAM,WAAW,iBAAiB;IAChC,KAAK,EAAE,eAAe,EAAE,CAAC;IACzB,SAAS,EAAE,YAAY,EAAE,CAAC;IAC1B,OAAO,EAAE,UAAU,EAAE,CAAC;CACvB;AAED;;GAEG;AACH,qBAAa,eAAe;IAC1B;;OAEG;IACG,eAAe,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,eAAe,EAAE,CAAC;IAUnE;;OAEG;IACH,oBAAoB,CAAC,MAAM,EAAE,MAAM,GAAG,iBAAiB;
|
|
1
|
+
{"version":3,"file":"schema-extractor.d.ts","sourceRoot":"","sources":["../src/schema-extractor.ts"],"names":[],"mappings":"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"}
|