pyric-admin 0.1.0-alpha.17 → 0.1.0-alpha.18
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 +29 -3
- package/dist/messaging/index.d.ts.map +1 -1
- package/dist/messaging/index.js +39 -16
- package/dist/messaging/index.js.map +1 -1
- package/package.json +2 -2
- package/src/messaging/index.ts +70 -18
package/README.md
CHANGED
|
@@ -14,12 +14,38 @@ Pyric adds a development-only resolution layer to a Firebase application. Run th
|
|
|
14
14
|
|
|
15
15
|
The mirrored data services do not connect to a production Firebase project. Local writes cannot delete production data or create Firebase usage charges, and local rules changes do not deploy. Pyric owns the development sandbox and verification workflow. Firebase owns production, with `firebase-tools` or the Firebase Console handling deployment.
|
|
16
16
|
|
|
17
|
-
## Start a
|
|
17
|
+
## Start with a coding agent
|
|
18
|
+
|
|
19
|
+
Install the Pyric plugin:
|
|
20
|
+
|
|
21
|
+
```bash
|
|
22
|
+
npx plugins add davideast/pyric
|
|
23
|
+
```
|
|
24
|
+
|
|
25
|
+
Antigravity CLI and OpenCode use the standalone skill installer:
|
|
26
|
+
|
|
27
|
+
```bash
|
|
28
|
+
# Antigravity CLI
|
|
29
|
+
npx skills add https://github.com/davideast/pyric/tree/main/pyric-plugin/skills/pyric-start --agent antigravity-cli
|
|
30
|
+
|
|
31
|
+
# OpenCode
|
|
32
|
+
npx skills add https://github.com/davideast/pyric/tree/main/pyric-plugin/skills/pyric-start --agent opencode
|
|
33
|
+
```
|
|
34
|
+
|
|
35
|
+
Then ask your agent:
|
|
36
|
+
|
|
37
|
+
```text
|
|
38
|
+
Use the pyric-start skill to set up and run Pyric in this project.
|
|
39
|
+
```
|
|
40
|
+
|
|
41
|
+
The skill chooses the project launcher, starts one local sandbox bridge, opens the application, and confirms that the browser sandbox is connected.
|
|
42
|
+
|
|
43
|
+
## Start from the terminal
|
|
18
44
|
|
|
19
45
|
Create a Vite application with canonical Firebase imports, Firestore rules, and the Pyric development plugin already configured:
|
|
20
46
|
|
|
21
47
|
```bash
|
|
22
|
-
npm create pyric my-app
|
|
48
|
+
npm create pyric@latest my-app
|
|
23
49
|
cd my-app
|
|
24
50
|
npm install
|
|
25
51
|
npm run dev
|
|
@@ -41,7 +67,7 @@ import { defineConfig } from 'vite';
|
|
|
41
67
|
import { pyric } from '@pyric/cli/vite';
|
|
42
68
|
|
|
43
69
|
export default defineConfig({
|
|
44
|
-
plugins: [
|
|
70
|
+
plugins: [pyric()],
|
|
45
71
|
});
|
|
46
72
|
```
|
|
47
73
|
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/messaging/index.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/messaging/index.ts"],"names":[],"mappings":"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"}
|
package/dist/messaging/index.js
CHANGED
|
@@ -27,7 +27,7 @@
|
|
|
27
27
|
* Mirror-owned `FirebaseMessagingError` and `MessagingClientErrorCode`
|
|
28
28
|
* preserve the observable names, codes, and static members used by callers.
|
|
29
29
|
*/
|
|
30
|
-
import { initializeSandbox } from 'pyric/sandbox';
|
|
30
|
+
import { initializeSandbox, isRemoteSandbox } from 'pyric/sandbox';
|
|
31
31
|
import { getMessagingBroker, BrokerSendError, } from 'pyric/messaging/internal';
|
|
32
32
|
import { ADMIN_APP_TARGET, getApp, } from '../app/index.js';
|
|
33
33
|
import { assertAdminAppActive } from '../app/lifecycle.js';
|
|
@@ -62,15 +62,45 @@ function clientErrorInfoFor(fcmErrorCode) {
|
|
|
62
62
|
return ErrorCodes.INVALID_ARGUMENT;
|
|
63
63
|
}
|
|
64
64
|
/** Re-wrap a broker rejection exactly as firebase-admin wraps the wire envelope. */
|
|
65
|
-
function
|
|
65
|
+
function toMessagingError(error) {
|
|
66
66
|
if (error instanceof BrokerSendError) {
|
|
67
|
-
|
|
67
|
+
return new MessagingError(clientErrorInfoFor(error.errorCode), error.envelope.error.message);
|
|
68
|
+
}
|
|
69
|
+
if (error !== null && typeof error === 'object' && 'envelope' in error && error.envelope) {
|
|
70
|
+
const sendErr = new BrokerSendError(error.envelope);
|
|
71
|
+
return new MessagingError(clientErrorInfoFor(sendErr.errorCode), sendErr.envelope.error.message);
|
|
68
72
|
}
|
|
69
|
-
|
|
73
|
+
return error;
|
|
74
|
+
}
|
|
75
|
+
function rethrowWrapped(error) {
|
|
76
|
+
throw toMessagingError(error);
|
|
70
77
|
}
|
|
71
78
|
function invalidArgument(message) {
|
|
72
79
|
return new MessagingError(ErrorCodes.INVALID_ARGUMENT, message);
|
|
73
80
|
}
|
|
81
|
+
async function dispatchSend(sandbox, broker, message, validateOnly) {
|
|
82
|
+
if (isRemoteSandbox(sandbox)) {
|
|
83
|
+
const res = (await sandbox.channel.op({
|
|
84
|
+
method: 'messaging.send',
|
|
85
|
+
message,
|
|
86
|
+
...(validateOnly ? { validateOnly } : {}),
|
|
87
|
+
}));
|
|
88
|
+
return res.name;
|
|
89
|
+
}
|
|
90
|
+
return broker.send(message, { validateOnly }).name;
|
|
91
|
+
}
|
|
92
|
+
async function dispatchTopicOp(sandbox, broker, action, tokens, topic) {
|
|
93
|
+
if (isRemoteSandbox(sandbox)) {
|
|
94
|
+
return (await sandbox.channel.op({
|
|
95
|
+
method: action === 'subscribe' ? 'messaging.subscribeToTopic' : 'messaging.unsubscribeFromTopic',
|
|
96
|
+
tokens,
|
|
97
|
+
topic,
|
|
98
|
+
}));
|
|
99
|
+
}
|
|
100
|
+
return action === 'subscribe'
|
|
101
|
+
? broker.subscribeToTopic(tokens, topic)
|
|
102
|
+
: broker.unsubscribeFromTopic(tokens, topic);
|
|
103
|
+
}
|
|
74
104
|
// ── The sandbox Messaging service ────────────────────────────────────────────
|
|
75
105
|
/**
|
|
76
106
|
* The sandbox `Messaging` service mirror, implementing the send plane over
|
|
@@ -96,7 +126,7 @@ export class Messaging {
|
|
|
96
126
|
*/
|
|
97
127
|
async send(message, dryRun) {
|
|
98
128
|
try {
|
|
99
|
-
return this.
|
|
129
|
+
return await dispatchSend(this.boundApp.sandbox, this.broker, message, dryRun === true);
|
|
100
130
|
}
|
|
101
131
|
catch (error) {
|
|
102
132
|
rethrowWrapped(error);
|
|
@@ -116,15 +146,11 @@ export class Messaging {
|
|
|
116
146
|
const responses = [];
|
|
117
147
|
for (const message of messages) {
|
|
118
148
|
try {
|
|
119
|
-
const name = this.broker
|
|
120
|
-
validateOnly: dryRun === true,
|
|
121
|
-
}).name;
|
|
149
|
+
const name = await dispatchSend(this.boundApp.sandbox, this.broker, message, dryRun === true);
|
|
122
150
|
responses.push({ success: true, messageId: name });
|
|
123
151
|
}
|
|
124
152
|
catch (error) {
|
|
125
|
-
const wrapped = error
|
|
126
|
-
? new MessagingError(clientErrorInfoFor(error.errorCode), error.envelope.error.message)
|
|
127
|
-
: error;
|
|
153
|
+
const wrapped = toMessagingError(error);
|
|
128
154
|
responses.push({
|
|
129
155
|
success: false,
|
|
130
156
|
error: wrapped,
|
|
@@ -153,17 +179,14 @@ export class Messaging {
|
|
|
153
179
|
async unsubscribeFromTopic(tokenOrTokens, topic) {
|
|
154
180
|
return this.manageTopic(tokenOrTokens, topic, 'unsubscribe');
|
|
155
181
|
}
|
|
156
|
-
manageTopic(tokenOrTokens, topic, action) {
|
|
182
|
+
async manageTopic(tokenOrTokens, topic, action) {
|
|
157
183
|
const tokens = Array.isArray(tokenOrTokens) ? tokenOrTokens : [tokenOrTokens];
|
|
158
184
|
if (tokens.length === 0) {
|
|
159
185
|
throw invalidArgument('registration token(s) must be a non-empty string or a non-empty array');
|
|
160
186
|
}
|
|
161
187
|
let outcome;
|
|
162
188
|
try {
|
|
163
|
-
outcome =
|
|
164
|
-
action === 'subscribe'
|
|
165
|
-
? this.broker.subscribeToTopic(tokens, topic)
|
|
166
|
-
: this.broker.unsubscribeFromTopic(tokens, topic);
|
|
189
|
+
outcome = await dispatchTopicOp(this.boundApp.sandbox, this.broker, action, tokens, topic);
|
|
167
190
|
}
|
|
168
191
|
catch (error) {
|
|
169
192
|
rethrowWrapped(error);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/messaging/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA4BG;AAEH,OAAO,EAAE,iBAAiB,EAAE,MAAM,eAAe,CAAC;
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/messaging/index.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "pyric-admin",
|
|
3
|
-
"version": "0.1.0-alpha.
|
|
3
|
+
"version": "0.1.0-alpha.18",
|
|
4
4
|
"license": "Apache-2.0",
|
|
5
5
|
"homepage": "https://pyric.dev",
|
|
6
6
|
"repository": {
|
|
@@ -51,7 +51,7 @@
|
|
|
51
51
|
"typecheck": "bun x tsc -p tsconfig.json --noEmit"
|
|
52
52
|
},
|
|
53
53
|
"dependencies": {
|
|
54
|
-
"pyric": "^0.1.0-alpha.
|
|
54
|
+
"pyric": "^0.1.0-alpha.18"
|
|
55
55
|
},
|
|
56
56
|
"devDependencies": {
|
|
57
57
|
"@types/bun": "latest",
|
package/src/messaging/index.ts
CHANGED
|
@@ -28,7 +28,7 @@
|
|
|
28
28
|
* preserve the observable names, codes, and static members used by callers.
|
|
29
29
|
*/
|
|
30
30
|
|
|
31
|
-
import { initializeSandbox } from 'pyric/sandbox';
|
|
31
|
+
import { initializeSandbox, isRemoteSandbox, type RemoteSandbox, type Sandbox } from 'pyric/sandbox';
|
|
32
32
|
import {
|
|
33
33
|
getMessagingBroker,
|
|
34
34
|
BrokerSendError,
|
|
@@ -116,17 +116,61 @@ function clientErrorInfoFor(fcmErrorCode: string | undefined): ErrorCodeInfo {
|
|
|
116
116
|
}
|
|
117
117
|
|
|
118
118
|
/** Re-wrap a broker rejection exactly as firebase-admin wraps the wire envelope. */
|
|
119
|
-
function
|
|
119
|
+
function toMessagingError(error: unknown): unknown {
|
|
120
120
|
if (error instanceof BrokerSendError) {
|
|
121
|
-
|
|
121
|
+
return new MessagingError(clientErrorInfoFor(error.errorCode), error.envelope.error.message);
|
|
122
|
+
}
|
|
123
|
+
if (error !== null && typeof error === 'object' && 'envelope' in error && (error as any).envelope) {
|
|
124
|
+
const sendErr = new BrokerSendError((error as any).envelope);
|
|
125
|
+
return new MessagingError(clientErrorInfoFor(sendErr.errorCode), sendErr.envelope.error.message);
|
|
122
126
|
}
|
|
123
|
-
|
|
127
|
+
return error;
|
|
128
|
+
}
|
|
129
|
+
|
|
130
|
+
function rethrowWrapped(error: unknown): never {
|
|
131
|
+
throw toMessagingError(error);
|
|
124
132
|
}
|
|
125
133
|
|
|
126
134
|
function invalidArgument(message: string): Error & { readonly code: string } {
|
|
127
135
|
return new MessagingError(ErrorCodes.INVALID_ARGUMENT!, message);
|
|
128
136
|
}
|
|
129
137
|
|
|
138
|
+
async function dispatchSend(
|
|
139
|
+
sandbox: Sandbox,
|
|
140
|
+
broker: MessagingBroker,
|
|
141
|
+
message: BrokerMessage,
|
|
142
|
+
validateOnly: boolean,
|
|
143
|
+
): Promise<string> {
|
|
144
|
+
if (isRemoteSandbox(sandbox)) {
|
|
145
|
+
const res = (await sandbox.channel.op({
|
|
146
|
+
method: 'messaging.send',
|
|
147
|
+
message,
|
|
148
|
+
...(validateOnly ? { validateOnly } : {}),
|
|
149
|
+
})) as { name: string };
|
|
150
|
+
return res.name;
|
|
151
|
+
}
|
|
152
|
+
return broker.send(message, { validateOnly }).name;
|
|
153
|
+
}
|
|
154
|
+
|
|
155
|
+
async function dispatchTopicOp(
|
|
156
|
+
sandbox: Sandbox,
|
|
157
|
+
broker: MessagingBroker,
|
|
158
|
+
action: 'subscribe' | 'unsubscribe',
|
|
159
|
+
tokens: string[],
|
|
160
|
+
topic: string,
|
|
161
|
+
): Promise<TopicManagementOutcome> {
|
|
162
|
+
if (isRemoteSandbox(sandbox)) {
|
|
163
|
+
return (await sandbox.channel.op({
|
|
164
|
+
method: action === 'subscribe' ? 'messaging.subscribeToTopic' : 'messaging.unsubscribeFromTopic',
|
|
165
|
+
tokens,
|
|
166
|
+
topic,
|
|
167
|
+
})) as TopicManagementOutcome;
|
|
168
|
+
}
|
|
169
|
+
return action === 'subscribe'
|
|
170
|
+
? broker.subscribeToTopic(tokens, topic)
|
|
171
|
+
: broker.unsubscribeFromTopic(tokens, topic);
|
|
172
|
+
}
|
|
173
|
+
|
|
130
174
|
// ── The sandbox Messaging service ────────────────────────────────────────────
|
|
131
175
|
|
|
132
176
|
/**
|
|
@@ -156,7 +200,12 @@ export class Messaging {
|
|
|
156
200
|
*/
|
|
157
201
|
async send(message: Message, dryRun?: boolean): Promise<string> {
|
|
158
202
|
try {
|
|
159
|
-
return
|
|
203
|
+
return await dispatchSend(
|
|
204
|
+
this.boundApp.sandbox,
|
|
205
|
+
this.broker,
|
|
206
|
+
message as BrokerMessage,
|
|
207
|
+
dryRun === true,
|
|
208
|
+
);
|
|
160
209
|
} catch (error) {
|
|
161
210
|
rethrowWrapped(error);
|
|
162
211
|
}
|
|
@@ -176,15 +225,15 @@ export class Messaging {
|
|
|
176
225
|
const responses: SendResponse[] = [];
|
|
177
226
|
for (const message of messages) {
|
|
178
227
|
try {
|
|
179
|
-
const name =
|
|
180
|
-
|
|
181
|
-
|
|
228
|
+
const name = await dispatchSend(
|
|
229
|
+
this.boundApp.sandbox,
|
|
230
|
+
this.broker,
|
|
231
|
+
message as BrokerMessage,
|
|
232
|
+
dryRun === true,
|
|
233
|
+
);
|
|
182
234
|
responses.push({ success: true, messageId: name });
|
|
183
235
|
} catch (error) {
|
|
184
|
-
const wrapped =
|
|
185
|
-
error instanceof BrokerSendError
|
|
186
|
-
? new MessagingError(clientErrorInfoFor(error.errorCode), error.envelope.error.message)
|
|
187
|
-
: error;
|
|
236
|
+
const wrapped = toMessagingError(error);
|
|
188
237
|
responses.push({
|
|
189
238
|
success: false,
|
|
190
239
|
error: wrapped as unknown as SendResponse['error'],
|
|
@@ -226,21 +275,24 @@ export class Messaging {
|
|
|
226
275
|
return this.manageTopic(tokenOrTokens, topic, 'unsubscribe');
|
|
227
276
|
}
|
|
228
277
|
|
|
229
|
-
private manageTopic(
|
|
278
|
+
private async manageTopic(
|
|
230
279
|
tokenOrTokens: string | string[],
|
|
231
280
|
topic: string,
|
|
232
281
|
action: 'subscribe' | 'unsubscribe',
|
|
233
|
-
): MessagingTopicManagementResponse {
|
|
282
|
+
): Promise<MessagingTopicManagementResponse> {
|
|
234
283
|
const tokens = Array.isArray(tokenOrTokens) ? tokenOrTokens : [tokenOrTokens];
|
|
235
284
|
if (tokens.length === 0) {
|
|
236
285
|
throw invalidArgument('registration token(s) must be a non-empty string or a non-empty array');
|
|
237
286
|
}
|
|
238
287
|
let outcome: TopicManagementOutcome;
|
|
239
288
|
try {
|
|
240
|
-
outcome =
|
|
241
|
-
|
|
242
|
-
|
|
243
|
-
|
|
289
|
+
outcome = await dispatchTopicOp(
|
|
290
|
+
this.boundApp.sandbox,
|
|
291
|
+
this.broker,
|
|
292
|
+
action,
|
|
293
|
+
tokens,
|
|
294
|
+
topic,
|
|
295
|
+
);
|
|
244
296
|
} catch (error) {
|
|
245
297
|
rethrowWrapped(error);
|
|
246
298
|
}
|