@xyo-network/url-safety-plugin 6.0.3 → 7.0.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 CHANGED
@@ -1,3 +1,5 @@
1
+ [![logo][]](https://xyo.network)
2
+
1
3
  # @xyo-network/url-safety-plugin
2
4
 
3
5
  [![npm][npm-badge]][npm-link]
@@ -36,9 +38,12 @@ bun add {{name}}
36
38
 
37
39
  See the [LICENSE](LICENSE) file for license rights and limitations (LGPL-3.0-only).
38
40
 
41
+ ## Credits
39
42
 
43
+ [Made with 🔥 and ❄️ by XYO Foundation](https://xyo.network)
40
44
 
41
45
  [npm-badge]: https://img.shields.io/npm/v/@xyo-network/url-safety-plugin.svg
42
46
  [npm-link]: https://www.npmjs.com/package/@xyo-network/url-safety-plugin
43
47
  [license-badge]: https://img.shields.io/npm/l/@xyo-network/url-safety-plugin.svg
44
48
  [license-link]: https://github.com/xylabs/sdk-js/blob/main/LICENSE
49
+ [logo]: https://cdn.xy.company/img/brand/XYO_full_colored.png
@@ -1,13 +1,40 @@
1
- import { type Payload, type Schema } from '@xyo-network/sdk-js';
1
+ import { type Schema } from '@xyo-network/sdk-js';
2
2
  import { AbstractWitness } from '@xyo-network/sdk-js';
3
3
  import type { UrlPayload } from '@xyo-network/url-payload-plugin';
4
4
  import type { UrlSafetyPayload } from '@xyo-network/url-safety-payload-plugin';
5
+ import * as z from 'zod/mini';
5
6
  import type { UrlSafetyWitnessParams } from './Params.ts';
6
7
  export type GoogleSafeBrowsingMatchSchema = typeof GoogleSafeBrowsingMatchSchema;
7
8
  export declare const GoogleSafeBrowsingMatchSchema: "com.google.safebrowsing.match" & {
8
9
  readonly __schema: true;
9
10
  };
10
- export interface GoogleSafeBrowsingMatch {
11
+ export declare const GoogleSafeBrowsingMatchZod: z.ZodMiniObject<{
12
+ cacheDuration: z.ZodMiniString<string>;
13
+ platformType: z.ZodMiniString<string>;
14
+ threat: z.ZodMiniObject<{
15
+ url: z.ZodMiniString<string>;
16
+ }, z.core.$strip>;
17
+ threatEntryType: z.ZodMiniString<string>;
18
+ threatType: z.ZodMiniString<string>;
19
+ }, z.core.$strip>;
20
+ export type GoogleSafeBrowsingMatch = z.infer<typeof GoogleSafeBrowsingMatchZod>;
21
+ export declare const GoogleSafeBrowsingMatchPayloadZod: z.ZodMiniObject<{
22
+ schema: z.ZodMiniLiteral<"com.google.safebrowsing.match" & {
23
+ readonly __schema: true;
24
+ }>;
25
+ cacheDuration: z.ZodMiniString<string>;
26
+ platformType: z.ZodMiniString<string>;
27
+ threat: z.ZodMiniObject<{
28
+ url: z.ZodMiniString<string>;
29
+ }, z.core.$strip>;
30
+ threatEntryType: z.ZodMiniString<string>;
31
+ threatType: z.ZodMiniString<string>;
32
+ }, z.core.$strip>;
33
+ export type GoogleSafeBrowsingMatchPayload = z.infer<typeof GoogleSafeBrowsingMatchPayloadZod>;
34
+ export declare const isGoogleSafeBrowsingMatchPayload: <T>(value: T) => value is T & {
35
+ schema: "com.google.safebrowsing.match" & {
36
+ readonly __schema: true;
37
+ };
11
38
  cacheDuration: string;
12
39
  platformType: string;
13
40
  threat: {
@@ -15,8 +42,59 @@ export interface GoogleSafeBrowsingMatch {
15
42
  };
16
43
  threatEntryType: string;
17
44
  threatType: string;
18
- }
19
- export type GoogleSafeBrowsingMatchPayload = Payload<GoogleSafeBrowsingMatch, GoogleSafeBrowsingMatchSchema>;
45
+ };
46
+ export declare const asGoogleSafeBrowsingMatchPayload: {
47
+ <T>(value: T): (T & {
48
+ schema: "com.google.safebrowsing.match" & {
49
+ readonly __schema: true;
50
+ };
51
+ cacheDuration: string;
52
+ platformType: string;
53
+ threat: {
54
+ url: string;
55
+ };
56
+ threatEntryType: string;
57
+ threatType: string;
58
+ }) | undefined;
59
+ <T>(value: T, assert: import("@xylabs/sdk-js").ZodFactoryConfig): T & {
60
+ schema: "com.google.safebrowsing.match" & {
61
+ readonly __schema: true;
62
+ };
63
+ cacheDuration: string;
64
+ platformType: string;
65
+ threat: {
66
+ url: string;
67
+ };
68
+ threatEntryType: string;
69
+ threatType: string;
70
+ };
71
+ };
72
+ export declare const toGoogleSafeBrowsingMatchPayload: {
73
+ <T>(value: T): (T & {
74
+ schema: "com.google.safebrowsing.match" & {
75
+ readonly __schema: true;
76
+ };
77
+ cacheDuration: string;
78
+ platformType: string;
79
+ threat: {
80
+ url: string;
81
+ };
82
+ threatEntryType: string;
83
+ threatType: string;
84
+ }) | undefined;
85
+ <T>(value: T, assert: import("@xylabs/sdk-js").ZodFactoryConfig): T & {
86
+ schema: "com.google.safebrowsing.match" & {
87
+ readonly __schema: true;
88
+ };
89
+ cacheDuration: string;
90
+ platformType: string;
91
+ threat: {
92
+ url: string;
93
+ };
94
+ threatEntryType: string;
95
+ threatType: string;
96
+ };
97
+ };
20
98
  export declare class UrlSafetyWitness<TParams extends UrlSafetyWitnessParams = UrlSafetyWitnessParams> extends AbstractWitness<TParams> {
21
99
  static readonly configSchemas: Schema[];
22
100
  static readonly defaultConfigSchema: Schema;
@@ -1 +1 @@
1
- {"version":3,"file":"Witness.d.ts","sourceRoot":"","sources":["../../../src/Witness/Witness.ts"],"names":[],"mappings":"AACA,OAAO,EACK,KAAK,OAAO,EAAE,KAAK,MAAM,EACpC,MAAM,qBAAqB,CAAA;AAC5B,OAAO,EAAE,eAAe,EAAE,MAAM,qBAAqB,CAAA;AACrD,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,iCAAiC,CAAA;AAEjE,OAAO,KAAK,EAAE,gBAAgB,EAAuB,MAAM,wCAAwC,CAAA;AAInG,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,aAAa,CAAA;AAEzD,MAAM,MAAM,6BAA6B,GAAG,OAAO,6BAA6B,CAAA;AAChF,eAAO,MAAM,6BAA6B;;CAAkD,CAAA;AAE5F,MAAM,WAAW,uBAAuB;IACtC,aAAa,EAAE,MAAM,CAAA;IACrB,YAAY,EAAE,MAAM,CAAA;IACpB,MAAM,EAAE;QACN,GAAG,EAAE,MAAM,CAAA;KACZ,CAAA;IACD,eAAe,EAAE,MAAM,CAAA;IACvB,UAAU,EAAE,MAAM,CAAA;CACnB;AAED,MAAM,MAAM,8BAA8B,GAAG,OAAO,CAAC,uBAAuB,EAAE,6BAA6B,CAAC,CAAA;AAqC5G,qBAAa,gBAAgB,CAAC,OAAO,SAAS,sBAAsB,GAAG,sBAAsB,CAAE,SAAQ,eAAe,CAAC,OAAO,CAAC;IAC7H,gBAAyB,aAAa,EAAE,MAAM,EAAE,CAAyD;IACzG,gBAAyB,mBAAmB,EAAE,MAAM,CAA+B;IAEnF,IAAI,GAAG,uBAEN;IAED,IAAI,IAAI,yBAEP;cAEwB,cAAc,CAAC,QAAQ,GAAE,UAAU,EAAO,GAAG,OAAO,CAAC,gBAAgB,EAAE,CAAC;CA6BlG"}
1
+ {"version":3,"file":"Witness.d.ts","sourceRoot":"","sources":["../../../src/Witness/Witness.ts"],"names":[],"mappings":"AAIA,OAAO,EACyB,KAAK,MAAM,EAC1C,MAAM,qBAAqB,CAAA;AAC5B,OAAO,EAAE,eAAe,EAAE,MAAM,qBAAqB,CAAA;AACrD,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,iCAAiC,CAAA;AAEjE,OAAO,KAAK,EAAE,gBAAgB,EAAuB,MAAM,wCAAwC,CAAA;AAEnG,OAAO,KAAK,CAAC,MAAM,UAAU,CAAA;AAG7B,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,aAAa,CAAA;AAEzD,MAAM,MAAM,6BAA6B,GAAG,OAAO,6BAA6B,CAAA;AAChF,eAAO,MAAM,6BAA6B;;CAAkD,CAAA;AAE5F,eAAO,MAAM,0BAA0B;;;;;;;;iBAMrC,CAAA;AAEF,MAAM,MAAM,uBAAuB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,0BAA0B,CAAC,CAAA;AAEhF,eAAO,MAAM,iCAAiC;;;;;;;;;;;iBAAuG,CAAA;AAErJ,MAAM,MAAM,8BAA8B,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,iCAAiC,CAAC,CAAA;AAE9F,eAAO,MAAM,gCAAgC;;;;;;;;;;;CAAkD,CAAA;AAC/F,eAAO,MAAM,gCAAgC;;;;;;;;;;;;;;;;;;;;;;;;;CAAsF,CAAA;AACnI,eAAO,MAAM,gCAAgC;;;;;;;;;;;;;;;;;;;;;;;;;CAAsF,CAAA;AAqCnI,qBAAa,gBAAgB,CAAC,OAAO,SAAS,sBAAsB,GAAG,sBAAsB,CAAE,SAAQ,eAAe,CAAC,OAAO,CAAC;IAC7H,gBAAyB,aAAa,EAAE,MAAM,EAAE,CAAyD;IACzG,gBAAyB,mBAAmB,EAAE,MAAM,CAA+B;IAEnF,IAAI,GAAG,uBAEN;IAED,IAAI,IAAI,yBAEP;cAEwB,cAAc,CAAC,QAAQ,GAAE,UAAU,EAAO,GAAG,OAAO,CAAC,gBAAgB,EAAE,CAAC;CA6BlG"}
@@ -8,14 +8,32 @@ import { UrlSafetySchema } from "@xyo-network/url-safety-payload-plugin";
8
8
  var UrlSafetyWitnessConfigSchema = asSchema(`${UrlSafetySchema}.witness.config`, true);
9
9
 
10
10
  // src/Witness/Witness.ts
11
- import { FetchJsonClient } from "@xylabs/sdk-js";
12
11
  import {
13
- asSchema as asSchema2
12
+ FetchJsonClient,
13
+ zodAsFactory,
14
+ zodIsFactory,
15
+ zodToFactory
16
+ } from "@xylabs/sdk-js";
17
+ import {
18
+ asSchema as asSchema2,
19
+ PayloadZodOfSchema
14
20
  } from "@xyo-network/sdk-js";
15
21
  import { AbstractWitness } from "@xyo-network/sdk-js";
16
22
  import { UrlSchema } from "@xyo-network/url-payload-plugin";
17
23
  import { UrlSafetySchema as UrlSafetySchema2 } from "@xyo-network/url-safety-payload-plugin";
24
+ import * as z from "zod/mini";
18
25
  var GoogleSafeBrowsingMatchSchema = asSchema2("com.google.safebrowsing.match", true);
26
+ var GoogleSafeBrowsingMatchZod = z.object({
27
+ cacheDuration: z.string(),
28
+ platformType: z.string(),
29
+ threat: z.object({ url: z.string() }),
30
+ threatEntryType: z.string(),
31
+ threatType: z.string()
32
+ });
33
+ var GoogleSafeBrowsingMatchPayloadZod = z.extend(PayloadZodOfSchema(GoogleSafeBrowsingMatchSchema), { ...GoogleSafeBrowsingMatchZod.shape });
34
+ var isGoogleSafeBrowsingMatchPayload = zodIsFactory(GoogleSafeBrowsingMatchPayloadZod);
35
+ var asGoogleSafeBrowsingMatchPayload = zodAsFactory(GoogleSafeBrowsingMatchPayloadZod, "asGoogleSafeBrowsingMatchPayload");
36
+ var toGoogleSafeBrowsingMatchPayload = zodToFactory(GoogleSafeBrowsingMatchPayloadZod, "toGoogleSafeBrowsingMatchPayload");
19
37
  var checkUrlSafety = async (urls, config) => {
20
38
  const client = new FetchJsonClient();
21
39
  const endPoint = config?.endPoint ?? "https://safebrowsing.googleapis.com/v4/threatMatches:find";
@@ -36,7 +54,8 @@ var checkUrlSafety = async (urls, config) => {
36
54
  threatTypes: ["SOCIAL_ENGINEERING", "POTENTIALLY_HARMFUL_APPLICATION", "UNWANTED_SOFTWARE", "THREAT_TYPE_UNSPECIFIED"]
37
55
  }
38
56
  };
39
- const result = (await client.post(`${endPoint}?key=${key}`, postData, { headers: { referer: "http://localhost:3000" } })).data;
57
+ const response = await client.post(`${endPoint}?key=${key}`, postData, { headers: { referer: "http://localhost:3000" } });
58
+ const result = response.data;
40
59
  return result?.matches?.map((match) => ({ ...match, schema: GoogleSafeBrowsingMatchSchema })) ?? [];
41
60
  };
42
61
  var UrlSafetyWitness = class extends AbstractWitness {
@@ -66,7 +85,7 @@ var UrlSafetyWitness = class extends AbstractWitness {
66
85
  },
67
86
  { schema: UrlSafetySchema2, url }
68
87
  );
69
- payload.threatTypes = payload.threatTypes?.toSorted();
88
+ payload.threatTypes = payload.threatTypes?.toSorted((a, b) => a.localeCompare(b));
70
89
  return payload;
71
90
  });
72
91
  }
