@robono/server 0.16.0 → 0.17.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/CHANGELOG.md CHANGED
@@ -1,5 +1,10 @@
1
1
  # Changelog
2
2
 
3
+ ## 0.17.0 — 2026-11-03
4
+
5
+ - Add optional photo/video screening for connected networks and return attachment screening status without holding server requests open.
6
+
7
+
3
8
  ## 0.16.0 — 2026-11-03
4
9
 
5
10
  Add createRobonoMessengerServer for one authenticated messaging/media route, plus optional signed-event notification delivery using customer Apple/Google credentials and a durable private PostgreSQL queue. Announce supported group controls; keep actor identity server-verified and recheck customer permissions on search results. Include NOTIFICATIONS.md and the notification schema.
package/README.md CHANGED
@@ -373,3 +373,10 @@ synchronizing messages, but do not show a banner, play a sound or send a push wh
373
373
  this flag is true. Its value is refreshed on webhook retries. Do not treat mute as
374
374
  loss of membership or stop delivery. The host owns OS push notifications and must
375
375
  honor this field in its notification sender.
376
+
377
+ ## Optional photo and video screening
378
+
379
+ Connected networks can use Robono-hosted Amazon screening with their existing
380
+ Processing API key, including apps with their own storage. See [screening setup](https://robono.com/docs#screening)
381
+ for the private-upload flow, prices, spending controls and pending-result handling.
382
+ This addition is not in server 0.16.0; update to the screening release before use.
package/SBOM.spdx.json CHANGED
@@ -2,22 +2,22 @@
2
2
  "spdxVersion": "SPDX-2.3",
3
3
  "dataLicense": "CC0-1.0",
4
4
  "SPDXID": "SPDXRef-DOCUMENT",
5
- "name": "@robono/server@0.16.0",
6
- "documentNamespace": "http://spdx.org/spdxdocs/@robono%2fserver-0.16.0-***",
5
+ "name": "@robono/server@0.17.0",
6
+ "documentNamespace": "http://spdx.org/spdxdocs/@robono%2fserver-0.17.0-***",
7
7
  "creationInfo": {
8
- "created": "2026-11-03T12:40:11.342Z",
8
+ "created": "2026-11-03T15:35:51.400Z",
9
9
  "creators": [
10
10
  "Tool: npm/cli-11.6.2"
11
11
  ]
12
12
  },
13
13
  "documentDescribes": [
14
- "SPDXRef-Package-robono.server-0.16.0"
14
+ "SPDXRef-Package-robono.server-0.17.0"
15
15
  ],
16
16
  "packages": [
17
17
  {
18
18
  "name": "@robono/server",
19
- "SPDXID": "SPDXRef-Package-robono.server-0.16.0",
20
- "versionInfo": "0.16.0",
19
+ "SPDXID": "SPDXRef-Package-robono.server-0.17.0",
20
+ "versionInfo": "0.17.0",
21
21
  "packageFileName": "",
22
22
  "description": "Provider-neutral server SDK for the Robono Bridge API.",
23
23
  "primaryPackagePurpose": "LIBRARY",
@@ -29,7 +29,7 @@
29
29
  {
30
30
  "referenceCategory": "PACKAGE-MANAGER",
31
31
  "referenceType": "purl",
32
- "referenceLocator": "pkg:npm/%40robono/server@0.16.0"
32
+ "referenceLocator": "pkg:npm/%40robono/server@0.17.0"
33
33
  }
34
34
  ]
35
35
  }
@@ -37,7 +37,7 @@
37
37
  "relationships": [
38
38
  {
39
39
  "spdxElementId": "SPDXRef-DOCUMENT",
40
- "relatedSpdxElement": "SPDXRef-Package-robono.server-0.16.0",
40
+ "relatedSpdxElement": "SPDXRef-Package-robono.server-0.17.0",
41
41
  "relationshipType": "DESCRIBES"
42
42
  }
43
43
  ]
package/SCREENING.md ADDED
@@ -0,0 +1,73 @@
1
+ # Photo and video screening for connected networks
2
+
3
+ Available in the upcoming server release (not present in server 0.16.0).
4
+
5
+ A connected network can use Robono's Amazon screening without replacing its own
6
+ chat interface or attachment storage. Do not put your network API key in a phone
7
+ app or website. No customer AWS account, Amazon keys or extra AWS server is needed.
8
+
9
+ 1. In Robono's **Features & preview → Photo and video screening**, choose categories,
10
+ sensitivity and a monthly limit, then accept the prices and processing terms.
11
+ 2. Use an existing backend API key with **Processing** permission.
12
+ 3. Keep attachments private until screening returns `allowed` for the exact bytes.
13
+
14
+ ```ts
15
+ import {RobonoScreening} from '@robono/server';
16
+ const screening = new RobonoScreening({apiKey: process.env.ROBONO_API_KEY!});
17
+ // Authenticate your own user and authorize their upload before this call.
18
+ const job = await screening.upload(stableUploadId, {
19
+ kind: 'image', fileName: 'photo.jpg', mimeType: 'image/jpeg', byteSize: bytes.length,
20
+ }, bytes);
21
+ // Store job.id against your private upload. Return promptly; poll status later.
22
+ const result = await screening.status(job.id);
23
+ if (result.state === 'allowed') {
24
+ await screening.assertAllowed(job.id, bytes); // checks current policy + SHA-256
25
+ // Publish these exact bytes to the recipients your app has authorized.
26
+ }
27
+ ```
28
+
29
+ Videos use `kind: 'video'`, `mimeType: 'video/mp4'` or `video/quicktime`, and
30
+ `durationMs`. Server verification checks duration; a false short duration fails.
31
+ Video analysis can take minutes. Show "Checking attachment" while pending, allow
32
+ canceling, and keep ordinary chat usable. `blocked` and `failed` must never release
33
+ the file. Store a stable request ID across network retries. A changed file needs a
34
+ new request ID. A policy change invalidates approval for future publication.
35
+
36
+ For direct HTTPS integration, POST to `https://api.robono.com/v1/screening` with
37
+ `Authorization: Bearer YOUR_SERVER_KEY`. Operations:
38
+
39
+ - `prepare`: `{operation:'prepare', requestId, file}`. Returns job and private PUT
40
+ upload instructions. Send only the returned storage headers to the upload URL.
41
+ - `submit`: `{operation:'submit', id}` after upload.
42
+ - `status`: `{operation:'status', id}`. Pending is not approval.
43
+
44
+ Responses include `id`, `state`, `categories`, `sha256`, `chargedMicros`,
45
+ `reservedMicros` and timestamps. Amounts are USD millionths. Do not trust a client
46
+ phone's claim that it passed screening; read the result on your backend. Never
47
+ publish a mutable URL whose contents can change after the check.
48
+
49
+ ## Robono-hosted attachments
50
+
51
+ With the updated server and supplied web/mobile packages, existing managed uploads
52
+ are automatically checked before delivery. The database also rejects direct sends
53
+ of unchecked photos/videos. Enabled screening requires managed storage for hosted
54
+ messaging; private external storage can use the standalone flow above. Older SDKs
55
+ must be updated before enabling screening. No extra per-chat switches.
56
+
57
+ ## Formats, costs and privacy
58
+
59
+ JPEG/PNG up to 15 MiB. MP4/MOV up to 32 MiB and 15 minutes. Other formats fail rather
60
+ than bypass screening. These are visual checks, not audio/profanity checks, and
61
+ can produce missed content or mistaken blocks.
62
+
63
+ Release prices: $3/1,000 photos and $0.20 per started video minute, no monthly fee.
64
+ Successful checks count even if blocked. Failed checks are uncharged. The same
65
+ accepted job is not billed twice. New work stops at the network screening cap or
66
+ overall spending cap. Job status expires after 30 days; upload a new copy for a new
67
+ check. Keep the originally screened bytes private while a check is pending.
68
+
69
+ Only selected media goes to Amazon Rekognition in Northern Virginia. Robono opts
70
+ out of AWS using it for AI-service improvement. Private temporary screening copies
71
+ are removed after completion, with a one-day S3 expiry backstop. File names and
72
+ hashes are cleared after 30 days; aggregate usage/billing records remain. AWS
73
+ operational retention follows its terms. See Robono's provider disclosure.
package/dist/index.d.ts CHANGED
@@ -24,4 +24,6 @@ export type { RobonoMessengerServerOptions, MessengerAccess } from './messenger.
24
24
  export * from './messaging-notifications.js';
25
25
  export * from './messaging-notification-providers.js';
26
26
  export * from './messaging-notification-postgres.js';
27
+ export { RobonoScreening } from './screening.js';
28
+ export type { ScreeningFile, ScreeningResult } from './screening.js';
27
29
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAC3C,OAAO,EAAE,oBAAoB,EAAE,MAAM,cAAc,CAAC;AACpD,YAAY,EAAE,2BAA2B,EAAE,wBAAwB,EAAE,yBAAyB,EAAE,cAAc,EAAE,MAAM,cAAc,CAAC;AACrI,OAAO,EAAE,0BAA0B,EAAE,MAAM,cAAc,CAAC;AAC1D,YAAY,EACV,yBAAyB,EACzB,0BAA0B,EAC1B,2BAA2B,GAC5B,MAAM,cAAc,CAAC;AACtB,OAAO,EACL,yBAAyB,EACzB,WAAW,EACX,kBAAkB,GACnB,MAAM,aAAa,CAAC;AACrB,YAAY,EAAE,kBAAkB,EAAE,MAAM,aAAa,CAAC;AACtD,OAAO,EACL,oBAAoB,EACpB,gBAAgB,EAChB,eAAe,GAChB,MAAM,mBAAmB,CAAC;AAC3B,YAAY,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;AACzD,OAAO,EAAE,mBAAmB,EAAE,MAAM,eAAe,CAAC;AACpD,OAAO,EAAE,mBAAmB,EAAE,oBAAoB,EAAE,MAAM,WAAW,CAAC;AACtE,mBAAmB,YAAY,CAAC;AAEhC,OAAO,EAAE,sBAAsB,EAAE,6BAA6B,EAAE,MAAM,gBAAgB,CAAC;AACvF,YAAY,EAAE,uBAAuB,EAAE,oBAAoB,EAAE,MAAM,gBAAgB,CAAC;AAEpF,OAAO,EAAC,kCAAkC,EAAC,MAAM,sBAAsB,CAAC;AACxE,YAAY,EAAC,uBAAuB,EAAE,uBAAuB,EAAE,mBAAmB,EAAE,oBAAoB,EAAC,MAAM,sBAAsB,CAAC;AACtI,OAAO,EAAC,kBAAkB,EAAC,MAAM,oBAAoB,CAAC;AAEtD,OAAO,EAAC,sCAAsC,EAAC,MAAM,2BAA2B,CAAC;AAEjF,OAAO,EAAC,qBAAqB,EAAC,4BAA4B,EAAC,MAAM,eAAe,CAAC;AACjF,YAAY,EAAC,kBAAkB,EAAC,MAAM,eAAe,CAAC;AACtD,OAAO,EAAC,yBAAyB,EAAC,MAAM,oBAAoB,CAAC;AAE7D,OAAO,EAAC,2BAA2B,EAAC,MAAM,gBAAgB,CAAC;AAC3D,YAAY,EAAC,4BAA4B,EAAC,eAAe,EAAC,MAAM,gBAAgB,CAAC;AAEjF,cAAc,8BAA8B,CAAC;AAC7C,cAAc,uCAAuC,CAAC;AACtD,cAAc,sCAAsC,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAC3C,OAAO,EAAE,oBAAoB,EAAE,MAAM,cAAc,CAAC;AACpD,YAAY,EAAE,2BAA2B,EAAE,wBAAwB,EAAE,yBAAyB,EAAE,cAAc,EAAE,MAAM,cAAc,CAAC;AACrI,OAAO,EAAE,0BAA0B,EAAE,MAAM,cAAc,CAAC;AAC1D,YAAY,EACV,yBAAyB,EACzB,0BAA0B,EAC1B,2BAA2B,GAC5B,MAAM,cAAc,CAAC;AACtB,OAAO,EACL,yBAAyB,EACzB,WAAW,EACX,kBAAkB,GACnB,MAAM,aAAa,CAAC;AACrB,YAAY,EAAE,kBAAkB,EAAE,MAAM,aAAa,CAAC;AACtD,OAAO,EACL,oBAAoB,EACpB,gBAAgB,EAChB,eAAe,GAChB,MAAM,mBAAmB,CAAC;AAC3B,YAAY,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;AACzD,OAAO,EAAE,mBAAmB,EAAE,MAAM,eAAe,CAAC;AACpD,OAAO,EAAE,mBAAmB,EAAE,oBAAoB,EAAE,MAAM,WAAW,CAAC;AACtE,mBAAmB,YAAY,CAAC;AAEhC,OAAO,EAAE,sBAAsB,EAAE,6BAA6B,EAAE,MAAM,gBAAgB,CAAC;AACvF,YAAY,EAAE,uBAAuB,EAAE,oBAAoB,EAAE,MAAM,gBAAgB,CAAC;AAEpF,OAAO,EAAC,kCAAkC,EAAC,MAAM,sBAAsB,CAAC;AACxE,YAAY,EAAC,uBAAuB,EAAE,uBAAuB,EAAE,mBAAmB,EAAE,oBAAoB,EAAC,MAAM,sBAAsB,CAAC;AACtI,OAAO,EAAC,kBAAkB,EAAC,MAAM,oBAAoB,CAAC;AAEtD,OAAO,EAAC,sCAAsC,EAAC,MAAM,2BAA2B,CAAC;AAEjF,OAAO,EAAC,qBAAqB,EAAC,4BAA4B,EAAC,MAAM,eAAe,CAAC;AACjF,YAAY,EAAC,kBAAkB,EAAC,MAAM,eAAe,CAAC;AACtD,OAAO,EAAC,yBAAyB,EAAC,MAAM,oBAAoB,CAAC;AAE7D,OAAO,EAAC,2BAA2B,EAAC,MAAM,gBAAgB,CAAC;AAC3D,YAAY,EAAC,4BAA4B,EAAC,eAAe,EAAC,MAAM,gBAAgB,CAAC;AAEjF,cAAc,8BAA8B,CAAC;AAC7C,cAAc,uCAAuC,CAAC;AACtD,cAAc,sCAAsC,CAAC;AAErD,OAAO,EAAC,eAAe,EAAC,MAAM,gBAAgB,CAAC;AAC/C,YAAY,EAAC,aAAa,EAAC,eAAe,EAAC,MAAM,gBAAgB,CAAC"}
package/dist/index.js CHANGED
@@ -15,4 +15,5 @@ export { createRobonoMessengerServer } from './messenger.js';
15
15
  export * from './messaging-notifications.js';
16
16
  export * from './messaging-notification-providers.js';
17
17
  export * from './messaging-notification-postgres.js';
18
+ export { RobonoScreening } from './screening.js';
18
19
  //# 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":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAC3C,OAAO,EAAE,oBAAoB,EAAE,MAAM,cAAc,CAAC;AAEpD,OAAO,EAAE,0BAA0B,EAAE,MAAM,cAAc,CAAC;AAM1D,OAAO,EACL,yBAAyB,EACzB,WAAW,EACX,kBAAkB,GACnB,MAAM,aAAa,CAAC;AAErB,OAAO,EACL,oBAAoB,EACpB,gBAAgB,EAChB,eAAe,GAChB,MAAM,mBAAmB,CAAC;AAE3B,OAAO,EAAE,mBAAmB,EAAE,MAAM,eAAe,CAAC;AACpD,OAAO,EAAE,mBAAmB,EAAE,oBAAoB,EAAE,MAAM,WAAW,CAAC;AAGtE,OAAO,EAAE,sBAAsB,EAAE,6BAA6B,EAAE,MAAM,gBAAgB,CAAC;AAGvF,OAAO,EAAC,kCAAkC,EAAC,MAAM,sBAAsB,CAAC;AAExE,OAAO,EAAC,kBAAkB,EAAC,MAAM,oBAAoB,CAAC;AAEtD,OAAO,EAAC,sCAAsC,EAAC,MAAM,2BAA2B,CAAC;AAEjF,OAAO,EAAC,qBAAqB,EAAC,4BAA4B,EAAC,MAAM,eAAe,CAAC;AAEjF,OAAO,EAAC,yBAAyB,EAAC,MAAM,oBAAoB,CAAC;AAE7D,OAAO,EAAC,2BAA2B,EAAC,MAAM,gBAAgB,CAAC;AAG3D,cAAc,8BAA8B,CAAC;AAC7C,cAAc,uCAAuC,CAAC;AACtD,cAAc,sCAAsC,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAC3C,OAAO,EAAE,oBAAoB,EAAE,MAAM,cAAc,CAAC;AAEpD,OAAO,EAAE,0BAA0B,EAAE,MAAM,cAAc,CAAC;AAM1D,OAAO,EACL,yBAAyB,EACzB,WAAW,EACX,kBAAkB,GACnB,MAAM,aAAa,CAAC;AAErB,OAAO,EACL,oBAAoB,EACpB,gBAAgB,EAChB,eAAe,GAChB,MAAM,mBAAmB,CAAC;AAE3B,OAAO,EAAE,mBAAmB,EAAE,MAAM,eAAe,CAAC;AACpD,OAAO,EAAE,mBAAmB,EAAE,oBAAoB,EAAE,MAAM,WAAW,CAAC;AAGtE,OAAO,EAAE,sBAAsB,EAAE,6BAA6B,EAAE,MAAM,gBAAgB,CAAC;AAGvF,OAAO,EAAC,kCAAkC,EAAC,MAAM,sBAAsB,CAAC;AAExE,OAAO,EAAC,kBAAkB,EAAC,MAAM,oBAAoB,CAAC;AAEtD,OAAO,EAAC,sCAAsC,EAAC,MAAM,2BAA2B,CAAC;AAEjF,OAAO,EAAC,qBAAqB,EAAC,4BAA4B,EAAC,MAAM,eAAe,CAAC;AAEjF,OAAO,EAAC,yBAAyB,EAAC,MAAM,oBAAoB,CAAC;AAE7D,OAAO,EAAC,2BAA2B,EAAC,MAAM,gBAAgB,CAAC;AAG3D,cAAc,8BAA8B,CAAC;AAC7C,cAAc,uCAAuC,CAAC;AACtD,cAAc,sCAAsC,CAAC;AAErD,OAAO,EAAC,eAAe,EAAC,MAAM,gBAAgB,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"managed-media.d.ts","sourceRoot":"","sources":["../src/managed-media.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAC,uBAAuB,EAAC,oBAAoB,EAAC,MAAM,sBAAsB,CAAC;AACvF,yFAAyF;AACzF,qBAAa,kBAAmB,YAAW,uBAAuB;IAErD,OAAO,CAAC,OAAO;IAD3B,OAAO,CAAC,GAAG,CAAQ;gBACC,OAAO,EAAC;QAAC,MAAM,EAAC,MAAM,CAAC;QAAA,OAAO,CAAC,EAAC,MAAM,CAAC;QAAA,KAAK,CAAC,EAAC,OAAO,KAAK,CAAA;KAAC;YAKjE,OAAO;IAMrB,OAAO,CAAC,KAAK,EAAC,UAAU,CAAC,uBAAuB,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC,GAAE,UAAU,CAAC,uBAAuB,CAAC,SAAS,CAAC,CAAC;IACzG,QAAQ,CAAC,KAAK,EAAC,UAAU,CAAC,uBAAuB,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,CAAC,GAAE,UAAU,CAAC,uBAAuB,CAAC,UAAU,CAAC,CAAC;IAKxH,QAAQ,CAAC,KAAK,EAAC,UAAU,CAAC,uBAAuB,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,CAAC,GAAE,UAAU,CAAC,uBAAuB,CAAC,UAAU,CAAC,CAAC;IAClH,iBAAiB,CAAC,KAAK,EAAC;QAAC,OAAO,EAAC,MAAM,CAAC;QAAA,cAAc,EAAC,MAAM,CAAC;QAAA,SAAS,EAAC,MAAM,CAAA;KAAC,GAAE,OAAO,CAAC;QAAC,GAAG,EAAC,MAAM,CAAC;QAAA,OAAO,CAAC,EAAC,MAAM,CAAC,MAAM,EAAC,MAAM,CAAC,CAAC;QAAA,KAAK,EAAC,oBAAoB,CAAA;KAAC,CAAC;IAChK,SAAS,CAAC,KAAK,EAAC;QAAC,OAAO,EAAC,MAAM,CAAC;QAAA,cAAc,EAAC,MAAM,CAAC;QAAA,SAAS,EAAC,MAAM,CAAA;KAAC,GAAE,OAAO,CAAC;QAAC,GAAG,EAAC,MAAM,CAAC;QAAA,OAAO,CAAC,EAAC,MAAM,CAAC,MAAM,EAAC,MAAM,CAAC,CAAC;QAAA,KAAK,EAAC,oBAAoB,CAAA;KAAC,GAAC,IAAI,CAAC;IACvJ,OAAO,CAAC,KAAK,EAAC,UAAU,CAAC,uBAAuB,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC;IAC/D,OAAO,CAAC,KAAK,EAAC;QAAC,OAAO,EAAC,MAAM,CAAC;QAAA,cAAc,EAAC,MAAM,CAAC;QAAA,OAAO,EAAC,MAAM,CAAA;KAAC,GAAE,OAAO,CAAC,oBAAoB,GAAC,IAAI,CAAC;CAG7G"}
1
+ {"version":3,"file":"managed-media.d.ts","sourceRoot":"","sources":["../src/managed-media.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAC,uBAAuB,EAAC,oBAAoB,EAAC,MAAM,sBAAsB,CAAC;AACvF,yFAAyF;AACzF,qBAAa,kBAAmB,YAAW,uBAAuB;IAErD,OAAO,CAAC,OAAO;IAD3B,OAAO,CAAC,GAAG,CAAQ;gBACC,OAAO,EAAC;QAAC,MAAM,EAAC,MAAM,CAAC;QAAA,OAAO,CAAC,EAAC,MAAM,CAAC;QAAA,KAAK,CAAC,EAAC,OAAO,KAAK,CAAA;KAAC;YAKjE,OAAO;IAOrB,OAAO,CAAC,KAAK,EAAC,UAAU,CAAC,uBAAuB,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC,GAAE,UAAU,CAAC,uBAAuB,CAAC,SAAS,CAAC,CAAC;IACzG,QAAQ,CAAC,KAAK,EAAC,UAAU,CAAC,uBAAuB,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,CAAC,GAAE,UAAU,CAAC,uBAAuB,CAAC,UAAU,CAAC,CAAC;IAKxH,QAAQ,CAAC,KAAK,EAAC,UAAU,CAAC,uBAAuB,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,CAAC,GAAE,UAAU,CAAC,uBAAuB,CAAC,UAAU,CAAC,CAAC;IAClH,iBAAiB,CAAC,KAAK,EAAC;QAAC,OAAO,EAAC,MAAM,CAAC;QAAA,cAAc,EAAC,MAAM,CAAC;QAAA,SAAS,EAAC,MAAM,CAAA;KAAC,GAAE,OAAO,CAAC;QAAC,GAAG,EAAC,MAAM,CAAC;QAAA,OAAO,CAAC,EAAC,MAAM,CAAC,MAAM,EAAC,MAAM,CAAC,CAAC;QAAA,KAAK,EAAC,oBAAoB,CAAA;KAAC,CAAC;IAChK,SAAS,CAAC,KAAK,EAAC;QAAC,OAAO,EAAC,MAAM,CAAC;QAAA,cAAc,EAAC,MAAM,CAAC;QAAA,SAAS,EAAC,MAAM,CAAA;KAAC,GAAE,OAAO,CAAC;QAAC,GAAG,EAAC,MAAM,CAAC;QAAA,OAAO,CAAC,EAAC,MAAM,CAAC,MAAM,EAAC,MAAM,CAAC,CAAC;QAAA,KAAK,EAAC,oBAAoB,CAAA;KAAC,GAAC,IAAI,CAAC;IACvJ,OAAO,CAAC,KAAK,EAAC,UAAU,CAAC,uBAAuB,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC;IAC/D,OAAO,CAAC,KAAK,EAAC;QAAC,OAAO,EAAC,MAAM,CAAC;QAAA,cAAc,EAAC,MAAM,CAAC;QAAA,OAAO,EAAC,MAAM,CAAA;KAAC,GAAE,OAAO,CAAC,oBAAoB,GAAC,IAAI,CAAC;CAG7G"}
@@ -13,6 +13,8 @@ export class RobonoManagedMedia {
13
13
  async request(operation, input) {
14
14
  const response = await (this.options.fetch ?? fetch)(this.url, { method: 'POST', redirect: 'error', signal: AbortSignal.timeout(operation === 'complete' ? 120000 : 15000), headers: { authorization: `Bearer ${this.options.apiKey}`, 'content-type': 'application/json' }, body: JSON.stringify({ ...input, operation }) });
15
15
  const data = await response.json().catch(() => null);
16
+ if (response.status === 202 && data?.error?.code === 'screening_pending')
17
+ throw new RobonoError('This attachment is being checked before delivery.', { status: 202, code: 'screening_pending', retryable: true });
16
18
  if (!response.ok)
17
19
  throw new RobonoError(data?.error?.message ?? 'Attachment request failed.', { status: response.status, code: data?.error?.code ?? 'media_unavailable', retryable: response.status === 429 || response.status >= 500 });
18
20
  return data;
@@ -1 +1 @@
1
- {"version":3,"file":"managed-media.js","sourceRoot":"","sources":["../src/managed-media.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"managed-media.js","sourceRoot":"","sources":["../src/managed-media.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,53 @@
1
+ export type ScreeningFile = {
2
+ kind: 'image' | 'video';
3
+ mimeType: string;
4
+ byteSize: number;
5
+ fileName: string;
6
+ durationMs?: number;
7
+ };
8
+ export type ScreeningResult = {
9
+ id: string;
10
+ state: 'uploading' | 'queued' | 'processing' | 'allowed' | 'blocked' | 'failed';
11
+ kind: 'image' | 'video';
12
+ categories: string[];
13
+ sha256: string | null;
14
+ error: string | null;
15
+ chargedMicros: number;
16
+ reservedMicros: number;
17
+ createdAt: string;
18
+ finishedAt: string | null;
19
+ };
20
+ /** Server-only. Existing connected networks use their Robono Processing API key. */
21
+ export declare class RobonoScreening {
22
+ private options;
23
+ private url;
24
+ constructor(options: {
25
+ apiKey: string;
26
+ baseUrl?: string;
27
+ fetch?: typeof fetch;
28
+ });
29
+ private request;
30
+ prepare(requestId: string, file: ScreeningFile): Promise<ScreeningResult & {
31
+ upload?: {
32
+ url: string;
33
+ headers: Record<string, string>;
34
+ };
35
+ }>;
36
+ submit(id: string): Promise<ScreeningResult & {
37
+ upload?: {
38
+ url: string;
39
+ headers: Record<string, string>;
40
+ };
41
+ }>;
42
+ status(id: string): Promise<ScreeningResult & {
43
+ upload?: {
44
+ url: string;
45
+ headers: Record<string, string>;
46
+ };
47
+ }>;
48
+ /** Upload exactly the bytes to be published. Returns a job; never treats pending as approved. */
49
+ upload(requestId: string, file: ScreeningFile, bytes: Uint8Array): Promise<ScreeningResult>;
50
+ /** Call this before releasing bytes stored by your own application. */
51
+ assertAllowed(id: string, bytes: Uint8Array): Promise<ScreeningResult>;
52
+ }
53
+ //# sourceMappingURL=screening.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"screening.d.ts","sourceRoot":"","sources":["../src/screening.ts"],"names":[],"mappings":"AAEA,MAAM,MAAM,aAAa,GAAC;IAAC,IAAI,EAAC,OAAO,GAAC,OAAO,CAAC;IAAA,QAAQ,EAAC,MAAM,CAAC;IAAA,QAAQ,EAAC,MAAM,CAAC;IAAA,QAAQ,EAAC,MAAM,CAAC;IAAA,UAAU,CAAC,EAAC,MAAM,CAAA;CAAC,CAAC;AACpH,MAAM,MAAM,eAAe,GAAC;IAAC,EAAE,EAAC,MAAM,CAAC;IAAA,KAAK,EAAC,WAAW,GAAC,QAAQ,GAAC,YAAY,GAAC,SAAS,GAAC,SAAS,GAAC,QAAQ,CAAC;IAAA,IAAI,EAAC,OAAO,GAAC,OAAO,CAAC;IAAA,UAAU,EAAC,MAAM,EAAE,CAAC;IAAA,MAAM,EAAC,MAAM,GAAC,IAAI,CAAC;IAAA,KAAK,EAAC,MAAM,GAAC,IAAI,CAAC;IAAA,aAAa,EAAC,MAAM,CAAC;IAAA,cAAc,EAAC,MAAM,CAAC;IAAA,SAAS,EAAC,MAAM,CAAC;IAAA,UAAU,EAAC,MAAM,GAAC,IAAI,CAAA;CAAC,CAAC;AAC9Q,oFAAoF;AACpF,qBAAa,eAAe;IAEf,OAAO,CAAC,OAAO;IAD3B,OAAO,CAAC,GAAG,CAAQ;gBACC,OAAO,EAAC;QAAC,MAAM,EAAC,MAAM,CAAC;QAAA,OAAO,CAAC,EAAC,MAAM,CAAC;QAAA,KAAK,CAAC,EAAC,OAAO,KAAK,CAAA;KAAC;YAIjE,OAAO;IAMrB,OAAO,CAAC,SAAS,EAAC,MAAM,EAAC,IAAI,EAAC,aAAa;iBAN0C;YAAC,GAAG,EAAC,MAAM,CAAC;YAAA,OAAO,EAAC,MAAM,CAAC,MAAM,EAAC,MAAM,CAAC,CAAA;SAAC;;IAO/H,MAAM,CAAC,EAAE,EAAC,MAAM;iBAPqE;YAAC,GAAG,EAAC,MAAM,CAAC;YAAA,OAAO,EAAC,MAAM,CAAC,MAAM,EAAC,MAAM,CAAC,CAAA;SAAC;;IAQ/H,MAAM,CAAC,EAAE,EAAC,MAAM;iBARqE;YAAC,GAAG,EAAC,MAAM,CAAC;YAAA,OAAO,EAAC,MAAM,CAAC,MAAM,EAAC,MAAM,CAAC,CAAA;SAAC;;IAS/H,iGAAiG;IAC3F,MAAM,CAAC,SAAS,EAAC,MAAM,EAAC,IAAI,EAAC,aAAa,EAAC,KAAK,EAAC,UAAU,GAAE,OAAO,CAAC,eAAe,CAAC;IAY3F,uEAAuE;IACjE,aAAa,CAAC,EAAE,EAAC,MAAM,EAAC,KAAK,EAAC,UAAU,GAAE,OAAO,CAAC,eAAe,CAAC;CAKxE"}
@@ -0,0 +1,52 @@
1
+ import { createHash } from 'node:crypto';
2
+ import { RobonoError } from './errors.js';
3
+ /** Server-only. Existing connected networks use their Robono Processing API key. */
4
+ export class RobonoScreening {
5
+ options;
6
+ url;
7
+ constructor(options) {
8
+ this.options = options;
9
+ const u = new URL(options.baseUrl ?? 'https://api.robono.com/v1/screening');
10
+ if (u.protocol !== 'https:' || u.username || u.password || !options.apiKey.trim())
11
+ throw Error('Use HTTPS and a server API key.');
12
+ this.url = u.href;
13
+ }
14
+ async request(operation, body) {
15
+ const r = await (this.options.fetch ?? fetch)(this.url, { method: 'POST', redirect: 'error', signal: AbortSignal.timeout(30000), headers: { authorization: 'Bearer ' + this.options.apiKey, 'content-type': 'application/json' }, body: JSON.stringify({ ...body, operation }) });
16
+ const data = await r.json().catch(() => null);
17
+ if (!r.ok)
18
+ throw new RobonoError(data?.error?.message ?? 'Screening request failed.', { status: r.status, code: data?.error?.code ?? 'screening_unavailable', retryable: r.status === 429 || r.status >= 500 });
19
+ if (!data?.id || !['uploading', 'queued', 'processing', 'allowed', 'blocked', 'failed'].includes(data.state))
20
+ throw Error('Invalid screening response');
21
+ return data;
22
+ }
23
+ prepare(requestId, file) { return this.request('prepare', { requestId, file }); }
24
+ submit(id) { return this.request('submit', { id }); }
25
+ status(id) { return this.request('status', { id }); }
26
+ /** Upload exactly the bytes to be published. Returns a job; never treats pending as approved. */
27
+ async upload(requestId, file, bytes) {
28
+ if (file.byteSize !== bytes.byteLength)
29
+ throw Error('File size does not match the supplied bytes.');
30
+ const digest = createHash('sha256').update(bytes).digest('hex');
31
+ const prepared = await this.prepare(requestId, file);
32
+ if (prepared.sha256 && prepared.sha256 !== digest)
33
+ throw Error('This request ID belongs to different file contents.');
34
+ if (prepared.upload) {
35
+ const destination = new URL(prepared.upload.url);
36
+ if (destination.protocol !== 'https:' || destination.username || destination.password)
37
+ throw Error('Invalid private upload URL');
38
+ const r = await (this.options.fetch ?? fetch)(destination, { method: 'PUT', redirect: 'error', headers: prepared.upload.headers, body: bytes, signal: AbortSignal.timeout(120000) });
39
+ if (!r.ok && r.status !== 412)
40
+ throw new RobonoError('Screening upload failed.', { status: r.status, code: 'screening_upload_failed', retryable: true });
41
+ }
42
+ return this.submit(prepared.id);
43
+ }
44
+ /** Call this before releasing bytes stored by your own application. */
45
+ async assertAllowed(id, bytes) {
46
+ const result = await this.status(id);
47
+ if (result.state !== 'allowed' || !result.sha256 || createHash('sha256').update(bytes).digest('hex') !== result.sha256)
48
+ throw new RobonoError('This file has not been approved for delivery.', { status: 409, code: result.state === 'blocked' ? 'content_blocked' : 'screening_not_approved', retryable: result.state === 'queued' || result.state === 'processing' });
49
+ return result;
50
+ }
51
+ }
52
+ //# sourceMappingURL=screening.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"screening.js","sourceRoot":"","sources":["../src/screening.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@robono/server",
3
- "version": "0.16.0",
3
+ "version": "0.17.0",
4
4
  "description": "Provider-neutral server SDK for the Robono Bridge API.",
5
5
  "keywords": [
6
6
  "robono",
@@ -48,7 +48,8 @@
48
48
  "LICENSE",
49
49
  "SBOM.spdx.json",
50
50
  "sql",
51
- "NOTIFICATIONS.md"
51
+ "NOTIFICATIONS.md",
52
+ "SCREENING.md"
52
53
  ],
53
54
  "scripts": {
54
55
  "build": "tsc -p tsconfig.json",