deeplinkit 0.2.0 → 0.2.1

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,28 +1,17 @@
1
1
  # deeplinkit
2
2
 
3
- Browser JavaScript SDK. Run this on the page visitors open on their phones.
3
+ Capture browser signals and attach a JSON payload to a visit on your website.
4
4
 
5
- ```js
6
- import { Deeplinkit } from 'deeplinkit';
7
-
8
- const client = new Deeplinkit({ applicationId: 'app_example' });
9
- const link = await client.createLink({ payload: { screen: 'product', id: '123' } });
5
+ ```sh
6
+ npm install deeplinkit
10
7
  ```
11
8
 
12
- Or load directly from the collector:
13
-
14
9
  ```js
15
- const { start } = await import('https://collector.deeplinkit.com/v1/agent/app_example');
16
- const client = start();
17
- const link = await client.createLink({ payload: { screen: 'product', id: '123' } });
18
- ```
19
-
20
- `createLink` records the visitor’s payload and returns `{ id }`. Keep visitors on your own website, then open your app or redirect to its store listing after the call completes. The collector is an SDK backend and does not provide public landing URLs.
21
-
22
- Both use an app-specific loader that selects the collector build at request time. The loader is uncached; selected assets have immutable content-addressed URLs. npm contains only the loader, so collector updates do not require an npm upgrade. Configure CSP to allow the collector origin in `script-src` and `connect-src`.
23
-
24
- For development or a custom collector domain, set `url` to that collector's HTTPS origin. This URL is the collector origin, not the native session API. The application ID is public; no server API key is required. Observations are encrypted with the collector's public key. Failed link submissions are not retried automatically.
10
+ import { Deeplinkit } from 'deeplinkit';
25
11
 
26
- Collector builds are generated by `node scripts/build-browser-package.mjs` (or `npm run build:browser`). Keep previous `public/sdk` builds available through rollouts so existing loader responses can still fetch their pinned assets. Selection currently uses the latest build; `selectCollectorBuild` provides the server hook for future request-based routing. Older npm SDK versions remain bundled and require an npm upgrade to adopt this loader.
12
+ const deeplinkit = new Deeplinkit({ applicationId: 'your_app_id' });
27
13
 
28
- Proprietary software. All rights reserved.
14
+ await deeplinkit.linkVisit({
15
+ payload: { productId: '123' },
16
+ });
17
+ ```
package/index.d.ts CHANGED
@@ -3,5 +3,6 @@ export interface DeepLink { id: string; }
3
3
  /** Run in the visitor's browser. No server API key is required. */
4
4
  export class Deeplinkit {
5
5
  constructor(options: { /** Collector origin override. Defaults to https://collector.deeplinkit.com. */ url?: string; applicationId: string; /** Network timeout in milliseconds; defaults to 10000. */ timeout?: number });
6
- createLink(options: { payload: { [key: string]: JSONValue } }): Promise<DeepLink>;
6
+ linkVisit(options: { payload: { [key: string]: JSONValue } }): Promise<DeepLink>;
7
+ createLink: Deeplinkit["linkVisit"];
7
8
  }