@@ -83,10 +102,15 @@ var UrlSafetyPlugin = () => createPayloadSetWitnessPlugin(
83
102
  }
84
103
  );
85
104
  export {
105
+ GoogleSafeBrowsingMatchPayloadZod,
86
106
  GoogleSafeBrowsingMatchSchema,
107
+ GoogleSafeBrowsingMatchZod,
87
108
  UrlSafetyPlugin,
88
109
  UrlSafetyWitness,
89
110
  UrlSafetyWitnessConfigSchema,
90
- UrlSafetyPlugin as default
111
+ asGoogleSafeBrowsingMatchPayload,
112
+ UrlSafetyPlugin as default,
113
+ isGoogleSafeBrowsingMatchPayload,
114
+ toGoogleSafeBrowsingMatchPayload
91
115
  };
92
116
  //# sourceMappingURL=index.mjs.map
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../src/Plugin.ts", "../../src/Witness/Config.ts", "../../src/Witness/Witness.ts"],
4
- "sourcesContent": ["import { createPayloadSetWitnessPlugin, PayloadSetSchema } from '@xyo-network/sdk-js'\nimport { UrlSafetySchema } from '@xyo-network/url-safety-payload-plugin'\n\nimport { UrlSafetyWitness } from './Witness/index.ts'\n\nexport const UrlSafetyPlugin = () =>\n createPayloadSetWitnessPlugin<UrlSafetyWitness>(\n { required: { [UrlSafetySchema]: 1 }, schema: PayloadSetSchema },\n {\n witness: async (params) => {\n const result = await UrlSafetyWitness.create(params)\n return result\n },\n },\n )\n", "import type { WitnessConfig } from '@xyo-network/sdk-js'\nimport { asSchema } from '@xyo-network/sdk-js'\nimport { UrlSafetySchema } from '@xyo-network/url-safety-payload-plugin'\n\nexport const UrlSafetyWitnessConfigSchema = asSchema(`${UrlSafetySchema}.witness.config`, true)\nexport type UrlSafetyWitnessConfigSchema = typeof UrlSafetyWitnessConfigSchema\n\nexport type UrlSafetyWitnessConfig = WitnessConfig<{\n google?: {\n safeBrowsing?: {\n endPoint?: string\n }\n }\n schema: UrlSafetyWitnessConfigSchema\n urls?: string[]\n}>\n", "import { FetchJsonClient } from '@xylabs/sdk-js'\nimport {\n asSchema, type Payload, type Schema,\n} from '@xyo-network/sdk-js'\nimport { AbstractWitness } from '@xyo-network/sdk-js'\nimport type { UrlPayload } from '@xyo-network/url-payload-plugin'\nimport { UrlSchema } from '@xyo-network/url-payload-plugin'\nimport type { UrlSafetyPayload, UrlSafetyThreatType } from '@xyo-network/url-safety-payload-plugin'\nimport { UrlSafetySchema } from '@xyo-network/url-safety-payload-plugin'\n\nimport { UrlSafetyWitnessConfigSchema } from './Config.ts'\nimport type { UrlSafetyWitnessParams } from './Params.ts'\n\nexport type GoogleSafeBrowsingMatchSchema = typeof GoogleSafeBrowsingMatchSchema\nexport const GoogleSafeBrowsingMatchSchema = asSchema('com.google.safebrowsing.match', true)\n\nexport interface GoogleSafeBrowsingMatch {\n cacheDuration: string\n platformType: string\n threat: {\n url: string\n }\n threatEntryType: string\n threatType: string\n}\n\nexport type GoogleSafeBrowsingMatchPayload = Payload<GoogleSafeBrowsingMatch, GoogleSafeBrowsingMatchSchema>\n\ninterface GoogleSafeBrowsingResult {\n matches?: GoogleSafeBrowsingMatch[]\n}\n\nconst checkUrlSafety = async (\n urls: string[],\n config?: {\n endPoint?: string\n key?: string\n },\n): Promise<GoogleSafeBrowsingMatchPayload[]> => {\n const client = new FetchJsonClient()\n const endPoint = config?.endPoint ?? 'https://safebrowsing.googleapis.com/v4/threatMatches:find'\n const key = config?.key\n const mutatedUrls = urls.map(url => url.replace('ipfs://', 'https://cloudflare-ipfs.com/'))\n if (mutatedUrls.length === 0) {\n return []\n }\n const postData = {\n client: {\n clientId: 'foreventory',\n clientVersion: '1.0',\n },\n threatInfo: {\n platformTypes: ['WINDOWS', 'LINUX', 'OSX'],\n threatEntries: mutatedUrls.map(url => ({ url })),\n threatEntryTypes: ['URL'],\n threatTypes: ['SOCIAL_ENGINEERING', 'POTENTIALLY_HARMFUL_APPLICATION', 'UNWANTED_SOFTWARE', 'THREAT_TYPE_UNSPECIFIED'],\n },\n }\n const result = (await client.post<GoogleSafeBrowsingResult>(`${endPoint}?key=${key}`, postData, { headers: { referer: 'http://localhost:3000' } }))\n .data\n return result?.matches?.map<GoogleSafeBrowsingMatchPayload>(match => ({ ...match, schema: GoogleSafeBrowsingMatchSchema })) ?? []\n}\n\nexport class UrlSafetyWitness<TParams extends UrlSafetyWitnessParams = UrlSafetyWitnessParams> extends AbstractWitness<TParams> {\n static override readonly configSchemas: Schema[] = [...super.configSchemas, UrlSafetyWitnessConfigSchema]\n static override readonly defaultConfigSchema: Schema = UrlSafetyWitnessConfigSchema\n\n get key() {\n return this.params.google?.safeBrowsing?.key\n }\n\n get urls() {\n return this.config?.urls\n }\n\n protected override async observeHandler(payloads: UrlPayload[] = []): Promise<UrlSafetyPayload[]> {\n const urls: string[]\n = this.urls\n ?? payloads\n .filter((p): p is UrlPayload => p.schema === UrlSchema)\n .map((p) => {\n return p.url\n })\n\n const matches = await checkUrlSafety(urls, { key: this.key })\n\n return urls.map((url) => {\n // eslint-disable-next-line unicorn/no-array-reduce\n const payload = matches.reduce<UrlSafetyPayload>(\n (prev, match) => {\n if (match.threat.url === url) {\n prev.threatTypes = prev.threatTypes ?? []\n if (!prev.threatTypes.includes(match.threatEntryType as UrlSafetyThreatType)) {\n prev.threatTypes.push(match.threatEntryType as UrlSafetyThreatType)\n }\n }\n return prev\n },\n { schema: UrlSafetySchema, url },\n )\n payload.threatTypes = payload.threatTypes?.toSorted()\n return payload\n })\n }\n}\n"],
5
- "mappings": ";AAAA,SAAS,+BAA+B,wBAAwB;AAChE,SAAS,mBAAAA,wBAAuB;;;ACAhC,SAAS,gBAAgB;AACzB,SAAS,uBAAuB;AAEzB,IAAM,+BAA+B,SAAS,GAAG,eAAe,mBAAmB,IAAI;;;ACJ9F,SAAS,uBAAuB;AAChC;AAAA,EACE,YAAAC;AAAA,OACK;AACP,SAAS,uBAAuB;AAEhC,SAAS,iBAAiB;AAE1B,SAAS,mBAAAC,wBAAuB;AAMzB,IAAM,gCAAgCC,UAAS,iCAAiC,IAAI;AAkB3F,IAAM,iBAAiB,OACrB,MACA,WAI8C;AAC9C,QAAM,SAAS,IAAI,gBAAgB;AACnC,QAAM,WAAW,QAAQ,YAAY;AACrC,QAAM,MAAM,QAAQ;AACpB,QAAM,cAAc,KAAK,IAAI,SAAO,IAAI,QAAQ,WAAW,8BAA8B,CAAC;AAC1F,MAAI,YAAY,WAAW,GAAG;AAC5B,WAAO,CAAC;AAAA,EACV;AACA,QAAM,WAAW;AAAA,IACf,QAAQ;AAAA,MACN,UAAU;AAAA,MACV,eAAe;AAAA,IACjB;AAAA,IACA,YAAY;AAAA,MACV,eAAe,CAAC,WAAW,SAAS,KAAK;AAAA,MACzC,eAAe,YAAY,IAAI,UAAQ,EAAE,IAAI,EAAE;AAAA,MAC/C,kBAAkB,CAAC,KAAK;AAAA,MACxB,aAAa,CAAC,sBAAsB,mCAAmC,qBAAqB,yBAAyB;AAAA,IACvH;AAAA,EACF;AACA,QAAM,UAAU,MAAM,OAAO,KAA+B,GAAG,QAAQ,QAAQ,GAAG,IAAI,UAAU,EAAE,SAAS,EAAE,SAAS,wBAAwB,EAAE,CAAC,GAC9I;AACH,SAAO,QAAQ,SAAS,IAAoC,YAAU,EAAE,GAAG,OAAO,QAAQ,8BAA8B,EAAE,KAAK,CAAC;AAClI;AAEO,IAAM,mBAAN,cAAgG,gBAAyB;AAAA,EAC9H,OAAyB,gBAA0B,CAAC,GAAG,MAAM,eAAe,4BAA4B;AAAA,EACxG,OAAyB,sBAA8B;AAAA,EAEvD,IAAI,MAAM;AACR,WAAO,KAAK,OAAO,QAAQ,cAAc;AAAA,EAC3C;AAAA,EAEA,IAAI,OAAO;AACT,WAAO,KAAK,QAAQ;AAAA,EACtB;AAAA,EAEA,MAAyB,eAAe,WAAyB,CAAC,GAAgC;AAChG,UAAM,OACF,KAAK,QACF,SACA,OAAO,CAAC,MAAuB,EAAE,WAAW,SAAS,EACrD,IAAI,CAAC,MAAM;AACV,aAAO,EAAE;AAAA,IACX,CAAC;AAEP,UAAM,UAAU,MAAM,eAAe,MAAM,EAAE,KAAK,KAAK,IAAI,CAAC;AAE5D,WAAO,KAAK,IAAI,CAAC,QAAQ;AAEvB,YAAM,UAAU,QAAQ;AAAA,QACtB,CAAC,MAAM,UAAU;AACf,cAAI,MAAM,OAAO,QAAQ,KAAK;AAC5B,iBAAK,cAAc,KAAK,eAAe,CAAC;AACxC,gBAAI,CAAC,KAAK,YAAY,SAAS,MAAM,eAAsC,GAAG;AAC5E,mBAAK,YAAY,KAAK,MAAM,eAAsC;AAAA,YACpE;AAAA,UACF;AACA,iBAAO;AAAA,QACT;AAAA,QACA,EAAE,QAAQC,kBAAiB,IAAI;AAAA,MACjC;AACA,cAAQ,cAAc,QAAQ,aAAa,SAAS;AACpD,aAAO;AAAA,IACT,CAAC;AAAA,EACH;AACF;;;AFnGO,IAAM,kBAAkB,MAC7B;AAAA,EACE,EAAE,UAAU,EAAE,CAACC,gBAAe,GAAG,EAAE,GAAG,QAAQ,iBAAiB;AAAA,EAC/D;AAAA,IACE,SAAS,OAAO,WAAW;AACzB,YAAM,SAAS,MAAM,iBAAiB,OAAO,MAAM;AACnD,aAAO;AAAA,IACT;AAAA,EACF;AACF;",
4
+ "sourcesContent": ["import { createPayloadSetWitnessPlugin, PayloadSetSchema } from '@xyo-network/sdk-js'\nimport { UrlSafetySchema } from '@xyo-network/url-safety-payload-plugin'\n\nimport { UrlSafetyWitness } from './Witness/index.ts'\n\nexport const UrlSafetyPlugin = () =>\n createPayloadSetWitnessPlugin<UrlSafetyWitness>(\n { required: { [UrlSafetySchema]: 1 }, schema: PayloadSetSchema },\n {\n witness: async (params) => {\n const result = await UrlSafetyWitness.create(params)\n return result\n },\n },\n )\n", "import type { WitnessConfig } from '@xyo-network/sdk-js'\nimport { asSchema } from '@xyo-network/sdk-js'\nimport { UrlSafetySchema } from '@xyo-network/url-safety-payload-plugin'\n\nexport const UrlSafetyWitnessConfigSchema = asSchema(`${UrlSafetySchema}.witness.config`, true)\nexport type UrlSafetyWitnessConfigSchema = typeof UrlSafetyWitnessConfigSchema\n\nexport type UrlSafetyWitnessConfig = WitnessConfig<{\n google?: {\n safeBrowsing?: {\n endPoint?: string\n }\n }\n schema: UrlSafetyWitnessConfigSchema\n urls?: string[]\n}>\n", "import {\n FetchJsonClient,\n zodAsFactory, zodIsFactory, zodToFactory,\n} from '@xylabs/sdk-js'\nimport {\n asSchema, PayloadZodOfSchema, type Schema,\n} from '@xyo-network/sdk-js'\nimport { AbstractWitness } from '@xyo-network/sdk-js'\nimport type { UrlPayload } from '@xyo-network/url-payload-plugin'\nimport { UrlSchema } from '@xyo-network/url-payload-plugin'\nimport type { UrlSafetyPayload, UrlSafetyThreatType } from '@xyo-network/url-safety-payload-plugin'\nimport { UrlSafetySchema } from '@xyo-network/url-safety-payload-plugin'\nimport * as z from 'zod/mini'\n\nimport { UrlSafetyWitnessConfigSchema } from './Config.ts'\nimport type { UrlSafetyWitnessParams } from './Params.ts'\n\nexport type GoogleSafeBrowsingMatchSchema = typeof GoogleSafeBrowsingMatchSchema\nexport const GoogleSafeBrowsingMatchSchema = asSchema('com.google.safebrowsing.match', true)\n\nexport const GoogleSafeBrowsingMatchZod = z.object({\n cacheDuration: z.string(),\n platformType: z.string(),\n threat: z.object({ url: z.string() }),\n threatEntryType: z.string(),\n threatType: z.string(),\n})\n\nexport type GoogleSafeBrowsingMatch = z.infer<typeof GoogleSafeBrowsingMatchZod>\n\nexport const GoogleSafeBrowsingMatchPayloadZod = z.extend(PayloadZodOfSchema(GoogleSafeBrowsingMatchSchema), { ...GoogleSafeBrowsingMatchZod.shape })\n\nexport type GoogleSafeBrowsingMatchPayload = z.infer<typeof GoogleSafeBrowsingMatchPayloadZod>\n\nexport const isGoogleSafeBrowsingMatchPayload = zodIsFactory(GoogleSafeBrowsingMatchPayloadZod)\nexport const asGoogleSafeBrowsingMatchPayload = zodAsFactory(GoogleSafeBrowsingMatchPayloadZod, 'asGoogleSafeBrowsingMatchPayload')\nexport const toGoogleSafeBrowsingMatchPayload = zodToFactory(GoogleSafeBrowsingMatchPayloadZod, 'toGoogleSafeBrowsingMatchPayload')\n\ninterface GoogleSafeBrowsingResult {\n matches?: GoogleSafeBrowsingMatch[]\n}\n\nconst checkUrlSafety = async (\n urls: string[],\n config?: {\n endPoint?: string\n key?: string\n },\n): Promise<GoogleSafeBrowsingMatchPayload[]> => {\n const client = new FetchJsonClient()\n const endPoint = config?.endPoint ?? 'https://safebrowsing.googleapis.com/v4/threatMatches:find'\n const key = config?.key\n const mutatedUrls = urls.map(url => url.replace('ipfs://', 'https://cloudflare-ipfs.com/'))\n if (mutatedUrls.length === 0) {\n return []\n }\n const postData = {\n client: {\n clientId: 'foreventory',\n clientVersion: '1.0',\n },\n threatInfo: {\n platformTypes: ['WINDOWS', 'LINUX', 'OSX'],\n threatEntries: mutatedUrls.map(url => ({ url })),\n threatEntryTypes: ['URL'],\n threatTypes: ['SOCIAL_ENGINEERING', 'POTENTIALLY_HARMFUL_APPLICATION', 'UNWANTED_SOFTWARE', 'THREAT_TYPE_UNSPECIFIED'],\n },\n }\n const response = await client.post<GoogleSafeBrowsingResult>(`${endPoint}?key=${key}`, postData, { headers: { referer: 'http://localhost:3000' } })\n const result = response.data\n return result?.matches?.map<GoogleSafeBrowsingMatchPayload>(match => ({ ...match, schema: GoogleSafeBrowsingMatchSchema })) ?? []\n}\n\nexport class UrlSafetyWitness<TParams extends UrlSafetyWitnessParams = UrlSafetyWitnessParams> extends AbstractWitness<TParams> {\n static override readonly configSchemas: Schema[] = [...super.configSchemas, UrlSafetyWitnessConfigSchema]\n static override readonly defaultConfigSchema: Schema = UrlSafetyWitnessConfigSchema\n\n get key() {\n return this.params.google?.safeBrowsing?.key\n }\n\n get urls() {\n return this.config?.urls\n }\n\n protected override async observeHandler(payloads: UrlPayload[] = []): Promise<UrlSafetyPayload[]> {\n const urls: string[]\n = this.urls\n ?? payloads\n .filter((p): p is UrlPayload => p.schema === UrlSchema)\n .map((p) => {\n return p.url\n })\n\n const matches = await checkUrlSafety(urls, { key: this.key })\n\n return urls.map((url) => {\n // eslint-disable-next-line unicorn/no-array-reduce\n const payload = matches.reduce<UrlSafetyPayload>(\n (prev, match) => {\n if (match.threat.url === url) {\n prev.threatTypes = prev.threatTypes ?? []\n if (!prev.threatTypes.includes(match.threatEntryType as UrlSafetyThreatType)) {\n prev.threatTypes.push(match.threatEntryType as UrlSafetyThreatType)\n }\n }\n return prev\n },\n { schema: UrlSafetySchema, url },\n )\n payload.threatTypes = payload.threatTypes?.toSorted((a, b) => a.localeCompare(b))\n return payload\n })\n }\n}\n"],
5
+ "mappings": "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",
6
6
  "names": ["UrlSafetySchema", "asSchema", "UrlSafetySchema", "asSchema", "UrlSafetySchema", "UrlSafetySchema"]
