@zeph-to/hook-sdk 1.1.1 → 1.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/dist/types.d.ts CHANGED
@@ -13,6 +13,19 @@ export interface NotifyPayload {
13
13
  }
14
14
  export interface NotifyResult {
15
15
  pushId: string;
16
+ fileKey?: string;
17
+ autoFile?: boolean;
18
+ }
19
+ export interface FileAttachment {
20
+ fileKey: string;
21
+ fileName: string;
22
+ fileSize: number;
23
+ fileType: string;
24
+ }
25
+ export interface UploadRequestResult {
26
+ fileId: string;
27
+ fileKey: string;
28
+ uploadUrl: string;
16
29
  }
17
30
  export interface ListParams {
18
31
  limit?: number;
@@ -1 +1 @@
1
- {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,WAAW;IAC1B,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED,MAAM,WAAW,aAAa;IAC5B,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,IAAI,CAAC,EAAE,MAAM,GAAG,MAAM,GAAG,MAAM,GAAG,MAAM,CAAC;IACzC,QAAQ,CAAC,EAAE,KAAK,GAAG,QAAQ,GAAG,MAAM,GAAG,QAAQ,CAAC;IAChD,cAAc,CAAC,EAAE,MAAM,CAAC;CACzB;AAED,MAAM,WAAW,YAAY;IAC3B,MAAM,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,UAAU;IACzB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,IAAI,CAAC,EAAE,MAAM,GAAG,MAAM,GAAG,MAAM,GAAG,WAAW,GAAG,MAAM,CAAC;CACxD;AAED,MAAM,WAAW,QAAQ;IACvB,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,UAAU;IACzB,MAAM,EAAE,QAAQ,EAAE,CAAC;IACnB,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,OAAO,CAAC;CAClB;AAED,MAAM,WAAW,gBAAgB;IAC/B,SAAS,EAAE,IAAI,CAAC;CACjB;AAED,MAAM,WAAW,gBAAgB;IAC/B,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,gBAAgB;IAC/B,KAAK,EAAE;QACL,IAAI,EAAE,MAAM,CAAC;QACb,OAAO,EAAE,MAAM,CAAC;QAChB,MAAM,EAAE,MAAM,CAAC;KAChB,CAAC;CACH"}
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,WAAW;IAC1B,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED,MAAM,WAAW,aAAa;IAC5B,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,IAAI,CAAC,EAAE,MAAM,GAAG,MAAM,GAAG,MAAM,GAAG,MAAM,CAAC;IACzC,QAAQ,CAAC,EAAE,KAAK,GAAG,QAAQ,GAAG,MAAM,GAAG,QAAQ,CAAC;IAChD,cAAc,CAAC,EAAE,MAAM,CAAC;CACzB;AAED,MAAM,WAAW,YAAY;IAC3B,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,QAAQ,CAAC,EAAE,OAAO,CAAC;CACpB;AAED,MAAM,WAAW,cAAc;IAC7B,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,EAAE,MAAM,CAAC;CAClB;AAED,MAAM,WAAW,mBAAmB;IAClC,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,UAAU;IACzB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,IAAI,CAAC,EAAE,MAAM,GAAG,MAAM,GAAG,MAAM,GAAG,WAAW,GAAG,MAAM,CAAC;CACxD;AAED,MAAM,WAAW,QAAQ;IACvB,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,UAAU;IACzB,MAAM,EAAE,QAAQ,EAAE,CAAC;IACnB,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,OAAO,CAAC;CAClB;AAED,MAAM,WAAW,gBAAgB;IAC/B,SAAS,EAAE,IAAI,CAAC;CACjB;AAED,MAAM,WAAW,gBAAgB;IAC/B,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,gBAAgB;IAC/B,KAAK,EAAE;QACL,IAAI,EAAE,MAAM,CAAC;QACb,OAAO,EAAE,MAAM,CAAC;QAChB,MAAM,EAAE,MAAM,CAAC;KAChB,CAAC;CACH"}
@@ -1,10 +1,17 @@
1
- import type { ZephOptions, NotifyPayload, NotifyResult, ListParams, ListResult, DismissOneResult, DismissAllResult } from './types.js';
1
+ import type { ZephOptions, NotifyPayload, NotifyResult, ListParams, ListResult, DismissOneResult, DismissAllResult, UploadRequestResult } from './types.js';
2
2
  export declare class ZephHook {
3
3
  private readonly apiKey;
4
4
  private readonly baseUrl;
5
5
  private readonly timeoutMs;
6
6
  constructor(options: ZephOptions);
7
7
  notify(payload: NotifyPayload): Promise<NotifyResult>;
8
+ private notifyWithFile;
9
+ requestUpload(params: {
10
+ fileName: string;
11
+ fileType: string;
12
+ fileSize: number;
13
+ }): Promise<UploadRequestResult>;
14
+ uploadToS3(url: string, content: string, contentType: string): Promise<void>;
8
15
  list(params?: ListParams): Promise<ListResult>;
9
16
  dismiss(pushId: string): Promise<DismissOneResult>;
10
17
  dismissAll(): Promise<DismissAllResult>;
@@ -1 +1 @@
1
- {"version":3,"file":"zeph-hook.d.ts","sourceRoot":"","sources":["../src/zeph-hook.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,aAAa,EAAE,YAAY,EAAE,UAAU,EAAE,UAAU,EAAY,gBAAgB,EAAE,gBAAgB,EAAoB,MAAM,YAAY,CAAC;AAMnK,qBAAa,QAAQ;IACnB,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAS;IAChC,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAS;IACjC,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAS;gBAEvB,OAAO,EAAE,WAAW;IAS1B,MAAM,CAAC,OAAO,EAAE,aAAa,GAAG,OAAO,CAAC,YAAY,CAAC;IASrD,IAAI,CAAC,MAAM,CAAC,EAAE,UAAU,GAAG,OAAO,CAAC,UAAU,CAAC;IAmB9C,OAAO,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,gBAAgB,CAAC;IAKlD,UAAU,IAAI,OAAO,CAAC,gBAAgB,CAAC;YAK/B,OAAO;IAiCrB,OAAO,CAAC,UAAU;CASnB"}
1
+ {"version":3,"file":"zeph-hook.d.ts","sourceRoot":"","sources":["../src/zeph-hook.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,aAAa,EAAE,YAAY,EAAE,UAAU,EAAE,UAAU,EAAY,gBAAgB,EAAE,gBAAgB,EAAoB,mBAAmB,EAAE,MAAM,YAAY,CAAC;AAcxL,qBAAa,QAAQ;IACnB,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAS;IAChC,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAS;IACjC,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAS;gBAEvB,OAAO,EAAE,WAAW;IAS1B,MAAM,CAAC,OAAO,EAAE,aAAa,GAAG,OAAO,CAAC,YAAY,CAAC;YAiB7C,cAAc;IAsBtB,aAAa,CAAC,MAAM,EAAE;QAAE,QAAQ,EAAE,MAAM,CAAC;QAAC,QAAQ,EAAE,MAAM,CAAC;QAAC,QAAQ,EAAE,MAAM,CAAA;KAAE,GAAG,OAAO,CAAC,mBAAmB,CAAC;IAK7G,UAAU,CAAC,GAAG,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAY5E,IAAI,CAAC,MAAM,CAAC,EAAE,UAAU,GAAG,OAAO,CAAC,UAAU,CAAC;IAmB9C,OAAO,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,gBAAgB,CAAC;IAKlD,UAAU,IAAI,OAAO,CAAC,gBAAgB,CAAC;YAK/B,OAAO;IAiCrB,OAAO,CAAC,UAAU;CASnB"}
package/dist/zeph-hook.js CHANGED
@@ -4,6 +4,13 @@ exports.ZephHook = void 0;
4
4
  const errors_js_1 = require("./errors.js");
5
5
  const DEFAULT_BASE_URL = 'https://api.zeph.to/v1';
6
6
  const DEFAULT_TIMEOUT_MS = 30_000;
7
+ const BODY_FILE_THRESHOLD = 1024;
8
+ const PREVIEW_LENGTH = 200;
9
+ const inferMimeType = (fileName) => {
10
+ const ext = fileName.split('.').pop()?.toLowerCase();
11
+ const map = { md: 'text/markdown', txt: 'text/plain', json: 'application/json' };
12
+ return map[ext ?? ''] ?? 'text/plain';
13
+ };
7
14
  class ZephHook {
8
15
  apiKey;
9
16
  baseUrl;
@@ -17,6 +24,12 @@ class ZephHook {
17
24
  this.timeoutMs = options.timeout ?? DEFAULT_TIMEOUT_MS;
18
25
  }
19
26
  async notify(payload) {
27
+ const body = payload.body;
28
+ const bodyBytes = body ? new TextEncoder().encode(body).byteLength : 0;
29
+ const isLongBody = bodyBytes > BODY_FILE_THRESHOLD;
30
+ if (isLongBody && body) {
31
+ return this.notifyWithFile(payload, body, bodyBytes);
32
+ }
20
33
  const json = await this.request('POST', '/pushes/send', payload);
21
34
  const pushId = json.data?.pushId;
22
35
  if (!pushId) {
@@ -24,6 +37,39 @@ class ZephHook {
24
37
  }
25
38
  return { pushId };
26
39
  }
40
+ async notifyWithFile(payload, body, fileSize) {
41
+ const fileName = 'response.md';
42
+ const fileType = inferMimeType(fileName);
43
+ const upload = await this.requestUpload({ fileName, fileType, fileSize });
44
+ await this.uploadToS3(upload.uploadUrl, body, fileType);
45
+ const preview = body.length > PREVIEW_LENGTH ? body.slice(0, PREVIEW_LENGTH) + '...' : body;
46
+ const json = await this.request('POST', '/pushes/send', {
47
+ ...payload,
48
+ body: preview,
49
+ type: 'file',
50
+ files: [{ fileKey: upload.fileKey, fileName, fileSize, fileType }],
51
+ });
52
+ const pushId = json.data?.pushId;
53
+ if (!pushId) {
54
+ throw new errors_js_1.ZephError('Server returned no pushId', 'INVALID_RESPONSE', 500);
55
+ }
56
+ return { pushId, fileKey: upload.fileKey, autoFile: true };
57
+ }
58
+ async requestUpload(params) {
59
+ const json = await this.request('POST', '/files/upload-request', params);
60
+ return json.data;
61
+ }
62
+ async uploadToS3(url, content, contentType) {
63
+ const response = await fetch(url, {
64
+ method: 'PUT',
65
+ headers: { 'Content-Type': contentType },
66
+ body: content,
67
+ signal: AbortSignal.timeout(this.timeoutMs),
68
+ });
69
+ if (!response.ok) {
70
+ throw new errors_js_1.ZephError(`S3 upload failed with status ${response.status}`, 'UPLOAD_FAILED', response.status);
71
+ }
72
+ }
27
73
  async list(params) {
28
74
  const query = new URLSearchParams();
29
75
  if (params?.limit)
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@zeph-to/hook-sdk",
3
- "version": "1.1.1",
3
+ "version": "1.2.0",
4
4
  "description": "Zeph push notification SDK + CLI — zero dependencies",
5
5
  "main": "./dist/index.js",
6
6
  "types": "./dist/index.d.ts",