package/index.js CHANGED
@@ -1 +1 @@
1
- function y(o){let t=new Set;function r(e,c=0){if(c>6)throw new TypeError("Payload must be no more than 6 levels deep");if(e===null||typeof e=="string"||typeof e=="boolean"||typeof e=="number"&&Number.isFinite(e))return;if(!e||typeof e!="object"||t.has(e))throw new TypeError("Payload must contain only JSON values");let i=Array.isArray(e),l=Object.getPrototypeOf(e);if(!i&&l!==Object.prototype&&l!==null)throw new TypeError("Payload must contain only plain JSON objects");let s=Reflect.ownKeys(e).filter(a=>!(i&&a==="length"));if(s.some((a,p)=>typeof a!="string"||i&&a!==String(p))||(i?s.length!==e.length||e.length>128:s.length>64))throw new TypeError("Payload has too many properties or invalid JSON values");t.add(e);for(let a of s){let p=Object.getOwnPropertyDescriptor(e,a);if(!p.enumerable||!Object.hasOwn(p,"value"))throw new TypeError("Payload must contain only JSON values");r(p.value,c+1)}t.delete(e)}if(!o||typeof o!="object"||Array.isArray(o))throw new TypeError("Payload must be a JSON object");r(o);let n=JSON.stringify(o);if(n.length>8192)throw new TypeError("Payload exceeds 8192 characters");return n}function w(o){let t;try{t=new URL(o)}catch{throw new TypeError("A valid HTTPS API URL is required")}if(t.protocol!=="https:"||t.username||t.password||t.search||t.hash||t.pathname!=="/")throw new TypeError("An HTTPS origin is required");return t.origin}function h({url:o="https://collector.deeplinkit.com",applicationId:t,timeout:r=1e4}={}){let n=w(o);if(typeof t!="string"||!/^[A-Za-z0-9_-]{1,64}$/.test(t))throw new TypeError("A valid applicationId is required");if(!Number.isInteger(r)||r<1||r>6e4)throw new TypeError("Timeout must be between 1 and 60000 milliseconds");return{url:n,applicationId:t,timeout:r}}function d(o=t=>import(t)){return class{#t;#e;constructor(r){this.#t=h(r)}#r(){return this.#e??=(async()=>{let{url:r,applicationId:n,timeout:e}=this.#t,c;try{let i=await Promise.race([o(`${r}/v1/agent/${n}`),new Promise((l,s)=>{c=setTimeout(()=>s(Object.assign(new Error("Collector loading timed out."),{code:"request_timeout"})),e)})]);return new i.Deeplinkit({timeout:e})}finally{clearTimeout(c)}})().catch(r=>{throw this.#e=void 0,r})}async createLink({payload:r}={}){let n=JSON.parse(y(r));if(Object.hasOwn(n,"app")&&n.app!==this.#t.applicationId)throw new TypeError("Payload app must match applicationId");return y({...n,app:this.#t.applicationId}),(await this.#r()).createLink({payload:n})}}}var g=d();export{g as Deeplinkit,d as createLoader};
1
+ function y(o){let e=new Set;function r(t,c=0){if(c>6)throw new TypeError("Payload must be no more than 6 levels deep");if(t===null||typeof t=="string"||typeof t=="boolean"||typeof t=="number"&&Number.isFinite(t))return;if(!t||typeof t!="object"||e.has(t))throw new TypeError("Payload must contain only JSON values");let i=Array.isArray(t),l=Object.getPrototypeOf(t);if(!i&&l!==Object.prototype&&l!==null)throw new TypeError("Payload must contain only plain JSON objects");let s=Reflect.ownKeys(t).filter(a=>!(i&&a==="length"));if(s.some((a,p)=>typeof a!="string"||i&&a!==String(p))||(i?s.length!==t.length||t.length>128:s.length>64))throw new TypeError("Payload has too many properties or invalid JSON values");e.add(t);for(let a of s){let p=Object.getOwnPropertyDescriptor(t,a);if(!p.enumerable||!Object.hasOwn(p,"value"))throw new TypeError("Payload must contain only JSON values");r(p.value,c+1)}e.delete(t)}if(!o||typeof o!="object"||Array.isArray(o))throw new TypeError("Payload must be a JSON object");r(o);let n=JSON.stringify(o);if(n.length>8192)throw new TypeError("Payload exceeds 8192 characters");return n}function w(o){let e;try{e=new URL(o)}catch{throw new TypeError("A valid HTTPS API URL is required")}if(e.protocol!=="https:"||e.username||e.password||e.search||e.hash||e.pathname!=="/")throw new TypeError("An HTTPS origin is required");return e.origin}function h({url:o="https://collector.deeplinkit.com",applicationId:e,timeout:r=1e4}={}){let n=w(o);if(typeof e!="string"||!/^[A-Za-z0-9_-]{1,64}$/.test(e))throw new TypeError("A valid applicationId is required");if(!Number.isInteger(r)||r<1||r>6e4)throw new TypeError("Timeout must be between 1 and 60000 milliseconds");return{url:n,applicationId:e,timeout:r}}function d(o=e=>import(e)){return class{#t;#e;constructor(r){this.#t=h(r)}#r(){return this.#e??=(async()=>{let{url:r,applicationId:n,timeout:t}=this.#t,c;try{let i=await Promise.race([o(`${r}/v1/agent/${n}`),new Promise((l,s)=>{c=setTimeout(()=>s(Object.assign(new Error("Collector loading timed out."),{code:"request_timeout"})),t)})]);return new i.Deeplinkit({timeout:t})}finally{clearTimeout(c)}})().catch(r=>{throw this.#e=void 0,r})}createLink(r){return this.linkVisit(r)}async linkVisit({payload:r}={}){let n=JSON.parse(y(r));if(Object.hasOwn(n,"app")&&n.app!==this.#t.applicationId)throw new TypeError("Payload app must match applicationId");y({...n,app:this.#t.applicationId});let t=await this.#r();return(t.linkVisit??t.createLink).call(t,{payload:n})}}}var g=d();export{g as Deeplinkit,d as createLoader};
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "deeplinkit",
3
- "version": "0.2.0",
3
+ "version": "0.2.1",
4
4
  "description": "Browser JavaScript SDK for deeplinkit",
5
5
  "type": "module",
6
6
  "main": "index.js",