7
7
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@xyo-network/url-safety-plugin",
3
- "version": "6.0.3",
3
+ "version": "7.0.0",
4
4
  "description": "Typescript/Javascript Plugins for XYO Platform",
5
5
  "homepage": "https://xyo.network",
6
6
  "bugs": {
@@ -31,31 +31,28 @@
31
31
  "README.md"
32
32
  ],
33
33
  "dependencies": {
34
- "@xyo-network/url-payload-plugin": "~6.0.3",
35
- "@xyo-network/url-safety-payload-plugin": "~6.0.3"
34
+ "@xyo-network/url-payload-plugin": "~7.0.0",
35
+ "@xyo-network/url-safety-payload-plugin": "~7.0.0"
36
36
  },
37
37
  "devDependencies": {
38
38
  "@bitauth/libauth": "~3.0.0",
39
39
  "@metamask/providers": "^22.1.1",
40
40
  "@noble/post-quantum": "~0.6.1",
41
41
  "@opentelemetry/api": "^1.9.1",
42
- "@opentelemetry/sdk-trace-base": "^2.7.1",
42
+ "@opentelemetry/sdk-trace-base": "^2.8.0",
43
43
  "@scure/base": "^2.2.0",
44
44
  "@scure/bip39": "~2.2.0",
45
- "@xylabs/geo": "^6.0.8",
46
- "@xylabs/sdk-js": "^6.0.8",
47
- "@xylabs/threads": "^6.0.8",
48
- "@xylabs/toolchain": "~8.1.16",
49
- "@xylabs/tsconfig": "~8.1.16",
50
- "@xyo-network/payload-model": "^6.0.9",
51
- "@xyo-network/sdk-js": "^6.0.4",
52
- "@xyo-network/sdk-protocol-js": "~6.0.9",
45
+ "@xylabs/geo": "^6.1.3",
46
+ "@xylabs/sdk-js": "^6.1.3",
47
+ "@xylabs/threads": "^6.1.3",
48
+ "@xylabs/toolchain": "~8.2.7",
49
+ "@xylabs/tsconfig": "~8.2.7",
50
+ "@xyo-network/sdk-js": "^7.0.0",
51
+ "@xyo-network/sdk-protocol-js": "~7.0",
53
52
  "ajv": "^8.20.0",
54
53
  "async-mutex": "^0.5.0",
55
- "bn.js": "^5.2.3",
56
- "buffer": "^6.0.3",
57
54
  "debug": "~4.4.3",
58
- "eslint": "^10.4.1",
55
+ "eslint": "^10.5.0",
59
56
  "ethers": "^6.16.0",
60
57
  "hash-wasm": "^4.12.0",
61
58
  "idb": "^8.0.3",
@@ -63,7 +60,7 @@
63
60
  "observable-fns": "~0.6.1",
64
61
  "typescript": "~6.0.3",
65
62
  "vite": "^8.0.16",
66
- "vitest": "^4.1.8",
63
+ "vitest": "^4.1.9",
67
64
  "webextension-polyfill": "^0.12.0",
68
65
  "zod": "^4.4.3"
69
66
  },
@@ -78,12 +75,10 @@
78
75
  "@xylabs/geo": "^6.0",
79
76
  "@xylabs/sdk-js": "^6.0",
80
77
  "@xylabs/threads": "^6.0",
81
- "@xyo-network/sdk-js": "^6.0",
82
- "@xyo-network/sdk-protocol-js": "~6.0",
78
+ "@xyo-network/sdk-js": "^7.0",
79
+ "@xyo-network/sdk-protocol-js": "^7.0",
83
80
  "ajv": "^8.20",
84
81
  "async-mutex": "^0.5",
85
- "bn.js": "^5.2",
86
- "buffer": "^6.0",
87
82
  "debug": "~4.4",
88
83
  "ethers": "^6.16",
89
84
  "hash-wasm": "^4.12",
@@ -93,6 +88,9 @@
93
88
  "webextension-polyfill": "^0.12",
94
89
  "zod": "^4.4"
95
90
  },
91
+ "engines": {
92
+ "node": "^24"
93
+ },
96
94
  "publishConfig": {
97
95
  "access": "public"
98
96
  }