@osdk/client 2.1.0-beta.26 → 2.1.0-beta.28
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 +21 -0
- package/build/browser/object/convertWireToOsdkObjects/createOsdkObject.js +22 -0
- package/build/browser/object/convertWireToOsdkObjects/createOsdkObject.js.map +1 -1
- package/build/browser/object/object.test.js +172 -11
- package/build/browser/object/object.test.js.map +1 -1
- package/build/browser/objectSet/ObjectSetListenerWebsocket.test.js.map +1 -1
- package/build/browser/util/UserAgent.js +1 -1
- package/build/cjs/{chunk-AMEMEGJZ.cjs → chunk-CL5X2CTM.cjs} +13 -13
- package/build/cjs/{chunk-AMEMEGJZ.cjs.map → chunk-CL5X2CTM.cjs.map} +1 -1
- package/build/cjs/{chunk-HDBAHEBE.cjs → chunk-TCHGLBKJ.cjs} +6 -4
- package/build/cjs/chunk-TCHGLBKJ.cjs.map +1 -0
- package/build/cjs/index.cjs +66 -44
- package/build/cjs/index.cjs.map +1 -1
- package/build/cjs/public/internal.cjs +6 -6
- package/build/cjs/public/unstable-do-not-use.cjs +2 -2
- package/build/esm/object/convertWireToOsdkObjects/createOsdkObject.js +22 -0
- package/build/esm/object/convertWireToOsdkObjects/createOsdkObject.js.map +1 -1
- package/build/esm/object/object.test.js +172 -11
- package/build/esm/object/object.test.js.map +1 -1
- package/build/esm/objectSet/ObjectSetListenerWebsocket.test.js.map +1 -1
- package/build/esm/util/UserAgent.js +1 -1
- package/build/types/object/object.test.d.ts +1 -1
- package/package.json +7 -7
- package/build/cjs/chunk-HDBAHEBE.cjs.map +0 -1
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,26 @@
|
|
|
1
1
|
# @osdk/client
|
|
2
2
|
|
|
3
|
+
## 2.1.0-beta.28
|
|
4
|
+
|
|
5
|
+
### Minor Changes
|
|
6
|
+
|
|
7
|
+
- f446d0c: Exposes $clone from OSDK Object instances
|
|
8
|
+
|
|
9
|
+
### Patch Changes
|
|
10
|
+
|
|
11
|
+
- Updated dependencies [f446d0c]
|
|
12
|
+
- @osdk/api@2.1.0-beta.28
|
|
13
|
+
- @osdk/generator-converters@2.1.0-beta.28
|
|
14
|
+
- @osdk/client.unstable@2.1.0-beta.28
|
|
15
|
+
|
|
16
|
+
## 2.1.0-beta.27
|
|
17
|
+
|
|
18
|
+
### Patch Changes
|
|
19
|
+
|
|
20
|
+
- @osdk/api@2.1.0-beta.27
|
|
21
|
+
- @osdk/client.unstable@2.1.0-beta.27
|
|
22
|
+
- @osdk/generator-converters@2.1.0-beta.27
|
|
23
|
+
|
|
3
24
|
## 2.1.0-beta.26
|
|
4
25
|
|
|
5
26
|
### Minor Changes
|
|
@@ -36,6 +36,28 @@ const basePropDefs = {
|
|
|
36
36
|
get: function () {
|
|
37
37
|
return get$link(this);
|
|
38
38
|
}
|
|
39
|
+
},
|
|
40
|
+
"$clone": {
|
|
41
|
+
value: function (update) {
|
|
42
|
+
const rawObj = this[UnderlyingOsdkObject];
|
|
43
|
+
const def = this[ObjectDefRef];
|
|
44
|
+
if (update == null) {
|
|
45
|
+
return createOsdkObject(this[ClientRef], def, {
|
|
46
|
+
...rawObj
|
|
47
|
+
});
|
|
48
|
+
}
|
|
49
|
+
if (def.primaryKeyApiName in update && rawObj[def.primaryKeyApiName] !== update[def.primaryKeyApiName]) {
|
|
50
|
+
throw new Error(`Cannot update ${def.apiName} object with differing primary key values `);
|
|
51
|
+
}
|
|
52
|
+
if (def.titleProperty in update && !("$title" in update)) {
|
|
53
|
+
update.$title = update[def.titleProperty];
|
|
54
|
+
}
|
|
55
|
+
const newObject = {
|
|
56
|
+
...this[UnderlyingOsdkObject],
|
|
57
|
+
...update
|
|
58
|
+
};
|
|
59
|
+
return createOsdkObject(this[ClientRef], this[ObjectDefRef], newObject);
|
|
60
|
+
}
|
|
39
61
|
}
|
|
40
62
|
};
|
|
41
63
|
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"createOsdkObject.js","names":["invariant","GeotimeSeriesPropertyImpl","MediaReferencePropertyImpl","TimeSeriesPropertyImpl","hydrateAttachmentFromRidInternal","get$as","get$link","ClientRef","ObjectDefRef","UnderlyingOsdkObject","specialPropertyTypes","Set","basePropDefs","get","createOsdkObject","client","objectDef","rawObj","Object","defineProperties","enumerable","value","propKey","keys","properties","type","has","createSpecialProperty","freeze","rawObject","p","rawValue","propDef","process","env","NODE_ENV","Array","isArray","map","a","rid","apiName","primaryKeyApiName","time","timestamp","coordinates","position","undefined","objectApiName","primaryKey","propertyName"],"sources":["createOsdkObject.ts"],"sourcesContent":["/*\n * Copyright 2024 Palantir Technologies, Inc. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport type { ObjectTypeDefinition, Osdk } from \"@osdk/api\";\nimport type { OntologyObjectV2 } from \"@osdk/internal.foundry.core\";\nimport invariant from \"tiny-invariant\";\nimport { GeotimeSeriesPropertyImpl } from \"../../createGeotimeSeriesProperty.js\";\nimport { MediaReferencePropertyImpl } from \"../../createMediaReferenceProperty.js\";\nimport { TimeSeriesPropertyImpl } from \"../../createTimeseriesProperty.js\";\nimport type { MinimalClient } from \"../../MinimalClientContext.js\";\nimport type { FetchedObjectTypeDefinition } from \"../../ontology/OntologyProvider.js\";\nimport { hydrateAttachmentFromRidInternal } from \"../../public-utils/hydrateAttachmentFromRid.js\";\nimport { get$as } from \"./getDollarAs.js\";\nimport { get$link } from \"./getDollarLink.js\";\nimport {\n ClientRef,\n ObjectDefRef,\n UnderlyingOsdkObject,\n} from \"./InternalSymbols.js\";\nimport type { ObjectHolder } from \"./ObjectHolder.js\";\n\ninterface InternalOsdkInstance {\n [ObjectDefRef]: FetchedObjectTypeDefinition;\n [ClientRef]: MinimalClient;\n}\n\nconst specialPropertyTypes = new Set(\n [\n \"attachment\",\n \"geotimeSeriesReference\",\n \"mediaReference\",\n \"numericTimeseries\",\n \"stringTimeseries\",\n \"sensorTimeseries\",\n ],\n);\n\n// kept separate so we are not redefining these functions\n// every time an object is created.\nconst basePropDefs = {\n \"$as\": {\n get: function(this: InternalOsdkInstance) {\n return get$as(this[ObjectDefRef]);\n },\n },\n \"$link\": {\n get: function(this: InternalOsdkInstance & ObjectHolder<any>) {\n return get$link(this);\n },\n },\n};\n\n/** @internal */\nexport function createOsdkObject<\n Q extends FetchedObjectTypeDefinition,\n>(\n client: MinimalClient,\n objectDef: Q,\n rawObj: OntologyObjectV2,\n): Osdk<ObjectTypeDefinition, any> {\n // updates the object's \"hidden class/map\".\n Object.defineProperties(rawObj, {\n [UnderlyingOsdkObject]: {\n enumerable: false,\n value: rawObj,\n },\n [ObjectDefRef]: { value: objectDef, enumerable: false },\n [ClientRef]: { value: client, enumerable: false },\n ...basePropDefs,\n });\n\n // Assign the special values\n for (const propKey of Object.keys(rawObj)) {\n if (\n propKey in objectDef.properties\n && typeof (objectDef.properties[propKey].type) === \"string\"\n && specialPropertyTypes.has(objectDef.properties[propKey].type)\n ) {\n rawObj[propKey] = createSpecialProperty(\n client,\n objectDef,\n rawObj as any,\n propKey,\n );\n }\n }\n\n return Object.freeze(rawObj) as Osdk<ObjectTypeDefinition, any>;\n}\n\nfunction createSpecialProperty(\n client: MinimalClient,\n objectDef: FetchedObjectTypeDefinition,\n rawObject: Osdk.Instance<any>,\n p: keyof typeof rawObject & string | symbol,\n) {\n const rawValue = rawObject[p as any];\n const propDef = objectDef.properties[p as any];\n if (process.env.NODE_ENV !== \"production\") {\n invariant(\n propDef != null && typeof propDef.type === \"string\"\n && specialPropertyTypes.has(propDef.type),\n );\n }\n {\n {\n {\n {\n if (propDef.type === \"attachment\") {\n if (Array.isArray(rawValue)) {\n return rawValue.map(a =>\n hydrateAttachmentFromRidInternal(client, a.rid)\n );\n }\n return hydrateAttachmentFromRidInternal(client, rawValue.rid);\n }\n\n if (\n propDef.type === \"numericTimeseries\"\n || propDef.type === \"stringTimeseries\"\n || propDef.type === \"sensorTimeseries\"\n ) {\n return new TimeSeriesPropertyImpl<\n (typeof propDef)[\"type\"] extends \"numericTimeseries\" ? number\n : (typeof propDef)[\"type\"] extends \"stringTimeseries\" ? string\n : number | string\n >(\n client,\n objectDef.apiName,\n rawObject[objectDef.primaryKeyApiName as string],\n p as string,\n );\n }\n\n if (propDef.type === \"geotimeSeriesReference\") {\n return new GeotimeSeriesPropertyImpl<GeoJSON.Point>(\n client,\n objectDef.apiName,\n rawObject[objectDef.primaryKeyApiName as string],\n p as string,\n rawValue.type === \"geotimeSeriesValue\"\n ? {\n time: rawValue.timestamp,\n value: {\n type: \"Point\",\n coordinates: rawValue.position,\n },\n }\n : undefined,\n );\n }\n if (propDef.type === \"mediaReference\") {\n return new MediaReferencePropertyImpl({\n client,\n objectApiName: objectDef.apiName,\n primaryKey: rawObject[objectDef.primaryKeyApiName as string],\n propertyName: p as string,\n });\n }\n }\n }\n }\n }\n}\n"],"mappings":"AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAIA,OAAOA,SAAS,MAAM,gBAAgB;AACtC,SAASC,yBAAyB,QAAQ,sCAAsC;AAChF,SAASC,0BAA0B,QAAQ,uCAAuC;AAClF,SAASC,sBAAsB,QAAQ,mCAAmC;AAG1E,SAASC,gCAAgC,QAAQ,gDAAgD;AACjG,SAASC,MAAM,QAAQ,kBAAkB;AACzC,SAASC,QAAQ,QAAQ,oBAAoB;AAC7C,SACEC,SAAS,EACTC,YAAY,EACZC,oBAAoB,QACf,sBAAsB;AAQ7B,MAAMC,oBAAoB,GAAG,IAAIC,GAAG,CAClC,CACE,YAAY,EACZ,wBAAwB,EACxB,gBAAgB,EAChB,mBAAmB,EACnB,kBAAkB,EAClB,kBAAkB,CAEtB,CAAC;;AAED;AACA;AACA,MAAMC,YAAY,GAAG;EACnB,KAAK,EAAE;IACLC,GAAG,EAAE,SAAAA,CAAA,EAAqC;MACxC,OAAOR,MAAM,CAAC,IAAI,CAACG,YAAY,CAAC,CAAC;IACnC;EACF,CAAC;EACD,OAAO,EAAE;IACPK,GAAG,EAAE,SAAAA,CAAA,EAAyD;MAC5D,OAAOP,QAAQ,CAAC,IAAI,CAAC;IACvB;EACF;AACF,CAAC;;AAED;AACA,OAAO,SAASQ,gBAAgBA,CAG9BC,MAAqB,EACrBC,SAAY,EACZC,MAAwB,EACS;EACjC;EACAC,MAAM,CAACC,gBAAgB,CAACF,MAAM,EAAE;IAC9B,CAACR,oBAAoB,GAAG;MACtBW,UAAU,EAAE,KAAK;MACjBC,KAAK,EAAEJ;IACT,CAAC;IACD,CAACT,YAAY,GAAG;MAAEa,KAAK,EAAEL,SAAS;MAAEI,UAAU,EAAE;IAAM,CAAC;IACvD,CAACb,SAAS,GAAG;MAAEc,KAAK,EAAEN,MAAM;MAAEK,UAAU,EAAE;IAAM,CAAC;IACjD,GAAGR;EACL,CAAC,CAAC;;EAEF;EACA,KAAK,MAAMU,OAAO,IAAIJ,MAAM,CAACK,IAAI,CAACN,MAAM,CAAC,EAAE;IACzC,IACEK,OAAO,IAAIN,SAAS,CAACQ,UAAU,IAC5B,OAAQR,SAAS,CAACQ,UAAU,CAACF,OAAO,CAAC,CAACG,IAAK,KAAK,QAAQ,IACxDf,oBAAoB,CAACgB,GAAG,CAACV,SAAS,CAACQ,UAAU,CAACF,OAAO,CAAC,CAACG,IAAI,CAAC,EAC/D;MACAR,MAAM,CAACK,OAAO,CAAC,GAAGK,qBAAqB,CACrCZ,MAAM,EACNC,SAAS,EACTC,MAAM,EACNK,OACF,CAAC;IACH;EACF;EAEA,OAAOJ,MAAM,CAACU,MAAM,CAACX,MAAM,CAAC;AAC9B;AAEA,SAASU,qBAAqBA,CAC5BZ,MAAqB,EACrBC,SAAsC,EACtCa,SAA6B,EAC7BC,CAA2C,EAC3C;EACA,MAAMC,QAAQ,GAAGF,SAAS,CAACC,CAAC,CAAQ;EACpC,MAAME,OAAO,GAAGhB,SAAS,CAACQ,UAAU,CAACM,CAAC,CAAQ;EAC9C,IAAIG,OAAO,CAACC,GAAG,CAACC,QAAQ,KAAK,YAAY,EAAE;IACzC,EACEH,OAAO,IAAI,IAAI,IAAI,OAAOA,OAAO,CAACP,IAAI,KAAK,QAAQ,IAC9Cf,oBAAoB,CAACgB,GAAG,CAACM,OAAO,CAACP,IAAI,CAAC,IAAAQ,OAAA,CAAAC,GAAA,CAAAC,QAAA,oBAF7CnC,SAAS,UAATA,SAAS;EAIX;EACA;IACE;MACE;QACE;UACE,IAAIgC,OAAO,CAACP,IAAI,KAAK,YAAY,EAAE;YACjC,IAAIW,KAAK,CAACC,OAAO,CAACN,QAAQ,CAAC,EAAE;cAC3B,OAAOA,QAAQ,CAACO,GAAG,CAACC,CAAC,IACnBnC,gCAAgC,CAACW,MAAM,EAAEwB,CAAC,CAACC,GAAG,CAChD,CAAC;YACH;YACA,OAAOpC,gCAAgC,CAACW,MAAM,EAAEgB,QAAQ,CAACS,GAAG,CAAC;UAC/D;UAEA,IACER,OAAO,CAACP,IAAI,KAAK,mBAAmB,IACjCO,OAAO,CAACP,IAAI,KAAK,kBAAkB,IACnCO,OAAO,CAACP,IAAI,KAAK,kBAAkB,EACtC;YACA,OAAO,IAAItB,sBAAsB,CAK/BY,MAAM,EACNC,SAAS,CAACyB,OAAO,EACjBZ,SAAS,CAACb,SAAS,CAAC0B,iBAAiB,CAAW,EAChDZ,CACF,CAAC;UACH;UAEA,IAAIE,OAAO,CAACP,IAAI,KAAK,wBAAwB,EAAE;YAC7C,OAAO,IAAIxB,yBAAyB,CAClCc,MAAM,EACNC,SAAS,CAACyB,OAAO,EACjBZ,SAAS,CAACb,SAAS,CAAC0B,iBAAiB,CAAW,EAChDZ,CAAC,EACDC,QAAQ,CAACN,IAAI,KAAK,oBAAoB,GAClC;cACAkB,IAAI,EAAEZ,QAAQ,CAACa,SAAS;cACxBvB,KAAK,EAAE;gBACLI,IAAI,EAAE,OAAO;gBACboB,WAAW,EAAEd,QAAQ,CAACe;cACxB;YACF,CAAC,GACCC,SACN,CAAC;UACH;UACA,IAAIf,OAAO,CAACP,IAAI,KAAK,gBAAgB,EAAE;YACrC,OAAO,IAAIvB,0BAA0B,CAAC;cACpCa,MAAM;cACNiC,aAAa,EAAEhC,SAAS,CAACyB,OAAO;cAChCQ,UAAU,EAAEpB,SAAS,CAACb,SAAS,CAAC0B,iBAAiB,CAAW;cAC5DQ,YAAY,EAAEpB;YAChB,CAAC,CAAC;UACJ;QACF;MACF;IACF;EACF;AACF","ignoreList":[]}
|
|
1
|
+
{"version":3,"file":"createOsdkObject.js","names":["invariant","GeotimeSeriesPropertyImpl","MediaReferencePropertyImpl","TimeSeriesPropertyImpl","hydrateAttachmentFromRidInternal","get$as","get$link","ClientRef","ObjectDefRef","UnderlyingOsdkObject","specialPropertyTypes","Set","basePropDefs","get","value","update","rawObj","def","createOsdkObject","primaryKeyApiName","Error","apiName","titleProperty","$title","newObject","client","objectDef","Object","defineProperties","enumerable","propKey","keys","properties","type","has","createSpecialProperty","freeze","rawObject","p","rawValue","propDef","process","env","NODE_ENV","Array","isArray","map","a","rid","time","timestamp","coordinates","position","undefined","objectApiName","primaryKey","propertyName"],"sources":["createOsdkObject.ts"],"sourcesContent":["/*\n * Copyright 2024 Palantir Technologies, Inc. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport type { ObjectTypeDefinition, Osdk } from \"@osdk/api\";\nimport type { OntologyObjectV2 } from \"@osdk/internal.foundry.core\";\nimport invariant from \"tiny-invariant\";\nimport { GeotimeSeriesPropertyImpl } from \"../../createGeotimeSeriesProperty.js\";\nimport { MediaReferencePropertyImpl } from \"../../createMediaReferenceProperty.js\";\nimport { TimeSeriesPropertyImpl } from \"../../createTimeseriesProperty.js\";\nimport type { MinimalClient } from \"../../MinimalClientContext.js\";\nimport type { FetchedObjectTypeDefinition } from \"../../ontology/OntologyProvider.js\";\nimport { hydrateAttachmentFromRidInternal } from \"../../public-utils/hydrateAttachmentFromRid.js\";\nimport { get$as } from \"./getDollarAs.js\";\nimport { get$link } from \"./getDollarLink.js\";\nimport {\n ClientRef,\n ObjectDefRef,\n UnderlyingOsdkObject,\n} from \"./InternalSymbols.js\";\nimport type { ObjectHolder } from \"./ObjectHolder.js\";\n\ninterface InternalOsdkInstance {\n [ObjectDefRef]: FetchedObjectTypeDefinition;\n [ClientRef]: MinimalClient;\n}\n\nconst specialPropertyTypes = new Set(\n [\n \"attachment\",\n \"geotimeSeriesReference\",\n \"mediaReference\",\n \"numericTimeseries\",\n \"stringTimeseries\",\n \"sensorTimeseries\",\n ],\n);\n\n// kept separate so we are not redefining these functions\n// every time an object is created.\nconst basePropDefs = {\n \"$as\": {\n get: function(this: InternalOsdkInstance) {\n return get$as(this[ObjectDefRef]);\n },\n },\n \"$link\": {\n get: function(this: InternalOsdkInstance & ObjectHolder<any>) {\n return get$link(this);\n },\n },\n \"$clone\": {\n value: function(\n this: InternalOsdkInstance & ObjectHolder<any>,\n update: Record<string, any> | undefined,\n ) {\n const rawObj = this[UnderlyingOsdkObject];\n const def = this[ObjectDefRef];\n\n if (update == null) {\n return createOsdkObject(this[ClientRef], def, { ...rawObj });\n }\n\n if (\n def.primaryKeyApiName in update\n && rawObj[def.primaryKeyApiName] !== update[def.primaryKeyApiName]\n ) {\n throw new Error(\n `Cannot update ${def.apiName} object with differing primary key values `,\n );\n }\n\n if (def.titleProperty in update && !(\"$title\" in update)) {\n update.$title = update[def.titleProperty];\n }\n\n const newObject = { ...this[UnderlyingOsdkObject], ...update };\n return createOsdkObject(this[ClientRef], this[ObjectDefRef], newObject);\n },\n },\n};\n\n/** @internal */\nexport function createOsdkObject<\n Q extends FetchedObjectTypeDefinition,\n>(\n client: MinimalClient,\n objectDef: Q,\n rawObj: OntologyObjectV2,\n): Osdk<ObjectTypeDefinition, any> {\n // updates the object's \"hidden class/map\".\n Object.defineProperties(rawObj, {\n [UnderlyingOsdkObject]: {\n enumerable: false,\n value: rawObj,\n },\n [ObjectDefRef]: { value: objectDef, enumerable: false },\n [ClientRef]: { value: client, enumerable: false },\n ...basePropDefs,\n });\n\n // Assign the special values\n for (const propKey of Object.keys(rawObj)) {\n if (\n propKey in objectDef.properties\n && typeof (objectDef.properties[propKey].type) === \"string\"\n && specialPropertyTypes.has(objectDef.properties[propKey].type)\n ) {\n rawObj[propKey] = createSpecialProperty(\n client,\n objectDef,\n rawObj as any,\n propKey,\n );\n }\n }\n\n return Object.freeze(rawObj) as Osdk<ObjectTypeDefinition, any>;\n}\n\nfunction createSpecialProperty(\n client: MinimalClient,\n objectDef: FetchedObjectTypeDefinition,\n rawObject: Osdk.Instance<any>,\n p: keyof typeof rawObject & string | symbol,\n) {\n const rawValue = rawObject[p as any];\n const propDef = objectDef.properties[p as any];\n if (process.env.NODE_ENV !== \"production\") {\n invariant(\n propDef != null && typeof propDef.type === \"string\"\n && specialPropertyTypes.has(propDef.type),\n );\n }\n {\n {\n {\n {\n if (propDef.type === \"attachment\") {\n if (Array.isArray(rawValue)) {\n return rawValue.map(a =>\n hydrateAttachmentFromRidInternal(client, a.rid)\n );\n }\n return hydrateAttachmentFromRidInternal(client, rawValue.rid);\n }\n\n if (\n propDef.type === \"numericTimeseries\"\n || propDef.type === \"stringTimeseries\"\n || propDef.type === \"sensorTimeseries\"\n ) {\n return new TimeSeriesPropertyImpl<\n (typeof propDef)[\"type\"] extends \"numericTimeseries\" ? number\n : (typeof propDef)[\"type\"] extends \"stringTimeseries\" ? string\n : number | string\n >(\n client,\n objectDef.apiName,\n rawObject[objectDef.primaryKeyApiName as string],\n p as string,\n );\n }\n\n if (propDef.type === \"geotimeSeriesReference\") {\n return new GeotimeSeriesPropertyImpl<GeoJSON.Point>(\n client,\n objectDef.apiName,\n rawObject[objectDef.primaryKeyApiName as string],\n p as string,\n rawValue.type === \"geotimeSeriesValue\"\n ? {\n time: rawValue.timestamp,\n value: {\n type: \"Point\",\n coordinates: rawValue.position,\n },\n }\n : undefined,\n );\n }\n if (propDef.type === \"mediaReference\") {\n return new MediaReferencePropertyImpl({\n client,\n objectApiName: objectDef.apiName,\n primaryKey: rawObject[objectDef.primaryKeyApiName as string],\n propertyName: p as string,\n });\n }\n }\n }\n }\n }\n}\n"],"mappings":"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","ignoreList":[]}
|
|
@@ -16,8 +16,10 @@
|
|
|
16
16
|
|
|
17
17
|
import { $Objects, $ontologyRid, Employee } from "@osdk/client.test.ontology";
|
|
18
18
|
import { apiServer, stubData, withoutRid } from "@osdk/shared.test";
|
|
19
|
-
import { afterAll, beforeAll, describe, expect, it } from "vitest";
|
|
19
|
+
import { afterAll, beforeAll, describe, expect, expectTypeOf, it } from "vitest";
|
|
20
|
+
import { additionalContext } from "../Client.js";
|
|
20
21
|
import { createClient } from "../createClient.js";
|
|
22
|
+
import { createOsdkObject } from "./convertWireToOsdkObjects/createOsdkObject.js";
|
|
21
23
|
function asV2Object(o, includeRid) {
|
|
22
24
|
o = includeRid ? {
|
|
23
25
|
...o
|
|
@@ -32,17 +34,17 @@ function asV2Object(o, includeRid) {
|
|
|
32
34
|
return o;
|
|
33
35
|
}
|
|
34
36
|
describe("OsdkObject", () => {
|
|
37
|
+
let client;
|
|
38
|
+
let customEntryPointClient;
|
|
39
|
+
beforeAll(async () => {
|
|
40
|
+
apiServer.listen();
|
|
41
|
+
client = createClient("https://stack.palantir.com", $ontologyRid, async () => "myAccessToken");
|
|
42
|
+
customEntryPointClient = createClient("https://stack.palantirCustom.com/foo/first/someStuff", $ontologyRid, async () => "myAccessToken");
|
|
43
|
+
});
|
|
44
|
+
afterAll(() => {
|
|
45
|
+
apiServer.close();
|
|
46
|
+
});
|
|
35
47
|
describe("link", () => {
|
|
36
|
-
let client;
|
|
37
|
-
let customEntryPointClient;
|
|
38
|
-
beforeAll(async () => {
|
|
39
|
-
apiServer.listen();
|
|
40
|
-
client = createClient("https://stack.palantir.com", $ontologyRid, async () => "myAccessToken");
|
|
41
|
-
customEntryPointClient = createClient("https://stack.palantirCustom.com/foo/first/someStuff", $ontologyRid, async () => "myAccessToken");
|
|
42
|
-
});
|
|
43
|
-
afterAll(() => {
|
|
44
|
-
apiServer.close();
|
|
45
|
-
});
|
|
46
48
|
it("loads an employee", async () => {
|
|
47
49
|
const result = await client(Employee).where({
|
|
48
50
|
employeeId: stubData.employee1.employeeId
|
|
@@ -169,6 +171,165 @@ describe("OsdkObject", () => {
|
|
|
169
171
|
expect(objects.sort()).toStrictEqual(["BgaoNflPlayer", "Employee", "ObjectWithTimestampPrimaryKey", "Office", "Person", "Task", "Todo", "equipment", "objectTypeWithAllPropertyTypes"].sort());
|
|
170
172
|
});
|
|
171
173
|
});
|
|
174
|
+
describe("clone", () => {
|
|
175
|
+
let employee;
|
|
176
|
+
beforeAll(async () => {
|
|
177
|
+
employee = (await client(Employee).where({
|
|
178
|
+
employeeId: stubData.employee2.employeeId
|
|
179
|
+
}).fetchPage()).data[0];
|
|
180
|
+
expect(employee).toMatchObject({
|
|
181
|
+
"$apiName": "Employee",
|
|
182
|
+
"$objectType": "Employee",
|
|
183
|
+
"$primaryKey": 50031,
|
|
184
|
+
"$title": "Jane Doe",
|
|
185
|
+
"class": "Blue",
|
|
186
|
+
"employeeId": 50031,
|
|
187
|
+
"fullName": "Jane Doe",
|
|
188
|
+
"office": "SEA",
|
|
189
|
+
"startDate": "2012-02-12"
|
|
190
|
+
});
|
|
191
|
+
});
|
|
192
|
+
it("clones and updates an object with another osdk object", async () => {
|
|
193
|
+
const updatedEmployee = createOsdkObject(client[additionalContext], {
|
|
194
|
+
"apiName": "Employee",
|
|
195
|
+
"primaryKeyType": "integer",
|
|
196
|
+
"primaryKeyApiName": "employeeId",
|
|
197
|
+
"properties": {
|
|
198
|
+
"class": {
|
|
199
|
+
"type": "string"
|
|
200
|
+
},
|
|
201
|
+
"employeeId": {
|
|
202
|
+
"type": "integer"
|
|
203
|
+
},
|
|
204
|
+
"fullName": {
|
|
205
|
+
"type": "string"
|
|
206
|
+
},
|
|
207
|
+
"office": {
|
|
208
|
+
"type": "string"
|
|
209
|
+
}
|
|
210
|
+
}
|
|
211
|
+
}, {
|
|
212
|
+
"$apiName": "Employee",
|
|
213
|
+
"$objectType": "Employee",
|
|
214
|
+
"$primaryKey": 50031,
|
|
215
|
+
"$title": "Jane Doe",
|
|
216
|
+
"class": "Red",
|
|
217
|
+
"employeeId": 50031,
|
|
218
|
+
"fullName": "Jane Doe",
|
|
219
|
+
"office": "NYC"
|
|
220
|
+
});
|
|
221
|
+
const mergedEmployee = employee.$clone(updatedEmployee);
|
|
222
|
+
expectTypeOf(mergedEmployee).toEqualTypeOf(employee);
|
|
223
|
+
expect(mergedEmployee).toMatchInlineSnapshot(`
|
|
224
|
+
{
|
|
225
|
+
"$apiName": "Employee",
|
|
226
|
+
"$objectType": "Employee",
|
|
227
|
+
"$primaryKey": 50031,
|
|
228
|
+
"$title": "Jane Doe",
|
|
229
|
+
"class": "Red",
|
|
230
|
+
"employeeId": 50031,
|
|
231
|
+
"employeeLocation": GeotimeSeriesPropertyImpl {
|
|
232
|
+
"lastFetchedValue": undefined,
|
|
233
|
+
},
|
|
234
|
+
"employeeSensor": TimeSeriesPropertyImpl {},
|
|
235
|
+
"employeeStatus": TimeSeriesPropertyImpl {},
|
|
236
|
+
"fullName": "Jane Doe",
|
|
237
|
+
"office": "NYC",
|
|
238
|
+
"startDate": "2012-02-12",
|
|
239
|
+
}
|
|
240
|
+
`);
|
|
241
|
+
});
|
|
242
|
+
it("correctly scopes up with another OSDK object", async () => {
|
|
243
|
+
expectTypeOf({
|
|
244
|
+
$clone: () => {}
|
|
245
|
+
}.$clone(employee)).toMatchTypeOf();
|
|
246
|
+
});
|
|
247
|
+
it("Correctly preserves keys from original and new with distinct property key sets", async () => {
|
|
248
|
+
expectTypeOf({
|
|
249
|
+
$clone: () => {}
|
|
250
|
+
}.$clone({})).toMatchTypeOf();
|
|
251
|
+
});
|
|
252
|
+
it("clones and updates an object with a record", async () => {
|
|
253
|
+
const mergedEmployee = employee.$clone({
|
|
254
|
+
"class": "Green",
|
|
255
|
+
"employeeId": 50031,
|
|
256
|
+
"fullName": "John Doe",
|
|
257
|
+
"office": "SEA",
|
|
258
|
+
"startDate": "2019-01-01"
|
|
259
|
+
});
|
|
260
|
+
expect(mergedEmployee).toMatchInlineSnapshot(`
|
|
261
|
+
{
|
|
262
|
+
"$apiName": "Employee",
|
|
263
|
+
"$objectType": "Employee",
|
|
264
|
+
"$primaryKey": 50031,
|
|
265
|
+
"$title": "John Doe",
|
|
266
|
+
"class": "Green",
|
|
267
|
+
"employeeId": 50031,
|
|
268
|
+
"employeeLocation": GeotimeSeriesPropertyImpl {
|
|
269
|
+
"lastFetchedValue": undefined,
|
|
270
|
+
},
|
|
271
|
+
"employeeSensor": TimeSeriesPropertyImpl {},
|
|
272
|
+
"employeeStatus": TimeSeriesPropertyImpl {},
|
|
273
|
+
"fullName": "John Doe",
|
|
274
|
+
"office": "SEA",
|
|
275
|
+
"startDate": "2019-01-01",
|
|
276
|
+
}
|
|
277
|
+
`);
|
|
278
|
+
});
|
|
279
|
+
it("correctly scopes up with a record", async () => {
|
|
280
|
+
expectTypeOf({
|
|
281
|
+
$clone: () => {}
|
|
282
|
+
}.$clone({
|
|
283
|
+
"class": "Green",
|
|
284
|
+
"employeeId": 50031,
|
|
285
|
+
"fullName": "John Doe",
|
|
286
|
+
"office": "SEA",
|
|
287
|
+
"startDate": "2019-01-01"
|
|
288
|
+
})).toMatchTypeOf();
|
|
289
|
+
});
|
|
290
|
+
it("correctly sets title", async () => {
|
|
291
|
+
const mergedEmployee = employee.$clone({
|
|
292
|
+
"fullName": "Brad Pitt"
|
|
293
|
+
});
|
|
294
|
+
expect(mergedEmployee).toMatchInlineSnapshot(`
|
|
295
|
+
{
|
|
296
|
+
"$apiName": "Employee",
|
|
297
|
+
"$objectType": "Employee",
|
|
298
|
+
"$primaryKey": 50031,
|
|
299
|
+
"$title": "Brad Pitt",
|
|
300
|
+
"class": "Blue",
|
|
301
|
+
"employeeId": 50031,
|
|
302
|
+
"employeeLocation": GeotimeSeriesPropertyImpl {
|
|
303
|
+
"lastFetchedValue": undefined,
|
|
304
|
+
},
|
|
305
|
+
"employeeSensor": TimeSeriesPropertyImpl {},
|
|
306
|
+
"employeeStatus": TimeSeriesPropertyImpl {},
|
|
307
|
+
"fullName": "Brad Pitt",
|
|
308
|
+
"office": "SEA",
|
|
309
|
+
"startDate": "2012-02-12",
|
|
310
|
+
}
|
|
311
|
+
`);
|
|
312
|
+
});
|
|
313
|
+
it("is able to clone with nothing passed in", async () => {
|
|
314
|
+
expect(employee.$clone()).toMatchObject({
|
|
315
|
+
"$apiName": "Employee",
|
|
316
|
+
"$objectType": "Employee",
|
|
317
|
+
"$primaryKey": 50031,
|
|
318
|
+
"$title": "Jane Doe",
|
|
319
|
+
"class": "Blue",
|
|
320
|
+
"employeeId": 50031,
|
|
321
|
+
"fullName": "Jane Doe",
|
|
322
|
+
"office": "SEA",
|
|
323
|
+
"startDate": "2012-02-12"
|
|
324
|
+
});
|
|
325
|
+
});
|
|
326
|
+
it("throws when merging objects with different primary keys", async () => {
|
|
327
|
+
expect(() => employee.$clone({
|
|
328
|
+
"class": "Green",
|
|
329
|
+
"employeeId": 50035
|
|
330
|
+
})).toThrow();
|
|
331
|
+
});
|
|
332
|
+
});
|
|
172
333
|
});
|
|
173
334
|
export async function shouldError(client) {
|
|
174
335
|
// @ts-expect-error
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"object.test.js","names":["$Objects","$ontologyRid","Employee","apiServer","stubData","withoutRid","afterAll","beforeAll","describe","expect","it","createClient","asV2Object","o","includeRid","$apiName","__apiName","$objectType","$primaryKey","__primaryKey","$title","__title","client","customEntryPointClient","listen","close","result","where","employeeId","employee1","fetchPage","employee","data","JSON","stringify","toBeDefined","toMatchObject","anything","startDate","Object","keys","$link","lead","fetchOne","$select","toBe","employee2","employeeStatus","toBeUndefined","employees","$and","peepsResult","peeps","toHaveLength","nextPageToken","office","peep","$includeRid","leadRid","$rid","objects","sort","toStrictEqual","shouldError","shouldError2","shouldCompile_client_fetchOne_old_select","shouldCompile_unstableClient_fetchOne_old_select","shouldCompile_client_fetchOne_new_select","shouldCompile_unstableClient_fetchOne_new_select","shouldCompile_client_fetchOne_old_noArgs","shouldCompile_unstableClient_fetchOne_noArgs"],"sources":["object.test.ts"],"sourcesContent":["/*\n * Copyright 2023 Palantir Technologies, Inc. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport type { Osdk } from \"@osdk/api\";\nimport { $Objects, $ontologyRid, Employee } from \"@osdk/client.test.ontology\";\nimport { apiServer, stubData, withoutRid } from \"@osdk/shared.test\";\nimport { afterAll, beforeAll, describe, expect, it } from \"vitest\";\nimport type { Client } from \"../Client.js\";\nimport { createClient } from \"../createClient.js\";\n\nfunction asV2Object(o: any, includeRid?: boolean) {\n o = includeRid ? { ...o } : withoutRid(o);\n o.$apiName = o.__apiName;\n o.$objectType = o.__apiName;\n o.$primaryKey = o.__primaryKey;\n o.$title = o.__title;\n delete o.__apiName;\n delete o.__primaryKey;\n delete o.__title;\n return o;\n}\n\ndescribe(\"OsdkObject\", () => {\n describe(\"link\", () => {\n let client: Client;\n let customEntryPointClient: Client;\n\n beforeAll(async () => {\n apiServer.listen();\n client = createClient(\n \"https://stack.palantir.com\",\n $ontologyRid,\n async () => \"myAccessToken\",\n );\n customEntryPointClient = createClient(\n \"https://stack.palantirCustom.com/foo/first/someStuff\",\n $ontologyRid,\n async () => \"myAccessToken\",\n );\n });\n\n afterAll(() => {\n apiServer.close();\n });\n\n it(\"loads an employee\", async () => {\n const result = await client(Employee).where({\n employeeId: stubData.employee1.employeeId,\n }).fetchPage();\n\n // we should get the employee we requested\n const employee = result.data[0];\n expect(JSON.stringify(employee)).toBeDefined();\n expect(employee).toMatchObject({\n \"$apiName\": \"Employee\",\n \"$objectType\": \"Employee\",\n \"$primaryKey\": 50030,\n \"class\": \"Red\",\n \"employeeId\": 50030,\n \"employeeStatus\": expect.anything(),\n \"fullName\": \"John Doe\",\n \"office\": \"NYC\",\n \"startDate\": \"2019-01-01\",\n });\n\n employee.startDate;\n\n // it should have the prototype that we assign at hydration time\n expect(Object.keys(employee.$link.lead)).toBeDefined();\n });\n it(\"loads an employee with custom client\", async () => {\n const result = await customEntryPointClient(Employee).where({\n employeeId: stubData.employee1.employeeId,\n }).fetchPage();\n\n // we should get the employee we requested\n const employee = result.data[0];\n expect(JSON.stringify(employee)).toBeDefined();\n expect(employee).toMatchObject({\n \"$apiName\": \"Employee\",\n \"$objectType\": \"Employee\",\n \"$primaryKey\": 50030,\n \"class\": \"Red\",\n \"employeeId\": 50030,\n \"employeeStatus\": expect.anything(),\n \"fullName\": \"John Doe\",\n \"office\": \"NYC\",\n \"startDate\": \"2019-01-01\",\n });\n\n employee.startDate;\n\n // it should have the prototype that we assign at hydration time\n expect(Object.keys(employee.$link.lead)).toBeDefined();\n });\n\n it(\"traverses the link from an employee to their lead\", async () => {\n const result = await client(Employee).where({\n employeeId: stubData.employee1.employeeId,\n }).fetchPage();\n const employee = result.data[0];\n\n const lead = await employee.$link.lead.fetchOne({\n $select: [\"employeeId\"],\n });\n expect(lead.employeeId).toBe(stubData.employee2.employeeId);\n\n // ensure that the select was performed\n expect(lead.employeeId).toBeDefined();\n expect((lead as any).employeeStatus).toBeUndefined();\n });\n\n it(\"traverses the link from an lead to their peeps\", async () => {\n // slightly weird request here to hit the existing mocks for employee2\n const employees = await client(Employee).where({\n $and: [\n { \"employeeId\": { \"$gt\": 50030 } },\n { \"employeeId\": { \"$lt\": 50032 } },\n ],\n }).fetchPage();\n const lead = employees.data[0];\n expect(lead).toBeDefined();\n\n const peepsResult = await lead.$link.peeps.fetchPage({\n $select: [\"fullName\", \"employeeId\"],\n });\n expect(peepsResult.data).toHaveLength(2);\n expect(peepsResult.nextPageToken).toBeUndefined();\n\n // ensure that the select was performed\n expect(peepsResult.data[0]!.employeeId).toBeDefined();\n expect((peepsResult.data[0] as any).office).toBeUndefined();\n });\n\n it(\"traverses the link from an lead to their peep by primaryKey with fetchOne\", async () => {\n // slightly weird request here to hit the existing mocks for employee2\n const employees = await client(Employee).where({\n $and: [\n { \"employeeId\": { \"$gt\": 50030 } },\n { \"employeeId\": { \"$lt\": 50032 } },\n ],\n }).fetchPage();\n const lead = employees.data[0];\n expect(lead).toBeDefined();\n\n const peep = await lead.$link.peeps.fetchOne(\n stubData.employee1.employeeId,\n {\n $select: [\"employeeId\"],\n },\n );\n expect(peep).toBeDefined();\n\n // ensure that select worked\n expect(peep.employeeId).toBeDefined();\n expect((peep as any).employeeStatus).toBeUndefined();\n });\n it(\"gives $rid access when requested\", async () => {\n const result = await client(Employee).where({\n employeeId: stubData.employee1.employeeId,\n }).fetchPage(\n {\n $includeRid: true,\n },\n );\n const leadRid = result.data[0].$rid;\n expect(leadRid).toBeDefined();\n expect(leadRid).toBe(\n \"ri.phonograph2-objects.main.object.88a6fccb-f333-46d6-a07e-7725c5f18b61\",\n );\n });\n it(\"objects are enumerable in an sdk\", async () => {\n const objects = Object.keys($Objects);\n expect(objects.sort()).toStrictEqual([\n \"BgaoNflPlayer\",\n \"Employee\",\n \"ObjectWithTimestampPrimaryKey\",\n \"Office\",\n \"Person\",\n \"Task\",\n \"Todo\",\n \"equipment\",\n \"objectTypeWithAllPropertyTypes\",\n ].sort());\n });\n });\n});\n\nexport async function shouldError(client: Client): Promise<Osdk<Employee>> {\n // @ts-expect-error\n return client(Employee).fetchOne(1, {\n $select: [\"employeeId\"],\n });\n}\n\nexport async function shouldError2(\n client: Client,\n): Promise<Employee.OsdkObject> {\n // @ts-expect-error\n return client(Employee).fetchOne(1, {\n $select: [\"employeeId\"],\n });\n}\n\nexport async function shouldCompile_client_fetchOne_old_select(\n client: Client,\n): Promise<Osdk<Employee, \"employeeId\">> {\n return client(Employee).fetchOne(1, {\n $select: [\"employeeId\"],\n });\n}\n\nexport async function shouldCompile_unstableClient_fetchOne_old_select(\n client: Client,\n): Promise<Osdk<Employee, \"employeeId\">> {\n return client(Employee).fetchOne(1, {\n $select: [\"employeeId\"],\n });\n}\n\nexport async function shouldCompile_client_fetchOne_new_select(\n client: Client,\n): Promise<Employee.OsdkObject<never, \"employeeId\">> {\n return client(Employee).fetchOne(1, {\n $select: [\"employeeId\"],\n });\n}\n\nexport async function shouldCompile_unstableClient_fetchOne_new_select(\n client: Client,\n): Promise<Osdk<Employee, \"employeeId\">> {\n return client(Employee).fetchOne(1, {\n $select: [\"employeeId\"],\n });\n}\n\nexport async function shouldCompile_client_fetchOne_old_noArgs(\n client: Client,\n): Promise<Osdk<Employee>> {\n return client(Employee).fetchOne(1);\n}\n\nexport async function shouldCompile_unstableClient_fetchOne_noArgs(\n client: Client,\n): Promise<Osdk<Employee>> {\n return client(Employee).fetchOne(1);\n}\n"],"mappings":"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","ignoreList":[]}
|
|
1
|
+
{"version":3,"file":"object.test.js","names":["$Objects","$ontologyRid","Employee","apiServer","stubData","withoutRid","afterAll","beforeAll","describe","expect","expectTypeOf","it","additionalContext","createClient","createOsdkObject","asV2Object","o","includeRid","$apiName","__apiName","$objectType","$primaryKey","__primaryKey","$title","__title","client","customEntryPointClient","listen","close","result","where","employeeId","employee1","fetchPage","employee","data","JSON","stringify","toBeDefined","toMatchObject","anything","startDate","Object","keys","$link","lead","fetchOne","$select","toBe","employee2","employeeStatus","toBeUndefined","employees","$and","peepsResult","peeps","toHaveLength","nextPageToken","office","peep","$includeRid","leadRid","$rid","objects","sort","toStrictEqual","updatedEmployee","mergedEmployee","$clone","toEqualTypeOf","toMatchInlineSnapshot","toMatchTypeOf","toThrow","shouldError","shouldError2","shouldCompile_client_fetchOne_old_select","shouldCompile_unstableClient_fetchOne_old_select","shouldCompile_client_fetchOne_new_select","shouldCompile_unstableClient_fetchOne_new_select","shouldCompile_client_fetchOne_old_noArgs","shouldCompile_unstableClient_fetchOne_noArgs"],"sources":["object.test.ts"],"sourcesContent":["/*\n * Copyright 2023 Palantir Technologies, Inc. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport type { Osdk, PropertyKeys } from \"@osdk/api\";\nimport { $Objects, $ontologyRid, Employee } from \"@osdk/client.test.ontology\";\nimport { apiServer, stubData, withoutRid } from \"@osdk/shared.test\";\nimport {\n afterAll,\n beforeAll,\n describe,\n expect,\n expectTypeOf,\n it,\n} from \"vitest\";\nimport { additionalContext, type Client } from \"../Client.js\";\nimport { createClient } from \"../createClient.js\";\nimport { createOsdkObject } from \"./convertWireToOsdkObjects/createOsdkObject.js\";\n\nfunction asV2Object(o: any, includeRid?: boolean) {\n o = includeRid ? { ...o } : withoutRid(o);\n o.$apiName = o.__apiName;\n o.$objectType = o.__apiName;\n o.$primaryKey = o.__primaryKey;\n o.$title = o.__title;\n delete o.__apiName;\n delete o.__primaryKey;\n delete o.__title;\n return o;\n}\n\ndescribe(\"OsdkObject\", () => {\n let client: Client;\n let customEntryPointClient: Client;\n\n beforeAll(async () => {\n apiServer.listen();\n client = createClient(\n \"https://stack.palantir.com\",\n $ontologyRid,\n async () => \"myAccessToken\",\n );\n customEntryPointClient = createClient(\n \"https://stack.palantirCustom.com/foo/first/someStuff\",\n $ontologyRid,\n async () => \"myAccessToken\",\n );\n });\n\n afterAll(() => {\n apiServer.close();\n });\n describe(\"link\", () => {\n it(\"loads an employee\", async () => {\n const result = await client(Employee).where({\n employeeId: stubData.employee1.employeeId,\n }).fetchPage();\n\n // we should get the employee we requested\n const employee = result.data[0];\n expect(JSON.stringify(employee)).toBeDefined();\n expect(employee).toMatchObject({\n \"$apiName\": \"Employee\",\n \"$objectType\": \"Employee\",\n \"$primaryKey\": 50030,\n \"class\": \"Red\",\n \"employeeId\": 50030,\n \"employeeStatus\": expect.anything(),\n \"fullName\": \"John Doe\",\n \"office\": \"NYC\",\n \"startDate\": \"2019-01-01\",\n });\n\n employee.startDate;\n\n // it should have the prototype that we assign at hydration time\n expect(Object.keys(employee.$link.lead)).toBeDefined();\n });\n it(\"loads an employee with custom client\", async () => {\n const result = await customEntryPointClient(Employee).where({\n employeeId: stubData.employee1.employeeId,\n }).fetchPage();\n\n // we should get the employee we requested\n const employee = result.data[0];\n expect(JSON.stringify(employee)).toBeDefined();\n expect(employee).toMatchObject({\n \"$apiName\": \"Employee\",\n \"$objectType\": \"Employee\",\n \"$primaryKey\": 50030,\n \"class\": \"Red\",\n \"employeeId\": 50030,\n \"employeeStatus\": expect.anything(),\n \"fullName\": \"John Doe\",\n \"office\": \"NYC\",\n \"startDate\": \"2019-01-01\",\n });\n\n employee.startDate;\n\n // it should have the prototype that we assign at hydration time\n expect(Object.keys(employee.$link.lead)).toBeDefined();\n });\n\n it(\"traverses the link from an employee to their lead\", async () => {\n const result = await client(Employee).where({\n employeeId: stubData.employee1.employeeId,\n }).fetchPage();\n const employee = result.data[0];\n\n const lead = await employee.$link.lead.fetchOne({\n $select: [\"employeeId\"],\n });\n expect(lead.employeeId).toBe(stubData.employee2.employeeId);\n\n // ensure that the select was performed\n expect(lead.employeeId).toBeDefined();\n expect((lead as any).employeeStatus).toBeUndefined();\n });\n\n it(\"traverses the link from an lead to their peeps\", async () => {\n // slightly weird request here to hit the existing mocks for employee2\n const employees = await client(Employee).where({\n $and: [\n { \"employeeId\": { \"$gt\": 50030 } },\n { \"employeeId\": { \"$lt\": 50032 } },\n ],\n }).fetchPage();\n const lead = employees.data[0];\n expect(lead).toBeDefined();\n\n const peepsResult = await lead.$link.peeps.fetchPage({\n $select: [\"fullName\", \"employeeId\"],\n });\n expect(peepsResult.data).toHaveLength(2);\n expect(peepsResult.nextPageToken).toBeUndefined();\n\n // ensure that the select was performed\n expect(peepsResult.data[0]!.employeeId).toBeDefined();\n expect((peepsResult.data[0] as any).office).toBeUndefined();\n });\n\n it(\"traverses the link from an lead to their peep by primaryKey with fetchOne\", async () => {\n // slightly weird request here to hit the existing mocks for employee2\n const employees = await client(Employee).where({\n $and: [\n { \"employeeId\": { \"$gt\": 50030 } },\n { \"employeeId\": { \"$lt\": 50032 } },\n ],\n }).fetchPage();\n const lead = employees.data[0];\n expect(lead).toBeDefined();\n\n const peep = await lead.$link.peeps.fetchOne(\n stubData.employee1.employeeId,\n {\n $select: [\"employeeId\"],\n },\n );\n expect(peep).toBeDefined();\n\n // ensure that select worked\n expect(peep.employeeId).toBeDefined();\n expect((peep as any).employeeStatus).toBeUndefined();\n });\n it(\"gives $rid access when requested\", async () => {\n const result = await client(Employee).where({\n employeeId: stubData.employee1.employeeId,\n }).fetchPage(\n {\n $includeRid: true,\n },\n );\n const leadRid = result.data[0].$rid;\n expect(leadRid).toBeDefined();\n expect(leadRid).toBe(\n \"ri.phonograph2-objects.main.object.88a6fccb-f333-46d6-a07e-7725c5f18b61\",\n );\n });\n it(\"objects are enumerable in an sdk\", async () => {\n const objects = Object.keys($Objects);\n expect(objects.sort()).toStrictEqual([\n \"BgaoNflPlayer\",\n \"Employee\",\n \"ObjectWithTimestampPrimaryKey\",\n \"Office\",\n \"Person\",\n \"Task\",\n \"Todo\",\n \"equipment\",\n \"objectTypeWithAllPropertyTypes\",\n ].sort());\n });\n });\n describe(\"clone\", () => {\n let employee: Osdk.Instance<\n $Objects.Employee,\n never,\n PropertyKeys<$Objects.Employee>\n >;\n beforeAll(async () => {\n employee = (await client(Employee).where({\n employeeId: stubData.employee2.employeeId,\n }).fetchPage()).data[0];\n\n expect(employee).toMatchObject({\n \"$apiName\": \"Employee\",\n \"$objectType\": \"Employee\",\n \"$primaryKey\": 50031,\n \"$title\": \"Jane Doe\",\n \"class\": \"Blue\",\n \"employeeId\": 50031,\n \"fullName\": \"Jane Doe\",\n \"office\": \"SEA\",\n \"startDate\": \"2012-02-12\",\n });\n });\n\n it(\"clones and updates an object with another osdk object\", async () => {\n const updatedEmployee = createOsdkObject(\n client[additionalContext],\n {\n \"apiName\": \"Employee\",\n \"primaryKeyType\": \"integer\",\n \"primaryKeyApiName\": \"employeeId\",\n \"properties\": {\n \"class\": { \"type\": \"string\" },\n \"employeeId\": { \"type\": \"integer\" },\n \"fullName\": { \"type\": \"string\" },\n \"office\": { \"type\": \"string\" },\n },\n } as any,\n {\n \"$apiName\": \"Employee\",\n \"$objectType\": \"Employee\",\n \"$primaryKey\": 50031,\n \"$title\": \"Jane Doe\",\n \"class\": \"Red\",\n \"employeeId\": 50031,\n \"fullName\": \"Jane Doe\",\n \"office\": \"NYC\",\n },\n ) as Osdk.Instance<\n Employee,\n never,\n \"class\" | \"employeeId\" | \"fullName\" | \"office\"\n >;\n\n const mergedEmployee = employee.$clone(updatedEmployee);\n\n expectTypeOf(mergedEmployee).toEqualTypeOf(employee);\n\n expect(mergedEmployee).toMatchInlineSnapshot(`\n {\n \"$apiName\": \"Employee\",\n \"$objectType\": \"Employee\",\n \"$primaryKey\": 50031,\n \"$title\": \"Jane Doe\",\n \"class\": \"Red\",\n \"employeeId\": 50031,\n \"employeeLocation\": GeotimeSeriesPropertyImpl {\n \"lastFetchedValue\": undefined,\n },\n \"employeeSensor\": TimeSeriesPropertyImpl {},\n \"employeeStatus\": TimeSeriesPropertyImpl {},\n \"fullName\": \"Jane Doe\",\n \"office\": \"NYC\",\n \"startDate\": \"2012-02-12\",\n }\n `);\n });\n\n it(\"correctly scopes up with another OSDK object\", async () => {\n const firstEmployee = { $clone: () => {} } as unknown as Osdk.Instance<\n Employee,\n never,\n \"class\"\n >;\n expectTypeOf(firstEmployee.$clone(employee)).toMatchTypeOf<\n Osdk.Instance<\n Employee,\n never,\n PropertyKeys<Employee>\n >\n >();\n });\n\n it(\"Correctly preserves keys from original and new with distinct property key sets\", async () => {\n const firstEmployee = { $clone: () => {} } as unknown as Osdk.Instance<\n Employee,\n never,\n \"class\"\n >;\n expectTypeOf(\n firstEmployee.$clone({} as Osdk.Instance<Employee, never, \"office\">),\n ).toMatchTypeOf<\n Osdk.Instance<\n Employee,\n never,\n \"class\" | \"office\"\n >\n >();\n });\n\n it(\"clones and updates an object with a record\", async () => {\n const mergedEmployee = employee.$clone({\n \"class\": \"Green\",\n \"employeeId\": 50031,\n \"fullName\": \"John Doe\",\n \"office\": \"SEA\",\n \"startDate\": \"2019-01-01\",\n });\n\n expect(mergedEmployee).toMatchInlineSnapshot(`\n {\n \"$apiName\": \"Employee\",\n \"$objectType\": \"Employee\",\n \"$primaryKey\": 50031,\n \"$title\": \"John Doe\",\n \"class\": \"Green\",\n \"employeeId\": 50031,\n \"employeeLocation\": GeotimeSeriesPropertyImpl {\n \"lastFetchedValue\": undefined,\n },\n \"employeeSensor\": TimeSeriesPropertyImpl {},\n \"employeeStatus\": TimeSeriesPropertyImpl {},\n \"fullName\": \"John Doe\",\n \"office\": \"SEA\",\n \"startDate\": \"2019-01-01\",\n }\n `);\n });\n\n it(\"correctly scopes up with a record\", async () => {\n const firstEmployee = { $clone: () => {} } as unknown as Osdk.Instance<\n Employee,\n never,\n \"class\"\n >;\n expectTypeOf(firstEmployee.$clone({\n \"class\": \"Green\",\n \"employeeId\": 50031,\n \"fullName\": \"John Doe\",\n \"office\": \"SEA\",\n \"startDate\": \"2019-01-01\",\n })).toMatchTypeOf<\n Osdk.Instance<\n Employee,\n never,\n \"class\" | \"employeeId\" | \"fullName\" | \"office\" | \"startDate\"\n >\n >();\n });\n\n it(\"correctly sets title\", async () => {\n const mergedEmployee = employee.$clone({\n \"fullName\": \"Brad Pitt\",\n });\n\n expect(mergedEmployee).toMatchInlineSnapshot(`\n {\n \"$apiName\": \"Employee\",\n \"$objectType\": \"Employee\",\n \"$primaryKey\": 50031,\n \"$title\": \"Brad Pitt\",\n \"class\": \"Blue\",\n \"employeeId\": 50031,\n \"employeeLocation\": GeotimeSeriesPropertyImpl {\n \"lastFetchedValue\": undefined,\n },\n \"employeeSensor\": TimeSeriesPropertyImpl {},\n \"employeeStatus\": TimeSeriesPropertyImpl {},\n \"fullName\": \"Brad Pitt\",\n \"office\": \"SEA\",\n \"startDate\": \"2012-02-12\",\n }\n `);\n });\n\n it(\"is able to clone with nothing passed in\", async () => {\n expect(employee.$clone()).toMatchObject({\n \"$apiName\": \"Employee\",\n \"$objectType\": \"Employee\",\n \"$primaryKey\": 50031,\n \"$title\": \"Jane Doe\",\n \"class\": \"Blue\",\n \"employeeId\": 50031,\n \"fullName\": \"Jane Doe\",\n \"office\": \"SEA\",\n \"startDate\": \"2012-02-12\",\n });\n });\n\n it(\"throws when merging objects with different primary keys\", async () => {\n expect(() =>\n employee.$clone({\n \"class\": \"Green\",\n \"employeeId\": 50035,\n })\n ).toThrow();\n });\n });\n});\n\nexport async function shouldError(client: Client): Promise<Osdk<Employee>> {\n // @ts-expect-error\n return client(Employee).fetchOne(1, {\n $select: [\"employeeId\"],\n });\n}\n\nexport async function shouldError2(\n client: Client,\n): Promise<Employee.OsdkObject> {\n // @ts-expect-error\n return client(Employee).fetchOne(1, {\n $select: [\"employeeId\"],\n });\n}\n\nexport async function shouldCompile_client_fetchOne_old_select(\n client: Client,\n): Promise<Osdk<Employee, \"employeeId\">> {\n return client(Employee).fetchOne(1, {\n $select: [\"employeeId\"],\n });\n}\n\nexport async function shouldCompile_unstableClient_fetchOne_old_select(\n client: Client,\n): Promise<Osdk<Employee, \"employeeId\">> {\n return client(Employee).fetchOne(1, {\n $select: [\"employeeId\"],\n });\n}\n\nexport async function shouldCompile_client_fetchOne_new_select(\n client: Client,\n): Promise<Employee.OsdkObject<never, \"employeeId\">> {\n return client(Employee).fetchOne(1, {\n $select: [\"employeeId\"],\n });\n}\n\nexport async function shouldCompile_unstableClient_fetchOne_new_select(\n client: Client,\n): Promise<Osdk<Employee, \"employeeId\">> {\n return client(Employee).fetchOne(1, {\n $select: [\"employeeId\"],\n });\n}\n\nexport async function shouldCompile_client_fetchOne_old_noArgs(\n client: Client,\n): Promise<Osdk<Employee>> {\n return client(Employee).fetchOne(1);\n}\n\nexport async function shouldCompile_unstableClient_fetchOne_noArgs(\n client: Client,\n): Promise<Osdk<Employee>> {\n return client(Employee).fetchOne(1);\n}\n"],"mappings":"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","ignoreList":[]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ObjectSetListenerWebsocket.test.js","names":["$ontologyRid","Employee","apiServer","ImportedWebSocket","http","HttpResponse","pDefer","afterAll","afterEach","beforeAll","beforeEach","describe","expect","it","vi","z","createMinimalClient","constructWebsocketUrl","ObjectSetListenerWebsocket","rootLogger","hoisted","pino","pinoPretty","EventEmitter","Promise","resolve","level","build","sync","timestampKey","undefined","errorLikeObjectKeys","errorProps","ignore","destination","write","a","at","slice","console","log","MockedWebSocket","STACK","mock","importOriginal","original","WebSocket","createMockWebSocketConstructor","default","currentSubscriptionId","listen","addLoggerToApiServer","close","minimalClient","MINIMUM_RECONNECT_DELAY","client","listener","oslwInst","updateReceived","listenerPromise","ontologyRid","logger","child","minimumReconnectDelayMs","onChange","fn","o","onError","onOutOfDate","onSuccessfulSubscription","objectSetRidCounter","use","post","json","objectSetRid","useFakeTimers","restoreAllMocks","resetHandlers","not","toHaveBeenCalled","ws","unsubscribe","subReq1","subscribeAndExpectWebSocket","expectSubscribeMessages","setWebSocketState","runAllTicks","expectEqualRemoveAndAddListeners","respondSuccessToSubscribe","send","toHaveBeenCalledTimes","requests","propertySet","toEqual","referenceSet","all","expectWebSocketConstructed","advanceTimersByTimeAsync","subReq2","mockImplementationOnce","Error","mockReset","calls","subscriptionClosed","toBe","idNum2","sendObjectUpdateResponse","promise","toMatchInlineSnapshot","sendReferenceUpdatesResponse","unsubscribe2","subscribe","type","apiName","objectType","toString","sendToClient","id","responses","subId","updates","state","object","__apiName","employeeId","removeEventListener","addEventListener","length","times","waitFor","toBeCalledTimes","result","JSON","parse","lastCall","mockClear","results","value","OriginalWebSocket","i","ret","_args","webSocketInst","debug","eventEmitter","EventTarget","bind","message","_eventEmitter","readyState","CONNECTING","Object","assign","OPEN","CLOSED","CLOSING","newState","dispatchEvent","Event","name","requestId","request","trace","url","eventNames","c","events","on","SubscribeMessage","string","array","objectSet","MessageEvent","constructor","data","stringify","t"],"sources":["ObjectSetListenerWebsocket.test.ts"],"sourcesContent":["/*\n * Copyright 2024 Palantir Technologies, Inc. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport type {\n ObjectOrInterfaceDefinition,\n ObjectSetListener,\n PropertyKeys,\n} from \"@osdk/api\";\nimport { $ontologyRid, Employee } from \"@osdk/client.test.ontology\";\nimport type {\n ObjectSetStreamSubscribeRequests,\n ObjectUpdate,\n StreamMessage,\n} from \"@osdk/internal.foundry.core\";\nimport { apiServer } from \"@osdk/shared.test\";\nimport ImportedWebSocket from \"isomorphic-ws\";\nimport { http, HttpResponse } from \"msw\";\nimport type { DeferredPromise } from \"p-defer\";\nimport pDefer from \"p-defer\";\nimport type { MockedClass, MockedFunction, MockedObject } from \"vitest\";\nimport {\n afterAll,\n afterEach,\n beforeAll,\n beforeEach,\n describe,\n expect,\n it,\n vi,\n} from \"vitest\";\nimport { z } from \"zod\";\nimport { createMinimalClient } from \"../createMinimalClient.js\";\nimport type { Logger } from \"../Logger.js\";\nimport type { MinimalClient } from \"../MinimalClientContext.js\";\nimport {\n constructWebsocketUrl,\n ObjectSetListenerWebsocket,\n} from \"./ObjectSetListenerWebsocket.js\";\n\n// it needs to be hoisted because its referenced from our mocked WebSocket\n// which must be hoisted to work\nconst rootLogger = await vi.hoisted(async (): Promise<Logger> => {\n const pino = (await import(\"pino\")).pino;\n const pinoPretty = await import(\"pino-pretty\");\n const { EventEmitter } = await import(\"node:events\");\n class PinoConsoleLogDestination extends EventEmitter {\n write(a: string) {\n // remove trailing newline since console.log adds one\n if (a.at(-1) === \"\\n\") a = a.slice(0, -1);\n\n // This lets the test framework aggregate the logs per test, whereas direct to stdout does not\n console.log(a);\n }\n }\n return Promise.resolve(pino(\n { level: \"info\" },\n (pinoPretty.build)({\n sync: true,\n timestampKey: undefined,\n errorLikeObjectKeys: [\"error\", \"err\", \"exception\"],\n errorProps: \"stack,cause,properties\",\n ignore: \"time,hostname,pid\",\n destination: new PinoConsoleLogDestination(),\n }),\n ));\n});\n\n// make local uses of WebSocket typed right\nconst MockedWebSocket = ImportedWebSocket as unknown as MockedWebSocket;\n\nconst STACK = \"https://stack.palantirCustom.com/foo/first/someStuff/\";\n\nvi.mock(\"isomorphic-ws\", async (importOriginal) => {\n const original = await importOriginal<\n { default: WebSocket }\n >();\n\n const WebSocket = createMockWebSocketConstructor(\n original.default,\n rootLogger,\n );\n return { default: WebSocket, WebSocket };\n});\n\nlet currentSubscriptionId = 0;\n\ndescribe(\"ObjectSetListenerWebsocket\", async () => {\n beforeAll(async () => {\n apiServer.listen();\n addLoggerToApiServer(rootLogger);\n });\n\n afterAll(() => {\n apiServer.close();\n });\n\n describe(\"basic setup\", () => {\n let minimalClient: MinimalClient;\n\n const MINIMUM_RECONNECT_DELAY = 2_000;\n const OBJECT_SET_EXPIRY_MS = 60_000;\n\n let client: ObjectSetListenerWebsocket;\n let listener: MockedObject<\n Required<\n ObjectSetListener<ObjectOrInterfaceDefinition, PropertyKeys<any>>\n >\n >;\n let oslwInst = 0;\n\n let updateReceived: ObjectUpdate | undefined = undefined;\n\n let listenerPromise: DeferredPromise<void>;\n\n beforeEach(() => {\n minimalClient = createMinimalClient(\n { ontologyRid: $ontologyRid },\n STACK,\n async () => \"myAccessToken\",\n { logger: rootLogger },\n );\n client = new ObjectSetListenerWebsocket({\n ...minimalClient,\n logger: rootLogger.child({ oslwInst: oslwInst++ }),\n }, {\n minimumReconnectDelayMs: MINIMUM_RECONNECT_DELAY,\n });\n\n listenerPromise = pDefer();\n\n listener = {\n onChange: vi.fn((o) => {\n updateReceived = o;\n listenerPromise.resolve();\n }),\n onError: vi.fn(),\n onOutOfDate: vi.fn(),\n onSuccessfulSubscription: vi.fn(),\n };\n\n let objectSetRidCounter = 0;\n apiServer.use(\n http.post(\n `${STACK}api/v2/ontologySubscriptions/ontologies/${$ontologyRid}/streamSubscriptions`,\n () =>\n HttpResponse.json({\n objectSetRid: `rid.hi.${objectSetRidCounter++}`,\n }),\n ),\n );\n\n vi.useFakeTimers();\n });\n\n afterEach(() => {\n vi.restoreAllMocks();\n apiServer.resetHandlers();\n });\n\n it(\"should not send onOutOfDate since it has not subscribed yet\", () => {\n expect(MockedWebSocket).not.toHaveBeenCalled();\n expect(listener.onOutOfDate).not.toHaveBeenCalled();\n expect(listener.onChange).not.toHaveBeenCalled();\n expect(listener.onError).not.toHaveBeenCalled();\n });\n\n describe(\"requests subscription\", () => {\n let ws: MockedWebSocket;\n let unsubscribe: () => void;\n let subReq1: ObjectSetStreamSubscribeRequests;\n\n beforeEach(async () => {\n [ws, unsubscribe] = await subscribeAndExpectWebSocket(\n client,\n listener,\n );\n\n subReq1 = await expectSubscribeMessages(ws, 2);\n });\n\n afterEach(() => {\n // just ensure we ended in good states, as we clear these as we consume them\n expect(MockedWebSocket).not.toHaveBeenCalled();\n\n // make sure we are unsubscribed so closing the socket doesn't trigger reconnects\n unsubscribe();\n\n // disconnect the socket\n setWebSocketState(ws, \"close\");\n\n vi.runAllTicks();\n\n // Make sure we cleaned up\n expectEqualRemoveAndAddListeners(ws);\n });\n\n it(\"only sends a single request\", async () => {\n respondSuccessToSubscribe(ws, subReq1);\n // actually this is broken FIXME\n unsubscribe();\n expect(ws.send).toHaveBeenCalledTimes(1);\n });\n\n it(\"correctly requests regular object properties\", () => {\n expect(subReq1.requests[0].propertySet).toEqual([\n \"employeeId\",\n \"fullName\",\n \"office\",\n \"class\",\n \"startDate\",\n \"employeeStatus\",\n \"employeeSensor\",\n ]);\n });\n\n it(\"correctly requests reference backed properties\", () => {\n expect(subReq1.requests[0].referenceSet).toEqual([\"employeeLocation\"]);\n });\n\n describe(\"socket closed before subscription confirmed\", () => {\n beforeEach(() => {\n setWebSocketState(ws, \"close\");\n expectEqualRemoveAndAddListeners(ws);\n });\n\n describe(\"reconnect\", async () => {\n beforeEach(async () => {\n [ws] = await Promise.all([\n expectWebSocketConstructed(),\n // delay for connection reconnect\n vi.advanceTimersByTimeAsync(MINIMUM_RECONNECT_DELAY),\n ]);\n setWebSocketState(ws, \"open\");\n });\n\n describe(\"subscribe and respond\", () => {\n beforeEach(async () => {\n const subReq2 = await expectSubscribeMessages(ws);\n respondSuccessToSubscribe(ws, subReq2);\n });\n\n it(\"should not send out of date\", () => {\n expect(listener.onOutOfDate).not.toHaveBeenCalled();\n });\n });\n });\n });\n\n describe(\"correctly try catches errors in handlers\", () => {\n beforeEach(() => {\n listener.onSuccessfulSubscription.mockImplementationOnce(() => {\n throw new Error(\"I am an error\");\n });\n respondSuccessToSubscribe(ws, subReq1);\n });\n afterEach(() => {\n listener.onSuccessfulSubscription.mockReset();\n });\n\n it(\"should call onError\", async () => {\n expect(listener.onError).toHaveBeenCalled();\n expect(listener.onError.mock.calls[0][0].subscriptionClosed).toBe(\n false,\n );\n });\n });\n\n describe(\"successfully subscribed\", () => {\n beforeEach(() => {\n respondSuccessToSubscribe(ws, subReq1);\n });\n\n it(\"should call onSuccessfulSubscription\", () => {\n expect(listener.onSuccessfulSubscription).toHaveBeenCalled();\n });\n\n it(\"should correctly return regular updates\", async () => {\n const idNum2 = currentSubscriptionId;\n\n sendObjectUpdateResponse(ws, `${idNum2}`);\n await listenerPromise.promise;\n expect(listener.onChange).toHaveBeenCalled();\n expect(updateReceived).toMatchInlineSnapshot(`\n {\n \"object\": {\n \"$apiName\": \"Employee\",\n \"$objectType\": \"Employee\",\n \"$primaryKey\": undefined,\n \"$title\": undefined,\n \"employeeId\": 1,\n },\n \"state\": \"ADDED_OR_UPDATED\",\n }\n `);\n });\n\n it(\"should correctly return reference update\", async () => {\n const idNum2 = currentSubscriptionId;\n\n sendReferenceUpdatesResponse(ws, `${idNum2}`);\n await listenerPromise.promise;\n expect(listener.onChange).toHaveBeenCalled();\n expect(updateReceived).toMatchInlineSnapshot(`\n {\n \"object\": {\n \"$apiName\": \"Employee\",\n \"$objectType\": \"Employee\",\n \"$primaryKey\": \"12345\",\n \"$title\": undefined,\n \"employeeId\": \"12345\",\n \"employeeLocation\": GeotimeSeriesPropertyImpl {\n \"lastFetchedValue\": {\n \"time\": \"111\",\n \"value\": {\n \"coordinates\": [\n 100,\n 200,\n ],\n \"type\": \"Point\",\n },\n },\n },\n },\n \"state\": \"ADDED_OR_UPDATED\",\n }\n `);\n });\n\n describe(\"additional subscription\", async () => {\n let unsubscribe2: () => void;\n let subReq2: ObjectSetStreamSubscribeRequests;\n beforeEach(async () => {\n unsubscribe2 = await client.subscribe(\n {\n type: \"object\",\n apiName: \"Employee\",\n },\n {\n type: \"base\",\n objectType: Employee.apiName,\n },\n listener,\n [\"employeeId\"],\n );\n\n subReq2 = await expectSubscribeMessages(ws);\n\n respondSuccessToSubscribe(ws, subReq2);\n });\n\n afterEach(() => {\n unsubscribe2();\n });\n\n it(\"only requests requested properties\", () => {\n expect(subReq2.requests[1].propertySet).toEqual([\"employeeId\"]);\n expect(subReq2.requests[1].referenceSet).toEqual([]);\n });\n\n it(\"does not trigger an out of date \", () => {\n expect(listener.onOutOfDate).not.toHaveBeenCalled();\n });\n });\n\n describe(\"socket closed abruptly\", () => {\n beforeEach(() => {\n setWebSocketState(ws, \"close\");\n expectEqualRemoveAndAddListeners(ws);\n });\n\n describe(\"reconnect, resubscribe successfully\", async () => {\n beforeEach(async () => {\n [ws] = await Promise.all([\n expectWebSocketConstructed(),\n // delay for connection reconnect\n vi.advanceTimersByTimeAsync(MINIMUM_RECONNECT_DELAY),\n ]);\n setWebSocketState(ws, \"open\");\n\n const subReq2 = await expectSubscribeMessages(ws);\n respondSuccessToSubscribe(ws, subReq2);\n });\n\n it(\"should send out of date\", () => {\n expect(listener.onOutOfDate).toHaveBeenCalledTimes(1);\n });\n });\n });\n\n it(\"should not send onOutOfDate for first call\", () => {\n expect(MockedWebSocket).not.toHaveBeenCalled();\n expect(listener.onOutOfDate).not.toHaveBeenCalled();\n expect(listener.onChange).not.toHaveBeenCalled();\n expect(listener.onError).not.toHaveBeenCalled();\n });\n\n it(\"should create url correctly\", () => {\n expect(constructWebsocketUrl(STACK, \"ontologyRid1\").toString())\n .toEqual(\n \"wss://stack.palantircustom.com/foo/first/someStuff/api/v2/ontologySubscriptions/ontologies/ontologyRid1/streamSubscriptions\",\n );\n });\n });\n });\n });\n});\n\ninterface RawWebSocketPlus\n extends Pick<ImportedWebSocket, \"addEventListener\" | \"removeEventListener\">\n{\n _eventEmitter: EventTarget;\n readyState: 0 | 1 | 2 | 3;\n send: MockedFunction<ImportedWebSocket[\"send\"]>;\n close: MockedFunction<ImportedWebSocket[\"close\"]>;\n}\n\ninterface MockedWebSocket\n extends MockedClass<typeof ImportedWebSocket>, MockedObject<RawWebSocketPlus>\n{\n}\n\ntype MockedListener = MockedObject<\n Required<\n ObjectSetListener<ObjectOrInterfaceDefinition, PropertyKeys<any>>\n >\n>;\n\nfunction respondSuccessToSubscribe(\n ws: MockedWebSocket,\n subReq2: ObjectSetStreamSubscribeRequests,\n) {\n sendToClient<StreamMessage>(\n ws,\n {\n id: subReq2.id,\n type: \"subscribeResponses\",\n responses: [{\n type: \"success\",\n id: `${++currentSubscriptionId}`,\n }],\n },\n );\n}\n\nfunction sendObjectUpdateResponse(\n ws: MockedWebSocket,\n subId: string,\n) {\n const updateMessage: StreamMessage = {\n type: \"objectSetChanged\",\n id: subId,\n updates: [{\n type: \"object\",\n state: \"ADDED_OR_UPDATED\",\n object: {\n __apiName: \"Employee\",\n employeeId: 1,\n },\n }],\n };\n\n sendToClient<StreamMessage>(\n ws,\n updateMessage,\n );\n}\n\nfunction sendReferenceUpdatesResponse(\n ws: MockedWebSocket,\n subId: string,\n) {\n const referenceUpdateMessage: StreamMessage = {\n type: \"objectSetChanged\",\n id: subId,\n updates: [{\n \"type\": \"reference\",\n \"objectType\": \"Employee\",\n \"primaryKey\": { \"employeeId\": \"12345\" },\n \"property\": \"employeeLocation\",\n \"value\": {\n \"timestamp\": \"111\",\n \"type\": \"geotimeSeriesValue\",\n \"position\": [100, 200],\n },\n }],\n };\n\n sendToClient<StreamMessage>(\n ws,\n referenceUpdateMessage,\n );\n}\n\nfunction expectEqualRemoveAndAddListeners(ws: MockedWebSocket) {\n expect(ws.removeEventListener).toHaveBeenCalledTimes(\n ws.addEventListener.mock.calls.length,\n );\n}\n\nasync function expectSubscribeMessages(\n ws: MockedWebSocket,\n times: number = 1,\n): Promise<ObjectSetStreamSubscribeRequests> {\n return await vi.waitFor(() => {\n expect(ws.send).toBeCalledTimes(times);\n const result = JSON.parse(ws.send.mock.lastCall![0].toString());\n ws.send.mockClear();\n return result;\n });\n}\n\nasync function subscribeAndExpectWebSocket(\n client: ObjectSetListenerWebsocket,\n listener: MockedListener,\n): Promise<readonly [MockedWebSocket, () => void]> {\n const [ws, unsubscribe] = await Promise.all([\n expectWebSocketConstructed(),\n client.subscribe<Employee, PropertyKeys<Employee>>(\n {\n apiName: \"Employee\",\n type: \"object\",\n },\n {\n type: \"base\",\n objectType: Employee.apiName,\n },\n listener,\n ),\n ]);\n\n // otherwise the ObjectSetListenerWebSocket is sitting waiting for it to \"connect\"\n setWebSocketState(ws, \"open\");\n\n return [ws, unsubscribe] as const;\n}\n\nasync function expectWebSocketConstructed(): Promise<MockedWebSocket> {\n expect(MockedWebSocket).toHaveBeenCalledTimes(0);\n\n const ws = await vi.waitFor(() => {\n expect(MockedWebSocket).toHaveBeenCalled();\n expect(MockedWebSocket.mock.results[0].type === \"return\");\n return MockedWebSocket.mock.results[0].value as MockedWebSocket;\n });\n\n expect(MockedWebSocket).toHaveBeenCalledTimes(1);\n MockedWebSocket.mockClear();\n expect(MockedWebSocket).toHaveBeenCalledTimes(0);\n\n return ws;\n}\n\nfunction createMockWebSocketConstructor(\n OriginalWebSocket: WebSocket,\n logger: Logger,\n): MockedWebSocket {\n let i = 0;\n const ret = vi.fn(function(..._args: any[]): MockedWebSocket {\n const webSocketInst = i++;\n logger.debug(\"WebSocket constructor called\");\n const eventEmitter = new EventTarget();\n\n return {\n addEventListener: vi.fn(\n eventEmitter.addEventListener.bind(eventEmitter),\n ) as any,\n removeEventListener: vi.fn(\n eventEmitter.removeEventListener.bind(eventEmitter),\n ) as any,\n\n send: vi.fn((a, _b: any) => {\n logger.debug(\n { message: JSON.parse(a.toString()), webSocketInst },\n \"send() called\",\n );\n }),\n close: vi.fn(),\n _eventEmitter: eventEmitter,\n readyState: OriginalWebSocket.CONNECTING,\n } satisfies RawWebSocketPlus as any as MockedWebSocket;\n // ^ we only implement some things but the type system wants to think its the full deal,\n // thus the satisfies plus the cast\n }) as any as MockedWebSocket;\n\n Object.assign(ret, {\n OPEN: OriginalWebSocket.OPEN,\n CLOSED: OriginalWebSocket.CLOSED,\n CLOSING: OriginalWebSocket.CLOSING,\n CONNECTING: OriginalWebSocket.CONNECTING,\n });\n\n return ret;\n}\n\nfunction setWebSocketState(ws: MockedWebSocket, readyState: \"open\" | \"close\") {\n const newState = readyState === \"open\"\n ? ImportedWebSocket.OPEN\n : ImportedWebSocket.CLOSED;\n\n if (newState === ws.readyState) return;\n\n ws.readyState = newState;\n ws._eventEmitter.dispatchEvent(new Event(readyState, {}));\n}\n\nfunction addLoggerToApiServer(logger: Logger) {\n const z = (\n name: string,\n { requestId, request }: { requestId: string; request: Request },\n ) => logger.trace({ requestId, url: request.url }, name);\n\n const eventNames = [\n \"request:start\",\n \"request:match\",\n \"request:end\",\n \"request:unhandled\",\n \"response:bypass\",\n \"response:mocked\",\n ] as const;\n\n for (const c of eventNames) {\n apiServer.events.on(c as typeof eventNames[number], z.bind(undefined, c));\n }\n}\n\nconst SubscribeMessage = z.object({\n id: z.string(),\n requests: z.array(z.object({\n objectSet: z.object({ id: z.string() }),\n propertySet: z.array(z.string()),\n referenceSet: z.array(z.string()),\n })),\n});\n\nclass MessageEvent extends Event {\n data: string;\n constructor(data: any) {\n super(\"message\");\n this.data = JSON.stringify(data);\n }\n}\n\nfunction sendToClient<T>(ws: MockedWebSocket, t: T) {\n ws._eventEmitter.dispatchEvent(new MessageEvent(t));\n}\n"],"mappings":"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","ignoreList":[]}
|
|
1
|
+
{"version":3,"file":"ObjectSetListenerWebsocket.test.js","names":["$ontologyRid","Employee","apiServer","ImportedWebSocket","http","HttpResponse","pDefer","afterAll","afterEach","beforeAll","beforeEach","describe","expect","it","vi","z","createMinimalClient","constructWebsocketUrl","ObjectSetListenerWebsocket","rootLogger","hoisted","pino","pinoPretty","EventEmitter","Promise","resolve","level","build","sync","timestampKey","undefined","errorLikeObjectKeys","errorProps","ignore","destination","write","a","at","slice","console","log","MockedWebSocket","STACK","mock","importOriginal","original","WebSocket","createMockWebSocketConstructor","default","currentSubscriptionId","listen","addLoggerToApiServer","close","minimalClient","MINIMUM_RECONNECT_DELAY","client","listener","oslwInst","updateReceived","listenerPromise","ontologyRid","logger","child","minimumReconnectDelayMs","onChange","fn","o","onError","onOutOfDate","onSuccessfulSubscription","objectSetRidCounter","use","post","json","objectSetRid","useFakeTimers","restoreAllMocks","resetHandlers","not","toHaveBeenCalled","ws","unsubscribe","subReq1","subscribeAndExpectWebSocket","expectSubscribeMessages","setWebSocketState","runAllTicks","expectEqualRemoveAndAddListeners","respondSuccessToSubscribe","send","toHaveBeenCalledTimes","requests","propertySet","toEqual","referenceSet","all","expectWebSocketConstructed","advanceTimersByTimeAsync","subReq2","mockImplementationOnce","Error","mockReset","calls","subscriptionClosed","toBe","idNum2","sendObjectUpdateResponse","promise","toMatchInlineSnapshot","sendReferenceUpdatesResponse","unsubscribe2","subscribe","type","apiName","objectType","toString","sendToClient","id","responses","subId","updates","state","object","__apiName","employeeId","removeEventListener","addEventListener","length","times","waitFor","toBeCalledTimes","result","JSON","parse","lastCall","mockClear","results","value","OriginalWebSocket","i","ret","_args","webSocketInst","debug","eventEmitter","EventTarget","bind","message","_eventEmitter","readyState","CONNECTING","Object","assign","OPEN","CLOSED","CLOSING","newState","dispatchEvent","Event","name","requestId","request","trace","url","eventNames","c","events","on","SubscribeMessage","string","array","objectSet","MessageEvent","constructor","data","stringify","t"],"sources":["ObjectSetListenerWebsocket.test.ts"],"sourcesContent":["/*\n * Copyright 2024 Palantir Technologies, Inc. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport type { ObjectSetListener, PropertyKeys } from \"@osdk/api\";\nimport { $ontologyRid, Employee } from \"@osdk/client.test.ontology\";\nimport type {\n ObjectSetStreamSubscribeRequests,\n ObjectUpdate,\n StreamMessage,\n} from \"@osdk/internal.foundry.core\";\nimport { apiServer } from \"@osdk/shared.test\";\nimport ImportedWebSocket from \"isomorphic-ws\";\nimport { http, HttpResponse } from \"msw\";\nimport type { DeferredPromise } from \"p-defer\";\nimport pDefer from \"p-defer\";\nimport type { MockedClass, MockedFunction, MockedObject } from \"vitest\";\nimport {\n afterAll,\n afterEach,\n beforeAll,\n beforeEach,\n describe,\n expect,\n it,\n vi,\n} from \"vitest\";\nimport { z } from \"zod\";\nimport { createMinimalClient } from \"../createMinimalClient.js\";\nimport type { Logger } from \"../Logger.js\";\nimport type { MinimalClient } from \"../MinimalClientContext.js\";\nimport {\n constructWebsocketUrl,\n ObjectSetListenerWebsocket,\n} from \"./ObjectSetListenerWebsocket.js\";\n\n// it needs to be hoisted because its referenced from our mocked WebSocket\n// which must be hoisted to work\nconst rootLogger = await vi.hoisted(async (): Promise<Logger> => {\n const pino = (await import(\"pino\")).pino;\n const pinoPretty = await import(\"pino-pretty\");\n const { EventEmitter } = await import(\"node:events\");\n class PinoConsoleLogDestination extends EventEmitter {\n write(a: string) {\n // remove trailing newline since console.log adds one\n if (a.at(-1) === \"\\n\") a = a.slice(0, -1);\n\n // This lets the test framework aggregate the logs per test, whereas direct to stdout does not\n console.log(a);\n }\n }\n return Promise.resolve(pino(\n { level: \"info\" },\n (pinoPretty.build)({\n sync: true,\n timestampKey: undefined,\n errorLikeObjectKeys: [\"error\", \"err\", \"exception\"],\n errorProps: \"stack,cause,properties\",\n ignore: \"time,hostname,pid\",\n destination: new PinoConsoleLogDestination(),\n }),\n ));\n});\n\n// make local uses of WebSocket typed right\nconst MockedWebSocket = ImportedWebSocket as unknown as MockedWebSocket;\n\nconst STACK = \"https://stack.palantirCustom.com/foo/first/someStuff/\";\n\nvi.mock(\"isomorphic-ws\", async (importOriginal) => {\n const original = await importOriginal<\n { default: WebSocket }\n >();\n\n const WebSocket = createMockWebSocketConstructor(\n original.default,\n rootLogger,\n );\n return { default: WebSocket, WebSocket };\n});\n\nlet currentSubscriptionId = 0;\n\ndescribe(\"ObjectSetListenerWebsocket\", async () => {\n beforeAll(async () => {\n apiServer.listen();\n addLoggerToApiServer(rootLogger);\n });\n\n afterAll(() => {\n apiServer.close();\n });\n\n describe(\"basic setup\", () => {\n let minimalClient: MinimalClient;\n\n const MINIMUM_RECONNECT_DELAY = 2_000;\n const OBJECT_SET_EXPIRY_MS = 60_000;\n\n let client: ObjectSetListenerWebsocket;\n let listener: MockedObject<\n Required<\n ObjectSetListener<Employee, any>\n >\n >;\n let oslwInst = 0;\n\n let updateReceived: ObjectUpdate | undefined = undefined;\n\n let listenerPromise: DeferredPromise<void>;\n\n beforeEach(() => {\n minimalClient = createMinimalClient(\n { ontologyRid: $ontologyRid },\n STACK,\n async () => \"myAccessToken\",\n { logger: rootLogger },\n );\n client = new ObjectSetListenerWebsocket({\n ...minimalClient,\n logger: rootLogger.child({ oslwInst: oslwInst++ }),\n }, {\n minimumReconnectDelayMs: MINIMUM_RECONNECT_DELAY,\n });\n\n listenerPromise = pDefer();\n\n listener = {\n onChange: vi.fn((o) => {\n updateReceived = o;\n listenerPromise.resolve();\n }),\n onError: vi.fn(),\n onOutOfDate: vi.fn(),\n onSuccessfulSubscription: vi.fn(),\n };\n\n let objectSetRidCounter = 0;\n apiServer.use(\n http.post(\n `${STACK}api/v2/ontologySubscriptions/ontologies/${$ontologyRid}/streamSubscriptions`,\n () =>\n HttpResponse.json({\n objectSetRid: `rid.hi.${objectSetRidCounter++}`,\n }),\n ),\n );\n\n vi.useFakeTimers();\n });\n\n afterEach(() => {\n vi.restoreAllMocks();\n apiServer.resetHandlers();\n });\n\n it(\"should not send onOutOfDate since it has not subscribed yet\", () => {\n expect(MockedWebSocket).not.toHaveBeenCalled();\n expect(listener.onOutOfDate).not.toHaveBeenCalled();\n expect(listener.onChange).not.toHaveBeenCalled();\n expect(listener.onError).not.toHaveBeenCalled();\n });\n\n describe(\"requests subscription\", () => {\n let ws: MockedWebSocket;\n let unsubscribe: () => void;\n let subReq1: ObjectSetStreamSubscribeRequests;\n\n beforeEach(async () => {\n [ws, unsubscribe] = await subscribeAndExpectWebSocket(\n client,\n listener,\n );\n\n subReq1 = await expectSubscribeMessages(ws, 2);\n });\n\n afterEach(() => {\n // just ensure we ended in good states, as we clear these as we consume them\n expect(MockedWebSocket).not.toHaveBeenCalled();\n\n // make sure we are unsubscribed so closing the socket doesn't trigger reconnects\n unsubscribe();\n\n // disconnect the socket\n setWebSocketState(ws, \"close\");\n\n vi.runAllTicks();\n\n // Make sure we cleaned up\n expectEqualRemoveAndAddListeners(ws);\n });\n\n it(\"only sends a single request\", async () => {\n respondSuccessToSubscribe(ws, subReq1);\n // actually this is broken FIXME\n unsubscribe();\n expect(ws.send).toHaveBeenCalledTimes(1);\n });\n\n it(\"correctly requests regular object properties\", () => {\n expect(subReq1.requests[0].propertySet).toEqual([\n \"employeeId\",\n \"fullName\",\n \"office\",\n \"class\",\n \"startDate\",\n \"employeeStatus\",\n \"employeeSensor\",\n ]);\n });\n\n it(\"correctly requests reference backed properties\", () => {\n expect(subReq1.requests[0].referenceSet).toEqual([\"employeeLocation\"]);\n });\n\n describe(\"socket closed before subscription confirmed\", () => {\n beforeEach(() => {\n setWebSocketState(ws, \"close\");\n expectEqualRemoveAndAddListeners(ws);\n });\n\n describe(\"reconnect\", async () => {\n beforeEach(async () => {\n [ws] = await Promise.all([\n expectWebSocketConstructed(),\n // delay for connection reconnect\n vi.advanceTimersByTimeAsync(MINIMUM_RECONNECT_DELAY),\n ]);\n setWebSocketState(ws, \"open\");\n });\n\n describe(\"subscribe and respond\", () => {\n beforeEach(async () => {\n const subReq2 = await expectSubscribeMessages(ws);\n respondSuccessToSubscribe(ws, subReq2);\n });\n\n it(\"should not send out of date\", () => {\n expect(listener.onOutOfDate).not.toHaveBeenCalled();\n });\n });\n });\n });\n\n describe(\"correctly try catches errors in handlers\", () => {\n beforeEach(() => {\n listener.onSuccessfulSubscription.mockImplementationOnce(() => {\n throw new Error(\"I am an error\");\n });\n respondSuccessToSubscribe(ws, subReq1);\n });\n afterEach(() => {\n listener.onSuccessfulSubscription.mockReset();\n });\n\n it(\"should call onError\", async () => {\n expect(listener.onError).toHaveBeenCalled();\n expect(listener.onError.mock.calls[0][0].subscriptionClosed).toBe(\n false,\n );\n });\n });\n\n describe(\"successfully subscribed\", () => {\n beforeEach(() => {\n respondSuccessToSubscribe(ws, subReq1);\n });\n\n it(\"should call onSuccessfulSubscription\", () => {\n expect(listener.onSuccessfulSubscription).toHaveBeenCalled();\n });\n\n it(\"should correctly return regular updates\", async () => {\n const idNum2 = currentSubscriptionId;\n\n sendObjectUpdateResponse(ws, `${idNum2}`);\n await listenerPromise.promise;\n expect(listener.onChange).toHaveBeenCalled();\n expect(updateReceived).toMatchInlineSnapshot(`\n {\n \"object\": {\n \"$apiName\": \"Employee\",\n \"$objectType\": \"Employee\",\n \"$primaryKey\": undefined,\n \"$title\": undefined,\n \"employeeId\": 1,\n },\n \"state\": \"ADDED_OR_UPDATED\",\n }\n `);\n });\n\n it(\"should correctly return reference update\", async () => {\n const idNum2 = currentSubscriptionId;\n\n sendReferenceUpdatesResponse(ws, `${idNum2}`);\n await listenerPromise.promise;\n expect(listener.onChange).toHaveBeenCalled();\n expect(updateReceived).toMatchInlineSnapshot(`\n {\n \"object\": {\n \"$apiName\": \"Employee\",\n \"$objectType\": \"Employee\",\n \"$primaryKey\": \"12345\",\n \"$title\": undefined,\n \"employeeId\": \"12345\",\n \"employeeLocation\": GeotimeSeriesPropertyImpl {\n \"lastFetchedValue\": {\n \"time\": \"111\",\n \"value\": {\n \"coordinates\": [\n 100,\n 200,\n ],\n \"type\": \"Point\",\n },\n },\n },\n },\n \"state\": \"ADDED_OR_UPDATED\",\n }\n `);\n });\n\n describe(\"additional subscription\", async () => {\n let unsubscribe2: () => void;\n let subReq2: ObjectSetStreamSubscribeRequests;\n beforeEach(async () => {\n unsubscribe2 = await client.subscribe(\n {\n type: \"object\",\n apiName: \"Employee\",\n },\n {\n type: \"base\",\n objectType: Employee.apiName,\n },\n listener,\n [\"employeeId\"],\n );\n\n subReq2 = await expectSubscribeMessages(ws);\n\n respondSuccessToSubscribe(ws, subReq2);\n });\n\n afterEach(() => {\n unsubscribe2();\n });\n\n it(\"only requests requested properties\", () => {\n expect(subReq2.requests[1].propertySet).toEqual([\"employeeId\"]);\n expect(subReq2.requests[1].referenceSet).toEqual([]);\n });\n\n it(\"does not trigger an out of date \", () => {\n expect(listener.onOutOfDate).not.toHaveBeenCalled();\n });\n });\n\n describe(\"socket closed abruptly\", () => {\n beforeEach(() => {\n setWebSocketState(ws, \"close\");\n expectEqualRemoveAndAddListeners(ws);\n });\n\n describe(\"reconnect, resubscribe successfully\", async () => {\n beforeEach(async () => {\n [ws] = await Promise.all([\n expectWebSocketConstructed(),\n // delay for connection reconnect\n vi.advanceTimersByTimeAsync(MINIMUM_RECONNECT_DELAY),\n ]);\n setWebSocketState(ws, \"open\");\n\n const subReq2 = await expectSubscribeMessages(ws);\n respondSuccessToSubscribe(ws, subReq2);\n });\n\n it(\"should send out of date\", () => {\n expect(listener.onOutOfDate).toHaveBeenCalledTimes(1);\n });\n });\n });\n\n it(\"should not send onOutOfDate for first call\", () => {\n expect(MockedWebSocket).not.toHaveBeenCalled();\n expect(listener.onOutOfDate).not.toHaveBeenCalled();\n expect(listener.onChange).not.toHaveBeenCalled();\n expect(listener.onError).not.toHaveBeenCalled();\n });\n\n it(\"should create url correctly\", () => {\n expect(constructWebsocketUrl(STACK, \"ontologyRid1\").toString())\n .toEqual(\n \"wss://stack.palantircustom.com/foo/first/someStuff/api/v2/ontologySubscriptions/ontologies/ontologyRid1/streamSubscriptions\",\n );\n });\n });\n });\n });\n});\n\ninterface RawWebSocketPlus\n extends Pick<ImportedWebSocket, \"addEventListener\" | \"removeEventListener\">\n{\n _eventEmitter: EventTarget;\n readyState: 0 | 1 | 2 | 3;\n send: MockedFunction<ImportedWebSocket[\"send\"]>;\n close: MockedFunction<ImportedWebSocket[\"close\"]>;\n}\n\ninterface MockedWebSocket\n extends MockedClass<typeof ImportedWebSocket>, MockedObject<RawWebSocketPlus>\n{\n}\n\ntype MockedListener = MockedObject<\n Required<\n ObjectSetListener<Employee, PropertyKeys<Employee>>\n >\n>;\n\nfunction respondSuccessToSubscribe(\n ws: MockedWebSocket,\n subReq2: ObjectSetStreamSubscribeRequests,\n) {\n sendToClient<StreamMessage>(\n ws,\n {\n id: subReq2.id,\n type: \"subscribeResponses\",\n responses: [{\n type: \"success\",\n id: `${++currentSubscriptionId}`,\n }],\n },\n );\n}\n\nfunction sendObjectUpdateResponse(\n ws: MockedWebSocket,\n subId: string,\n) {\n const updateMessage: StreamMessage = {\n type: \"objectSetChanged\",\n id: subId,\n updates: [{\n type: \"object\",\n state: \"ADDED_OR_UPDATED\",\n object: {\n __apiName: \"Employee\",\n employeeId: 1,\n },\n }],\n };\n\n sendToClient<StreamMessage>(\n ws,\n updateMessage,\n );\n}\n\nfunction sendReferenceUpdatesResponse(\n ws: MockedWebSocket,\n subId: string,\n) {\n const referenceUpdateMessage: StreamMessage = {\n type: \"objectSetChanged\",\n id: subId,\n updates: [{\n \"type\": \"reference\",\n \"objectType\": \"Employee\",\n \"primaryKey\": { \"employeeId\": \"12345\" },\n \"property\": \"employeeLocation\",\n \"value\": {\n \"timestamp\": \"111\",\n \"type\": \"geotimeSeriesValue\",\n \"position\": [100, 200],\n },\n }],\n };\n\n sendToClient<StreamMessage>(\n ws,\n referenceUpdateMessage,\n );\n}\n\nfunction expectEqualRemoveAndAddListeners(ws: MockedWebSocket) {\n expect(ws.removeEventListener).toHaveBeenCalledTimes(\n ws.addEventListener.mock.calls.length,\n );\n}\n\nasync function expectSubscribeMessages(\n ws: MockedWebSocket,\n times: number = 1,\n): Promise<ObjectSetStreamSubscribeRequests> {\n return await vi.waitFor(() => {\n expect(ws.send).toBeCalledTimes(times);\n const result = JSON.parse(ws.send.mock.lastCall![0].toString());\n ws.send.mockClear();\n return result;\n });\n}\n\nasync function subscribeAndExpectWebSocket(\n client: ObjectSetListenerWebsocket,\n listener: MockedListener,\n): Promise<readonly [MockedWebSocket, () => void]> {\n const [ws, unsubscribe] = await Promise.all([\n expectWebSocketConstructed(),\n client.subscribe<Employee, PropertyKeys<Employee>>(\n {\n apiName: \"Employee\",\n type: \"object\",\n },\n {\n type: \"base\",\n objectType: Employee.apiName,\n },\n listener,\n ),\n ]);\n\n // otherwise the ObjectSetListenerWebSocket is sitting waiting for it to \"connect\"\n setWebSocketState(ws, \"open\");\n\n return [ws, unsubscribe] as const;\n}\n\nasync function expectWebSocketConstructed(): Promise<MockedWebSocket> {\n expect(MockedWebSocket).toHaveBeenCalledTimes(0);\n\n const ws = await vi.waitFor(() => {\n expect(MockedWebSocket).toHaveBeenCalled();\n expect(MockedWebSocket.mock.results[0].type === \"return\");\n return MockedWebSocket.mock.results[0].value as MockedWebSocket;\n });\n\n expect(MockedWebSocket).toHaveBeenCalledTimes(1);\n MockedWebSocket.mockClear();\n expect(MockedWebSocket).toHaveBeenCalledTimes(0);\n\n return ws;\n}\n\nfunction createMockWebSocketConstructor(\n OriginalWebSocket: WebSocket,\n logger: Logger,\n): MockedWebSocket {\n let i = 0;\n const ret = vi.fn(function(..._args: any[]): MockedWebSocket {\n const webSocketInst = i++;\n logger.debug(\"WebSocket constructor called\");\n const eventEmitter = new EventTarget();\n\n return {\n addEventListener: vi.fn(\n eventEmitter.addEventListener.bind(eventEmitter),\n ) as any,\n removeEventListener: vi.fn(\n eventEmitter.removeEventListener.bind(eventEmitter),\n ) as any,\n\n send: vi.fn((a, _b: any) => {\n logger.debug(\n { message: JSON.parse(a.toString()), webSocketInst },\n \"send() called\",\n );\n }),\n close: vi.fn(),\n _eventEmitter: eventEmitter,\n readyState: OriginalWebSocket.CONNECTING,\n } satisfies RawWebSocketPlus as any as MockedWebSocket;\n // ^ we only implement some things but the type system wants to think its the full deal,\n // thus the satisfies plus the cast\n }) as any as MockedWebSocket;\n\n Object.assign(ret, {\n OPEN: OriginalWebSocket.OPEN,\n CLOSED: OriginalWebSocket.CLOSED,\n CLOSING: OriginalWebSocket.CLOSING,\n CONNECTING: OriginalWebSocket.CONNECTING,\n });\n\n return ret;\n}\n\nfunction setWebSocketState(ws: MockedWebSocket, readyState: \"open\" | \"close\") {\n const newState = readyState === \"open\"\n ? ImportedWebSocket.OPEN\n : ImportedWebSocket.CLOSED;\n\n if (newState === ws.readyState) return;\n\n ws.readyState = newState;\n ws._eventEmitter.dispatchEvent(new Event(readyState, {}));\n}\n\nfunction addLoggerToApiServer(logger: Logger) {\n const z = (\n name: string,\n { requestId, request }: { requestId: string; request: Request },\n ) => logger.trace({ requestId, url: request.url }, name);\n\n const eventNames = [\n \"request:start\",\n \"request:match\",\n \"request:end\",\n \"request:unhandled\",\n \"response:bypass\",\n \"response:mocked\",\n ] as const;\n\n for (const c of eventNames) {\n apiServer.events.on(c as typeof eventNames[number], z.bind(undefined, c));\n }\n}\n\nconst SubscribeMessage = z.object({\n id: z.string(),\n requests: z.array(z.object({\n objectSet: z.object({ id: z.string() }),\n propertySet: z.array(z.string()),\n referenceSet: z.array(z.string()),\n })),\n});\n\nclass MessageEvent extends Event {\n data: string;\n constructor(data: any) {\n super(\"message\");\n this.data = JSON.stringify(data);\n }\n}\n\nfunction sendToClient<T>(ws: MockedWebSocket, t: T) {\n ws._eventEmitter.dispatchEvent(new MessageEvent(t));\n}\n"],"mappings":"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","ignoreList":[]}
|